ZGlmZiAtLWdpdCBhL0VQUGx1cy9Db21wYXRpYmlsaXR5L0ltYWdlQ29tcGF0LmNzIGIvRVBQbHVzL0NvbXBhdGliaWxpdHkvSW1hZ2VDb21wYXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwZWVmMwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db21wYXRpYmlsaXR5L0ltYWdlQ29tcGF0LmNzCkBAIC0wLDAgKzEsNDAgQEAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uRHJhd2luZy5JbWFnaW5nOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29tcGF0aWJpbGl0eQoreworICAgIGludGVybmFsIGNsYXNzIEltYWdlQ29tcGF0CisgICAgeworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIEdldEltYWdlQXNCeXRlQXJyYXkoSW1hZ2UgaW1hZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIGlmIChpbWFnZS5SYXdGb3JtYXQuR3VpZCA9PSBJbWFnZUZvcm1hdC5HaWYuR3VpZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbWFnZS5TYXZlKG1zLCBJbWFnZUZvcm1hdC5HaWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaW1hZ2UuUmF3Rm9ybWF0Lkd1aWQgPT0gSW1hZ2VGb3JtYXQuQm1wLkd1aWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW1hZ2UuU2F2ZShtcywgSW1hZ2VGb3JtYXQuQm1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGltYWdlLlJhd0Zvcm1hdC5HdWlkID09IEltYWdlRm9ybWF0LlBuZy5HdWlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGltYWdlLlNhdmUobXMsIEltYWdlRm9ybWF0LlBuZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChpbWFnZS5SYXdGb3JtYXQuR3VpZCA9PSBJbWFnZUZvcm1hdC5UaWZmLkd1aWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW1hZ2UuU2F2ZShtcywgSW1hZ2VGb3JtYXQuVGlmZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW1hZ2UuU2F2ZShtcywgSW1hZ2VGb3JtYXQuSnBlZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBtcy5Ub0FycmF5KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9FeGNlbFBpY3R1cmUuY3MgYi9FUFBsdXMvRHJhd2luZy9FeGNlbFBpY3R1cmUuY3MKaW5kZXggMzY4YThiNC4uNTllOGNmMSAxMDA2NDQKLS0tIGEvRVBQbHVzL0RyYXdpbmcvRXhjZWxQaWN0dXJlLmNzCisrKyBiL0VQUGx1cy9EcmF3aW5nL0V4Y2VsUGljdHVyZS5jcwpAQCAtMTMsMTcgKzEzLDE3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCkBAIC0zOCw2ICszOCw3IEBACiB1c2luZyBTeXN0ZW0uRHJhd2luZzsKIHVzaW5nIFN5c3RlbS5EcmF3aW5nLkltYWdpbmc7CiB1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbXBhdGliaWxpdHk7CiB1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCiBuYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nCkBAIC02MSw4ICs2MiwxMiBAQAogICAgICAgICAgICAgICAgIEZpbGVJbmZvIGYgPSBuZXcgRmlsZUluZm8oVXJpUGljLk9yaWdpbmFsU3RyaW5nKTsKICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9IEdldENvbnRlbnRUeXBlKGYuRXh0ZW5zaW9uKTsKICAgICAgICAgICAgICAgICBfaW1hZ2UgPSBJbWFnZS5Gcm9tU3RyZWFtKFBhcnQuR2V0U3RyZWFtKCkpOworI2lmIChDb3JlKQorICAgICAgICAgICAgICAgIGJ5dGVbXSBpYnkgPSBJbWFnZUNvbXBhdC5HZXRJbWFnZUFzQnl0ZUFycmF5KF9pbWFnZSk7CisjZWxzZQogICAgICAgICAgICAgICAgIEltYWdlQ29udmVydGVyIGljPW5ldyBJbWFnZUNvbnZlcnRlcigpOwogICAgICAgICAgICAgICAgIHZhciBpYnk9KGJ5dGVbXSlpYy5Db252ZXJ0VG8oX2ltYWdlLCB0eXBlb2YoYnl0ZVtdKSk7CisjZW5kaWYKICAgICAgICAgICAgICAgICB2YXIgaWkgPSBfZHJhd2luZ3MuX3BhY2thZ2UuTG9hZEltYWdlKGlieSwgVXJpUGljLCBQYXJ0KTsKICAgICAgICAgICAgICAgICBJbWFnZUhhc2ggPSBpaS5IYXNoOwogCkBAIC0xMjYsOCArMTMxLDEyIEBACiAgICAgICAgICAgICBDb250ZW50VHlwZSA9IEdldENvbnRlbnRUeXBlKGltYWdlRmlsZS5FeHRlbnNpb24pOwogICAgICAgICAgICAgdmFyIGltYWdlc3RyZWFtID0gbmV3IEZpbGVTdHJlYW0oaW1hZ2VGaWxlLkZ1bGxOYW1lLCBGaWxlTW9kZS5PcGVuLCBGaWxlQWNjZXNzLlJlYWQpOwogICAgICAgICAgICAgX2ltYWdlID0gSW1hZ2UuRnJvbVN0cmVhbShpbWFnZXN0cmVhbSk7CisjaWYgKENvcmUpCisgICAgICAgICAgICB2YXIgaW1nPUltYWdlQ29tcGF0LkdldEltYWdlQXNCeXRlQXJyYXkoX2ltYWdlKTsKKyNlbHNlCiAgICAgICAgICAgICBJbWFnZUNvbnZlcnRlciBpYyA9IG5ldyBJbWFnZUNvbnZlcnRlcigpOwogICAgICAgICAgICAgdmFyIGltZyA9IChieXRlW10paWMuQ29udmVydFRvKF9pbWFnZSwgdHlwZW9mKGJ5dGVbXSkpOworI2VuZGlmCiAgICAgICAgICAgICBpbWFnZXN0cmVhbS5DbG9zZSgpOwogCiAgICAgICAgICAgICBVcmlQaWMgPSBHZXROZXdVcmkocGFja2FnZSwgIi94bC9tZWRpYS97MH0iICsgaW1hZ2VGaWxlLk5hbWUpOwpAQCAtMTk4LDggKzIwNywxMiBAQAogICAgICAgICAjZW5kcmVnaW9uCiAgICAgICAgIHByaXZhdGUgc3RyaW5nIFNhdmVQaWN0dXJlKEltYWdlIGltYWdlKQogICAgICAgICB7CisjaWYgKENvcmUpCisgICAgICAgICAgICBieXRlW10gaW1nID0gSW1hZ2VDb21wYXQuR2V0SW1hZ2VBc0J5dGVBcnJheShpbWFnZSk7CisjZWxzZQogICAgICAgICAgICAgSW1hZ2VDb252ZXJ0ZXIgaWMgPSBuZXcgSW1hZ2VDb252ZXJ0ZXIoKTsKICAgICAgICAgICAgIGJ5dGVbXSBpbWcgPSAoYnl0ZVtdKWljLkNvbnZlcnRUbyhpbWFnZSwgdHlwZW9mKGJ5dGVbXSkpOworI2VuZGlmCiAgICAgICAgICAgICB2YXIgaWkgPSBfZHJhd2luZ3MuX3BhY2thZ2UuQWRkSW1hZ2UoaW1nKTsKIAogICAgICAgICAgICAgSW1hZ2VIYXNoID0gaWkuSGFzaDsKQEAgLTIxOCw3ICsyMzEsNyBAQAogCiAgICAgICAgICAgICAvL1NldCB0aGUgSW1hZ2UgYW5kIHNhdmUgaXQgdG8gdGhlIHBhY2thZ2UuCiAgICAgICAgICAgICBSZWxQaWMgPSBfZHJhd2luZ3MuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKF9kcmF3aW5ncy5VcmlEcmF3aW5nLCBVcmlQaWMpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL2ltYWdlIik7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgLy9BZGROZXdQaWN0dXJlKGltZywgcGljUmVsYXRpb24uSWQpOwogICAgICAgICAgICAgX2RyYXdpbmdzLl9oYXNoZXMuQWRkKGlpLkhhc2gsIFJlbFBpYy5JZCk7CiAKQEAgLTIzNCw5ICsyNDcsOSBAQAogICAgICAgICBwcml2YXRlIHN0cmluZyBQaWNTdGFydFhtbCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgeG1sID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICB4bWwuQXBwZW5kKCI8eGRyOm52UGljUHI+Iik7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKF9oeXBlcmxpbmsgPT0gbnVsbCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB4bWwuQXBwZW5kRm9ybWF0KCI8eGRyOmNOdlByIGlkPVwiezB9XCIgZGVzY3I9XCJcIiAvPiIsIF9pZCk7CkBAIC0yNjAsNyArMjczLDcgQEAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHhtbC5BcHBlbmQoIjwveGRyOmNOdlByPiIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAKKwogICAgICAgICAgICAgeG1sLkFwcGVuZCgiPHhkcjpjTnZQaWNQcj48YTpwaWNMb2NrcyBub0NoYW5nZUFzcGVjdD1cIjFcIiAvPjwveGRyOmNOdlBpY1ByPjwveGRyOm52UGljUHI+PHhkcjpibGlwRmlsbD48YTpibGlwIHhtbG5zOnI9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzXCIgcjplbWJlZD1cIlwiIGNzdGF0ZT1cInByaW50XCIgLz48YTpzdHJldGNoPjxhOmZpbGxSZWN0IC8+IDwvYTpzdHJldGNoPiA8L3hkcjpibGlwRmlsbD4gPHhkcjpzcFByPiA8YTp4ZnJtPiA8YTpvZmYgeD1cIjBcIiB5PVwiMFwiIC8+ICA8YTpleHQgY3g9XCIwXCIgY3k9XCIwXCIgLz4gPC9hOnhmcm0+IDxhOnByc3RHZW9tIHByc3Q9XCJyZWN0XCI+IDxhOmF2THN0IC8+IDwvYTpwcnN0R2VvbT4gPC94ZHI6c3BQcj4iKTsKIAogICAgICAgICAgICAgcmV0dXJuIHhtbC5Ub1N0cmluZygpOwpAQCAtMjcxLDcgKzI4NCw3IEBACiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFRoZSBJbWFnZQogICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgSW1hZ2UgSW1hZ2UgCisgICAgICAgIHB1YmxpYyBJbWFnZSBJbWFnZQogICAgICAgICB7CiAgICAgICAgICAgICBnZXQKICAgICAgICAgICAgIHsKQEAgLTI4OCw3ICszMDEsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAvL0NyZWF0ZSByZWxhdGlvbnNoaXAKICAgICAgICAgICAgICAgICAgICAgICAgIFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgieGRyOnBpYy94ZHI6YmxpcEZpbGwvYTpibGlwL0ByOmVtYmVkIiwgTmFtZVNwYWNlTWFuYWdlcikuVmFsdWUgPSByZWxJRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vX2ltYWdlLlNhdmUoUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSwgX2ltYWdlRm9ybWF0KTsgICAvL0Fsd2F5cyBKUEVHIGhlcmUgYXQgdGhpcyBwb2ludC4gCisgICAgICAgICAgICAgICAgICAgICAgICAvL19pbWFnZS5TYXZlKFBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSksIF9pbWFnZUZvcm1hdCk7ICAgLy9BbHdheXMgSlBFRyBoZXJlIGF0IHRoaXMgcG9pbnQuCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGV4KQogICAgICAgICAgICAgICAgICAgICB7CkBAIC00MDIsNyArNDE1LDcgQEAKICAgICAgICAgICAgIGJhc2UuRGlzcG9zZSgpOwogICAgICAgICAgICAgX2h5cGVybGluayA9IG51bGw7CiAgICAgICAgICAgICBfaW1hZ2UuRGlzcG9zZSgpOwotICAgICAgICAgICAgX2ltYWdlID0gbnVsbDsgICAgICAgICAgICAKKyAgICAgICAgICAgIF9pbWFnZSA9IG51bGw7CiAgICAgICAgIH0KICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0VQUGx1c1NESy5jc3Byb2ogYi9FUFBsdXMvRVBQbHVzU0RLLmNzcHJvagppbmRleCBiMmVjNzg0Li40MmZjNGFlIDEwMDY0NAotLS0gYS9FUFBsdXMvRVBQbHVzU0RLLmNzcHJvagorKysgYi9FUFBsdXMvRVBQbHVzU0RLLmNzcHJvagpAQCAtMSw2ICsxLDYgQEAKIO+7vzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgogICA8UHJvcGVydHlHcm91cD4KLSAgICA8VGFyZ2V0RnJhbWV3b3Jrcz5uZXQ0NzI7bmV0NS4wPC9UYXJnZXRGcmFtZXdvcmtzPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0c3RhbmRhcmQyLjA8L1RhcmdldEZyYW1ld29yaz4KICAgICA8Um9vdE5hbWVzcGFjZT5PZmZpY2VPcGVuWG1sPC9Sb290TmFtZXNwYWNlPgogICAgIDxBc3NlbWJseU5hbWU+RVBQbHVzPC9Bc3NlbWJseU5hbWU+CiAgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+CkBAIC04LDYgKzgsNyBAQAogICAgIDxQYWNrYWdlSWQ+QXBwc2hlZXQuRVBQbHVzPC9QYWNrYWdlSWQ+CiAgICAgPFZlcnNpb24+MS4wLjA8L1ZlcnNpb24+CiAgICAgPERlZmF1bHRJdGVtRXhjbHVkZXM+JChEZWZhdWx0SXRlbUV4Y2x1ZGVzKTtQcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcztGb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JIYW5kbGVycy8qKjtGb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5IYW5kbGVyLmNzO0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1JhbmsuY3M8L0RlZmF1bHRJdGVtRXhjbHVkZXM+CisgICAgPERlZmluZUNvbnN0YW50cz5Db3JlO1NUQU5EQVJEMjA8L0RlZmluZUNvbnN0YW50cz4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iJyQoVGFyZ2V0RnJhbWV3b3JrKScgPT0gJ25ldDQ3MiciPgogICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYiIgLz4KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbEJhY2tncm91bmRJbWFnZS5jcyBiL0VQUGx1cy9FeGNlbEJhY2tncm91bmRJbWFnZS5jcwppbmRleCA4YzA2OWY3Li42MDFjZjA5IDEwMDY0NAotLS0gYS9FUFBsdXMvRXhjZWxCYWNrZ3JvdW5kSW1hZ2UuY3MKKysrIGIvRVBQbHVzL0V4Y2VsQmFja2dyb3VuZEltYWdlLmNzCkBAIC0xMywxNyArMTMsMTcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkxMC1TRVAtMjAwOQpAQCAtMzYsNiArMzYsNyBAQAogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIFN5c3RlbS5EcmF3aW5nOwogdXNpbmcgU3lzdGVtLklPOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db21wYXRpYmlsaXR5OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmc7CiB1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwpAQCAtNDgsNyArNDksNyBAQAogICAgIHsKICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgX3dvcmtTaGVldDsKICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gCisgICAgICAgIC8vLwogICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5zbSI+PC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0b3BOb2RlIj5UaGUgdG9wbm9kZSBvZiB0aGUgd29ya3NoZWV0PC9wYXJhbT4KQEAgLTU4LDEwICs1OSwxMCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBfd29ya1NoZWV0ID0gd29ya1NoZWV0OwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGNvbnN0IHN0cmluZyBCQUNLR1JPVU5EUElDX1BBVEggPSAiZDpwaWN0dXJlL0ByOmlkIjsKICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGJhY2tncm91bmQgaW1hZ2Ugb2YgdGhlIHdvcmtzaGVldC4gCisgICAgICAgIC8vLyBUaGUgYmFja2dyb3VuZCBpbWFnZSBvZiB0aGUgd29ya3NoZWV0LgogICAgICAgICAvLy8gVGhlIGltYWdlIHdpbGwgYmUgc2F2ZWQgaW50ZXJuYWxseSBhcyBhIGpwZy4KICAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIEltYWdlIEltYWdlCkBAIC04Niw4ICs4NywxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgeworI2lmIChDb3JlKQorICAgICAgICAgICAgICAgICAgICB2YXIgaW1nPUltYWdlQ29tcGF0LkdldEltYWdlQXNCeXRlQXJyYXkodmFsdWUpOworI2Vsc2UKICAgICAgICAgICAgICAgICAgICAgSW1hZ2VDb252ZXJ0ZXIgaWMgPSBuZXcgSW1hZ2VDb252ZXJ0ZXIoKTsKICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGltZyA9IChieXRlW10paWMuQ29udmVydFRvKHZhbHVlLCB0eXBlb2YoYnl0ZVtdKSk7CisjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgdmFyIGlpID0gX3dvcmtTaGVldC5Xb3JrYm9vay5fcGFja2FnZS5BZGRJbWFnZShpbWcpOwogICAgICAgICAgICAgICAgICAgICB2YXIgcmVsID0gX3dvcmtTaGVldC5QYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChpaS5VcmksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvaW1hZ2UiKTsKICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhCQUNLR1JPVU5EUElDX1BBVEgsIHJlbC5JZCk7CkBAIC05NSw3ICsxMDAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNldCB0aGUgcGljdHVyZSBmcm9tIGFuIGltYWdlIGZpbGUuIAorICAgICAgICAvLy8gU2V0IHRoZSBwaWN0dXJlIGZyb20gYW4gaW1hZ2UgZmlsZS4KICAgICAgICAgLy8vIFRoZSBpbWFnZSBmaWxlIHdpbGwgYmUgc2F2ZWQgYXMgYSBibG9iLCBzbyBtYWtlIHN1cmUgRXhjZWwgc3VwcG9ydHMgdGhlIGltYWdlIGZvcm1hdC4KICAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQaWN0dXJlRmlsZSI+VGhlIGltYWdlIGZpbGUuPC9wYXJhbT4KQEAgLTExMywxNCArMTE4LDE2IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBJbnZhbGlkRGF0YUV4Y2VwdGlvbigiRmlsZSBpcyBub3QgYSBzdXBwb3J0ZWQgaW1hZ2UtZmlsZSBvciBpcyBjb3JydXB0IiwgZXgpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgSW1hZ2VDb252ZXJ0ZXIgaWMgPSBuZXcgSW1hZ2VDb252ZXJ0ZXIoKTsKICAgICAgICAgICAgIHN0cmluZyBjb250ZW50VHlwZSA9IEV4Y2VsUGljdHVyZS5HZXRDb250ZW50VHlwZShQaWN0dXJlRmlsZS5FeHRlbnNpb24pOwogICAgICAgICAgICAgdmFyIGltYWdlVVJJID0gWG1sSGVscGVyLkdldE5ld1VyaShfd29ya1NoZWV0Ll9wYWNrYWdlLlBhY2thZ2UsICIveGwvbWVkaWEvIiArIFBpY3R1cmVGaWxlLk5hbWUuU3Vic3RyaW5nKDAsIFBpY3R1cmVGaWxlLk5hbWUuTGVuZ3RoIC0gUGljdHVyZUZpbGUuRXh0ZW5zaW9uLkxlbmd0aCkgKyAiezB9IiArIFBpY3R1cmVGaWxlLkV4dGVuc2lvbik7Ci0KKyNpZiAoQ29yZSkKKyAgICAgICAgICAgIHZhciBmaWxlQnl0ZXM9SW1hZ2VDb21wYXQuR2V0SW1hZ2VBc0J5dGVBcnJheShpbWcpOworI2Vsc2UKKyAgICAgICAgICAgIHZhciBpYyA9IG5ldyBJbWFnZUNvbnZlcnRlcigpOwogICAgICAgICAgICAgYnl0ZVtdIGZpbGVCeXRlcyA9IChieXRlW10paWMuQ29udmVydFRvKGltZywgdHlwZW9mKGJ5dGVbXSkpOworI2VuZGlmCiAgICAgICAgICAgICB2YXIgaWkgPSBfd29ya1NoZWV0Lldvcmtib29rLl9wYWNrYWdlLkFkZEltYWdlKGZpbGVCeXRlcywgaW1hZ2VVUkksIGNvbnRlbnRUeXBlKTsKIAotCiAgICAgICAgICAgICBpZiAoX3dvcmtTaGVldC5QYXJ0LlBhY2thZ2UuUGFydEV4aXN0cyhpbWFnZVVSSSkgJiYgaWkuUmVmQ291bnQ9PTEpIC8vVGhlIGZpbGUgZXhpc3RzIHdpdGggYW5vdGhlciBjb250ZW50LCBvdmVyd3JpdGUgaXQuCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy9SZW1vdmUgdGhlIHBhcnQgaWYgaXQgZXhpc3RzCkBAIC0xNDEsMTMgKzE0OCwxNyBAQAogICAgICAgICAgICAgdmFyIHJlbElEID0gR2V0WG1sTm9kZVN0cmluZyhCQUNLR1JPVU5EUElDX1BBVEgpOwogICAgICAgICAgICAgaWYgKHJlbElEICE9ICIiKQogICAgICAgICAgICAgeworI2lmIChDb3JlKQorICAgICAgICAgICAgICAgIHZhciBpbWc9SW1hZ2VDb21wYXQuR2V0SW1hZ2VBc0J5dGVBcnJheShJbWFnZSk7CisjZWxzZQogICAgICAgICAgICAgICAgIHZhciBpYyA9IG5ldyBJbWFnZUNvbnZlcnRlcigpOwogICAgICAgICAgICAgICAgIGJ5dGVbXSBpbWcgPSAoYnl0ZVtdKWljLkNvbnZlcnRUbyhJbWFnZSwgdHlwZW9mKGJ5dGVbXSkpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgdmFyIGlpID0gX3dvcmtTaGVldC5Xb3JrYm9vay5fcGFja2FnZS5HZXRJbWFnZUluZm8oaW1nKTsKIAogICAgICAgICAgICAgICAgIC8vRGVsZXRlIHRoZSByZWxhdGlvbgogICAgICAgICAgICAgICAgIF93b3JrU2hlZXQuUGFydC5EZWxldGVSZWxhdGlvbnNoaXAocmVsSUQpOwotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgLy9EZWxldGUgdGhlIGltYWdlIGlmIHRoZXJlIGFyZSBubyBvdGhlciByZWZlcmVuY2VzLgogICAgICAgICAgICAgICAgIGlmIChpaSAhPSBudWxsICYmIGlpLlJlZkNvdW50ID09IDEpCiAgICAgICAgICAgICAgICAgewpAQCAtMTU2LDcgKzE2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBfd29ya1NoZWV0LlBhcnQuUGFja2FnZS5EZWxldGVQYXJ0KGlpLlVyaSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbEhlYWRlckZvb3Rlci5jcyBiL0VQUGx1cy9FeGNlbEhlYWRlckZvb3Rlci5jcwppbmRleCBlNzU2YTMzLi4zZjk3OGM0IDEwMDY0NAotLS0gYS9FUFBsdXMvRXhjZWxIZWFkZXJGb290ZXIuY3MKKysrIGIvRVBQbHVzL0V4Y2VsSGVhZGVyRm9vdGVyLmNzCkBAIC00LDcgKzQsNyBAQAogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KICAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS+RsbG1hbgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkBAIC0yNiw5ICsyNiw5IEBACiAgKiAKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQotICogSmFuIEvkbGxtYW4gICAgICAgICAgICAgICAgICAgICAgVG90YWwgcmV3cml0ZSAgICAgICAgICAgICAgIDIwMTAtMDMtMDEKLSAqIEphbiBL5GxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CisgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuICAgICAgICAgICAgICAgICAgICAgIFRvdGFsIHJld3JpdGUgICAgICAgICAgICAgICAyMDEwLTAzLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uWG1sOwpAQCAtMzcsNiArMzcsNyBAQAogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuVm1sOwogdXNpbmcgU3lzdGVtLklPOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db21wYXRpYmlsaXR5OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIG5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCkBAIC0xMjUsOCArMTI2LDEyIEBACiAgICAgICAgICAgICBzdHJpbmcgaWQgPSBWYWxpZGF0ZUltYWdlKEFsaWdubWVudCk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIC8vQWRkIHRoZSBpbWFnZQorI2lmIChDb3JlKQorICAgICAgICAgICAgdmFyIGltZz1JbWFnZUNvbXBhdC5HZXRJbWFnZUFzQnl0ZUFycmF5KFBpY3R1cmUpOworI2Vsc2UKICAgICAgICAgICAgIEltYWdlQ29udmVydGVyIGljID0gbmV3IEltYWdlQ29udmVydGVyKCk7CiAgICAgICAgICAgICBieXRlW10gaW1nID0gKGJ5dGVbXSlpYy5Db252ZXJ0VG8oUGljdHVyZSwgdHlwZW9mKGJ5dGVbXSkpOworI2VuZGlmCiAgICAgICAgICAgICB2YXIgaWkgPSBfd3MuV29ya2Jvb2suX3BhY2thZ2UuQWRkSW1hZ2UoaW1nKTsKIAogICAgICAgICAgICAgcmV0dXJuIEFkZEltYWdlKFBpY3R1cmUsIGlkLCBpaSk7CkBAIC0xNTQsMTAgKzE1OSwxNCBAQAogICAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZERhdGFFeGNlcHRpb24oIkZpbGUgaXMgbm90IGEgc3VwcG9ydGVkIGltYWdlLWZpbGUgb3IgaXMgY29ycnVwdCIsIGV4KSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEltYWdlQ29udmVydGVyIGljID0gbmV3IEltYWdlQ29udmVydGVyKCk7CiAgICAgICAgICAgICBzdHJpbmcgY29udGVudFR5cGUgPSBFeGNlbFBpY3R1cmUuR2V0Q29udGVudFR5cGUoUGljdHVyZUZpbGUuRXh0ZW5zaW9uKTsKICAgICAgICAgICAgIHZhciB1cmlQaWMgPSBYbWxIZWxwZXIuR2V0TmV3VXJpKF93cy5fcGFja2FnZS5QYWNrYWdlLCAiL3hsL21lZGlhLyIrUGljdHVyZUZpbGUuTmFtZS5TdWJzdHJpbmcoMCwgUGljdHVyZUZpbGUuTmFtZS5MZW5ndGgtUGljdHVyZUZpbGUuRXh0ZW5zaW9uLkxlbmd0aCkgKyAiezB9IiArIFBpY3R1cmVGaWxlLkV4dGVuc2lvbik7CisjaWYgKENvcmUpCisgICAgICAgICAgICB2YXIgaW1nQnl0ZXM9SW1hZ2VDb21wYXQuR2V0SW1hZ2VBc0J5dGVBcnJheShQaWN0dXJlKTsKKyNlbHNlCisgICAgICAgICAgICB2YXIgaWMgPSBuZXcgSW1hZ2VDb252ZXJ0ZXIoKTsKICAgICAgICAgICAgIGJ5dGVbXSBpbWdCeXRlcyA9IChieXRlW10paWMuQ29udmVydFRvKFBpY3R1cmUsIHR5cGVvZihieXRlW10pKTsKKyNlbmRpZgogICAgICAgICAgICAgdmFyIGlpID0gX3dzLldvcmtib29rLl9wYWNrYWdlLkFkZEltYWdlKGltZ0J5dGVzLCB1cmlQaWMsIGNvbnRlbnRUeXBlKTsKIAogICAgICAgICAgICAgcmV0dXJuIEFkZEltYWdlKFBpY3R1cmUsIGlkLCBpaSk7Cg==