ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggZDBlYjczNS4uZDA1ZThmYSAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTQgKzEsMTQgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NzExMDEgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5NzExMTYgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk3MTEwMTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBXaW4zMiB2ZXJzaW9uIG9mIG11bHRpbWVkaWEgZnVuY3Rpb25zLgotCS0gQVNQSSBzdXBwb3J0LgotCS0gQmV0dGVyIERDRSBoYW5kbGluZyAoaW4gcHJvZ3Jlc3MpLgorV0hBVCdTIE5FVyB3aXRoIFdpbmUtOTcxMTE2OiAoc2VlIENoYW5nZUxvZyBmb3IgZGV0YWlscykKKwktIEVtdWxhdG9yIGFuZCBsaWJyYXJ5IHVuaWZpY2F0aW9uLgorCS0gTmV3IEFib3V0IGRpYWxvZy4KKwktIE1lbnVzIGltcHJvdmVtZW50cy4KIAktIExvdHMgb2YgYnVnIGZpeGVzLgogCiBTZWUgdGhlIFJFQURNRSBmaWxlIGluIHRoZSBkaXN0cmlidXRpb24gZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCkBAIC0xNywxMCArMTcsMTAgQEAKIHRoZSByZWxlYXNlIGlzIGF2YWlsYWJsZSBhdCB0aGUgZnRwIHNpdGVzLiAgVGhlIHNvdXJjZXMgd2lsbCBiZSBhdmFpbGFibGUKIGZyb20gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CiAKLSAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTcxMTAxLnRhci5negotICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MTEwMS50YXIuZ3oKLSAgZnRwOi8vZnRwLmluZm9tYWdpYy5jb20vcHViL21pcnJvcnMvbGludXgvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MTEwMS50YXIuZ3oKLSAgZnRwOi8vZnRwLnByb2dzb2MudXRzLmVkdS5hdS9wdWIvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MTEwMS50YXIuZ3oKKyAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTcxMTE2LnRhci5negorICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MTExNi50YXIuZ3oKKyAgZnRwOi8vZnRwLmluZm9tYWdpYy5jb20vcHViL21pcnJvcnMvbGludXgvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MTExNi50YXIuZ3oKKyAgZnRwOi8vZnRwLnByb2dzb2MudXRzLmVkdS5hdS9wdWIvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MTExNi50YXIuZ3oKIAogSXQgc2hvdWxkIGFsc28gYmUgYXZhaWxhYmxlIGZyb20gYW55IHNpdGUgdGhhdCBtaXJyb3JzIHRzeC0xMSBvciBzdW5zaXRlLgogCmRpZmYgLS1naXQgYS9CVUdTIGIvQlVHUwppbmRleCA4Yjc2OWZlLi5kZmYxZTRkIDEwMDY0NAotLS0gYS9CVUdTCisrKyBiL0JVR1MKQEAgLTUsNyArNSw3IEBACiBhZGQgbmV3IGVudHJpZXMgYW5kLCBtb3JlIGltcG9ydGFudGx5LCByZW1vdmUgdGhvc2UgZm9yIHRoZSAKIGJ1Z3MgeW91IGZpeGVkIDstKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BcyBvZiBPY3QgMTk5NyAtCitBcyBvZiBOb3YgMTk5NyAtCiAKIEdlbmVyYWw6CiAKQEAgLTM2LDkgKzM2LDcgQEAKIAogTWlzY2VsbGFuZW91czoKIAotICogTWlzc2luZyBtZW51IHNlcGFyYXRvcnMgaW4gQkNXLCBvdGhlciBwcm9ncmFtcy4KLQotICogQkNXIGZhaWxzIHdpdGggImJhZCBjbGFzcyAnTWVzc2FnZVdpbmRvdyciIG1lc3NhZ2UuCisgKiBJbnZpc2libGUgY29udHJvbHMgaW4gQkNXIGRpYWxvZ3MuCiAKICAqIE1JUkMgaXMgdW5hYmxlIHRvIHNob3cgJ09wdGlvbnMnIGRpYWxvZy4KIApkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCmluZGV4IGFhMjZkZTYuLjhiNGI4MzAgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZworKysgYi9DaGFuZ2VMb2cKQEAgLTEsNCArMSwxNjkgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1N1biBOb3YgMTYgMDc6NDI6NDQgMTk5NyAgQWxleCBLb3JvYmthIDxhbGV4QHRyYW50b3IucGhhcm0uc3VueXNiLmVkdT4KKworCSogW3dpbmRvd3MvZGNlLmNdIFt3aW5kb3dzL2NsaXBib2FyZC5jXSBbd2luZG93cy9ub25jbGllbnQuY10KKwlCdWcgZml4ZXMuCisKKwkqIFttaXNjL3NoZWxsLmNdIFtyZXNvdXJjZXMvKl0KKwlOZXcgIkFib3V0IiBkaWFsb2cuCisKK1NhdCBOb3YgMTUgMTc6MzA6MTggMTk5NyAgQWxleGFuZHJlIEp1bGxpYXJkICA8anVsbGlhcmRAbHJjLmVwZmwuY2g+CisKKwkqIFtjb25maWd1cmUuaW5dIFtNYWtlZmlsZS5pbl0KKwlSZXBsYWNlZCAtLXdpdGgtbGlicmFyeSBvcHRpb24gYnkgLS1kaXNhYmxlLWVtdWxhdG9yLiBUaGUgZGVmYXVsdAorIAlpcyBub3cgdG8gYnVpbGQgYm90aCB0aGUgbGlicmFyeSBhbmQgdGhlIGVtdWxhdG9yLgorCVJlbmFtZWQgLS13aXRoIG9wdGlvbnMgdG8gLS1lbmFibGUgdG8gZm9sbG93IGF1dG9jb25mIGd1aWRlbGluZXMuCisKKwkqIFtsb2FkZXIvbWFpbi5jXSBbbWlzY2VtdS9tYWluLmNdIChOZXcgZmlsZSkKKwlTcGxpdCBpbml0aWFsaXphdGlvbiBpbiBXaW5lbGliSW5pdC9FbXVsYXRvckluaXQuCisKKwkqIFtsb2FkZXIvKi5jXQorCVJlbW92ZWQgYWxsIHJlbWFpbmluZyAjaWZkZWYncyBXSU5FTElCLgorCisJKiBbY29udHJvbHMvd2lkZ2V0cy5jXSBbd2luZG93cy9tZGkuY10KKwlDb252ZXJ0ZWQgTURJQ2xpZW50V25kUHJvYyB0byAzMi1iaXQuCisKKwkqIFtkZWJ1Z2dlci9icmVhay5jXSBbaWYxNjMyL3NpZ25hbC5jXSBbaW5jbHVkZS9zZWxlY3RvcnMuaF0KKwkgIFtzY2hlZHVsZXIvdGhyZWFkLmNdCisJQ29kZSBhbmQgZGF0YSBzZWxlY3RvciB2YWx1ZXMgYXJlIG5vdyBjb21wdXRlZCBhdCBydW4tdGltZS4KKworCSogW2xpYnJhcnkvbGlicmVzLmNdCisJTW92ZWQgdG8gbG9hZGVyLyBkaXJlY3RvcnkuCisKKwkqIFttaXNjL21haW4uY10gW21pc2MvdmVyc2lvbi5jXSAoTmV3IGZpbGUpCisJTW92ZWQgYWxsIHZlcnNpb24gc3R1ZmYgdG8gdmVyc2lvbi5jLiBDbGVhbmVkIHVwIGEgYml0LgorCisJKiBbbXNkb3MvZHBtaS5jXQorCVVwZGF0ZSB0aGUgUkVBTE1PREVDQUxMIHN0cnVjdHVyZSBvbiByZXR1cm4gZnJvbSByZWFsLW1vZGUKKwlpbnRlcnJ1cHQuCisKKwkqIFt3aW5kb3dzL2V2ZW50LmNdIFt3aW5kb3dzL2tleWJvYXJkLmNdCisJQ2hhbmdlZCB0aGUgd2F5IGV2ZW50IGNvb3JkaW5hdGVzIGFyZSBkZXRlcm1pbmVkLiBEb24ndCByZWx5IG9uCisJdGhlIENvbmZpZ3VyZU5vdGlmeSBldmVudCB2YWx1ZXMuIFRoaXMgc2hvdWxkIGZpeCBhbGwgcHJvYmxlbXMKKwl3aXRoIGN1cnNvciBwb3NpdGlvbiBpbiAtZGVza3RvcCBhbmQgLW1hbmFnZWQgbW9kZXMuCisKK1NhdCBOb3YgMTUgMTY6MDk6MzYgMTk5NyAgU2xhdmVuIFJlemljICA8ZXNlcnRlQGNzLnR1LWJlcmxpbi5kZT4KKworCSogW2NvbnRyb2xzL2J1dHRvbi5jXQorCShCVVRUT05fQ2hlY2tBdXRvUmFkaW9CdXR0b24pOiBQcmV2ZW50IHBvc3NpYmxlIGVuZGxlc3MgbG9vcC4KKworV2VkIE5vdiAxMiAwMzo0Mjo0NSAxOTk3ICBDaHJpcyBGYWhlcnR5IDxjaHJpc2ZAYW1lcmljYS5jb20+CisKKwkqIFttaXNjL3Zlci5jXQorCUNoYW5nZWQgVmVySW5zdGFsbDMyQSB0byBhc3N1bWUgc3JjZGlyIGFzIGRlc3RpbmF0aW9uIGlmIGRlc3RkaXIKKwlpcyBibGFuay4gIFRoaXMgd2FzIGNhdXNpbmcgYWxvdCBvZiBETEwgaW5zdGFsbGF0aW9uIGludG8gU1lTVEVNCisJZGlyZWN0b3J5IHRvIGZhaWwuCisKKwkqIFtsb2FkZXIvbmVfaW1hZ2UuY10KKwlORV9Mb2FkU2VnbWVudCBidWZmZXJbMTAwXSB3YXMgdG9vIHNtYWxsIGFuZCBnZXR0aW5nIG92ZXJydW5zLgorCUNoYW5nZWQgaXQgdG8gYnVmZmVyWzIwMF0uCisKK1NhdCBOb3YgIDggMDY6MDk6NTcgMTk5NyAgTGVuIFdoaXRlIDxwaHJlYWtAY2dvY2FibGUubmV0PgorCisJKiBbbWlzYy9kZGVtbC5jXSBbaW5jbHVkZS9kZGVtbC5oXSBbaWYxNjMyL2RkZW1sLnNwZWNdCisJQWRkZWQgc3R1YiBmdW5jdGlvbnMgRGRlQ29ubmVjdExpc3QoKSwgRGRlUXVlcnlOZXh0U2VydmVyKCksCisJRGRlRGlzY29ubmVjdExpc3QoKSwgRGRlU2V0VXNlckhhbmRsZSgpLCBEZGVBYmFuZG9uVHJhbnNhY3Rpb24oKSwKKwlEZGVQb3N0QWR2aXNlKCksIERkZUNyZWF0ZURhdGFIYW5kbGUoKSwgRGRlQWRkRGF0YSgpLCBEZGVHZXREYXRhKCksCisJRGRlQWNjZXNzRGF0YSgpLCBEZGVVbmFjY2Vzc0RhdGEoKSwgRGRlRW5hYmxlQ2FsbGJhY2soKSwKKwlEZGVDbXBTdHJpbmdIYW5kbGVzKCkuCisKK0ZyaSBOb3YgIDcgMTk6NDQ6MjYgMTk5NyAgT2xhZiBGbGViYmUgIDxvLmZsZWJiZUBzY2llbmNlLWNvbXB1dGluZy5kZT4KKworCSogW2ZpbGVzL2RpcmVjdG9yeS5jXQorCUZpeCB0eXBvIGluIGRpcmVjdG9yeS5jIFticm9rZSBsb2FkaW5nIG9mIGNkcGxheWVyIG9uIG50NDBdCisKKwkqIFttaXNjL21haW4uY10KKwlJbXBsZW1lbnRlZCAtd2ludmVyIG50NDAuCisKKwkqIFtsb2FkZXIvcmVzb3VyY2UuY10gW3VzZXIzMi5zcGVjXQorCVN0dWJzIGZvciBDb3B5QWNjZWxlcmF0b3JUYWJsZSwgRGVzdHJveSBBY2NlbGVyYXRvclRhYmxlLgorCitUaHUgTm92ICA2IDIyOjM3OjA0IDE5OTcgIE1vcnRlbiBXZWxpbmRlciAgPHdlbGluZGVyQHJlbnRlYy5jb20+CisKKwkqIFtmaWxlcy9kcml2ZS5jXQorCShHZXREaXNrRnJlZVNwYWNlMzJBKTogQ2FwIGF0IDJHQi4KKworCSogW2luY2x1ZGUvd2luZG93cy5oXQorCVByb3RvdHlwZSBEcmF3SWNvbkV4IGFuZCBDcmVhdGVESUJTZWN0aW9uMzIuCisJRGVmaW5lIE9CTV9SQURJT0NIRUNLLgorCUFkZCBESV8qIG1hY3Jvcy4KKworCSogW29iamVjdHMvZGliLmNdIFtpZjE2MzIvZ2RpLnNwZWNdCisJQ3JlYXRlRElCU2VjdGlvbiBpcyBhIFdJTkFQSS4gIFJlbmFtZWQgdG8gQ3JlYXRlRElCU2VjdGlvbjMyLgorCUltcGxlbWVudCBDcmVhdGVESUJTZWN0aW9uMTYuCisKKwkqIFtpZjE2MzIvdXNlci5zcGVjXSBbaWYxNjMyL3VzZXIzMi5zcGVjXQorCUFkZCBEcmF3SWNvbkV4LgorCisJKiBbb2JqZWN0cy9jdXJzb3JpY29uLmNdCisJKENvcHlJY29uMzIpOiBGaXggYm9ndXMgaW1wbGVtZW50YXRpb24uCisKKwkqIFtvYmplY3RzL2JpdG1hcC5jXQorCShDb3B5Qml0bWFwMzIpOiBOZXcgZnVuY3Rpb24uCisJKENvcHlJbWFnZTMyKTogRG8gYml0bWFwcy4KKworCSogW2dyYXBoaWNzL3gxMWRydi90ZXh0LmNdCisJKFgxMURSVl9FeHRUZXh0T3V0KTogQ2hhbmdlIGFzY2VudCBhbmQgZGVzY2VudCBkZWZhdWx0IHRvIGF2b2lkCisJemVyby10aGlua25lc3Mgb3ZlcnN0cmlrZSBsaW5lLgorCisJKiBbaW5jbHVkZS9kZWJ1Z3N0ci5oXSBbbWlzYy9kZWJ1Z3N0ci5jXQorCU5ldyBmaWxlcy4KKworCSogW21zZG9zL2RwbWkuY10KKwlEb24ndCBwcm90b3R5cGUgZG9fbXNjZGV4LiBJbiBJTlRfSW50MzFIYW5kbGVyLCBoYW5kbGUgcmVhbC1tb2RlCisJaW50IDB4MjEsIGFoPTB4NTIuCisKKwkqIFttc2Rvcy9pbnQyZi5jXQorCUFkZCBkdW1teXMgZm9yIDB4MTY4MSBhbmQgMHgxNjgyLgorCisJKiBbbWlzYy9yZWdpc3RyeS5jXQorCUZpeCBtZW1vcnkgbGVha3MgaW4gUmVnRGVsZXRlS2V5MzJXLgorCisJKiBbb2JqZWN0cy90ZXh0LmNdCisJSW4gVEVYVF9OZXh0TGluZSwgZml4IGFub3RoZXIgb2ZmLWJ5LW9uZSBidWcuCisKKwkqIFtpbmNsdWRlL2JpdG1hcHMvb2JtX3JhZGlvY2hlY2tdCisJTmV3IGZpbGUuICAoSXQgYSBzbWFsbCBjaXJjbGUgdXNlZCB0byByYWRpby1idXR0b24gbWVudSBpdGVtcworCXdoZW4gc2VsZWN0ZWQuKQorCQorCSogW29iamVjdHMvb2VtYml0bWFwLmNdCisJQWRkIG9ibV9yYWRpb2NoZWNrLgorCisJKiBbaW5jbHVkZS93aW5kb3dzLmhdIFtpZjE2MzIvdXNlcjMyLnNwZWNdIFtjb250cm9scy9tZW51LmNdCisJICBbaWYxNjMyL3VzZXIuc3BlY10KKwlEZWZpbmUgQ2hlY2tNZW51UmFkaW9JdGVtezE2LDMyfS4gIERlZmluZSBHZXRNZW51SXRlbVJlY3R7MTYsMzJ9LgorCitXZWQgTm92ICA1IDExOjMwOjE0IDE5OTcgIE1hcmN1cyBNZWlzc25lciA8bXNtZWlzc25AY2lwLmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorCSogW21pc2MvbWFpbi5jXQorCUF1dG8gYWRqdXN0IHZlcnNpb25zIGRlcGVuZGluZyBvbiBiaW5hcnkuCisKK1R1ZSBOb3YgIDQgMTU6MjE6MDAgMTk5NyAgS3Jpc3RpYW4gTmllbHNlbiAgPGtyaXN0aWFuLm5pZWxzZW5Acmlzb2UuZGs+CisKKwkqIFtjb250cm9scy9saXN0Ym94LmNdCisJUGFpbnQgZnVsbCBiYWNrZ3JvdW5kIGluIGxpc3Rib3ggaXRlbXMgd2l0aCB0YWIgc3RvcHMgZW5hYmxlZC4KKworCSogW2lmMTYzMi90aHVuay5jXQorCUNvcHkgc29tZSBtb3JlIG1lc3NhZ2UgcGFyYW1ldGVyIHN0cnVjdHVyZXMgKERSQVdJVEVNU1RSVUNUMTYsCisJQ09NUEFSRUlURU1TVFJVQ1QxNikgdG8gdGhlIHN0YWNrIHNlZ21lbnQgdG8gZml4IGJyb2tlbiBwcm9ncmFtcworCXRoYXQgbmVlZCB0aGlzLgorCisJKiBbd2luZG93cy9kY2UuY10KKwlPbmx5IGNsaXAgc2libGluZyB3aW5kb3dzIHdoZW4gdGhlIHBhcmVudCBoYXMgdGhlIFdTX0NMSVBTSUJMSU5HUworCXN0eWxlIHNldC4KKworCSogW3dpbmRvd3MvZm9jdXMuY10KKwlNYWtlIG9yZGVyIG9mIGV2ZW50cyBpbiBGT0NVU19Td2l0Y2hGb2N1cygpIHJlZmxlY3QgQVBJIGRvY3MuCisKKwkqIFt3aW5kb3dzL2RlZmRsZy5jXQorCUZpeCBwcm9ibGVtIHdpdGggbG9zcyBvZiBmb2N1cyBpbiBzb21lIGRpYWxvZ3MuCisKKwkqIFt3aW4zMi9jb2RlX3BhZ2UuY10KKwlGaXggcmV0dXJuIHZhbHVlIGZvciBNdWx0aUJ5dGVUb1dpZGVDaGFyKCkuCisKKwkqIFtCVUdTXQorCUJDVyBub3cgd29ya3MuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFRodSBPY3QgMzAgMjE6NTI6MjMgMTk5NyAgTWFydGluIEJvZWhtZSA8Ym9laG1lQGluZm9ybWF0aWsubXUtbHVlYmVjay5kZT4KIAogCSogW3dpbmRvd3Mvbm9uY2xpZW50LmNdCkBAIC0xMDgsNyArMjczLDcgQEAKIAkqIFtpbmNsdWRlL2RyaXZlLmhdIFtmaWxlcy9kcml2ZS5jXSBbbXNkb3MvaW50MjEuY10KIAlQYXJ0aWFsbHkgaW1wbGVtZW50ZWQgRE9TIGRyaXZlIG1hcHBpbmcgKGludDIxIEFYPTQ0MEYpLgogCi1TYXQgT2N0IDI1IDEzOjAzOjI5IDE5OTcgIEFsZXhhbmRyZSBKdWxsaWFyZCAgPEFsZXhhbmRyZS5KdWxsaWFyZEB1cmJhbmV0LmNoPgorU2F0IE9jdCAyNSAxMzowMzoyOSAxOTk3ICBBbGV4YW5kcmUgSnVsbGlhcmQgIDxqdWxsaWFyZEBscmMuZXBmbC5jaD4KIAogCSogW2RlYnVnZ2VyL2RlYnVnLmxdCiAJU3VwcG9ydCAnLicgaW4gaWRlbnRpZmllcnMuIFVzZSAieCAuIHkiIHRvIGFjY2VzcyBzdHJ1Y3R1cmUKZGlmZiAtLWdpdCBhL01ha2UucnVsZXMuaW4gYi9NYWtlLnJ1bGVzLmluCmluZGV4IDZhOTRjNjAuLmUyN2U4OGIgMTAwNjQ0Ci0tLSBhL01ha2UucnVsZXMuaW4KKysrIGIvTWFrZS5ydWxlcy5pbgpAQCAtMjMsNyArMjMsNyBAQAogWF9MSUJTICAgID0gQFhfTElCU0AKIFhQTV9MSUIgICA9IC1sWHBtCiBYTElCICAgICAgPSBAWF9QUkVfTElCU0AgLWxYZXh0IC1sWDExIEBYX0VYVFJBX0xJQlNACi1XSU5FTElCICAgPSAkKFdJTkVTVFVCKSAkKFRPUE9CSkRJUikvQE1BSU5fVEFSR0VUQAorV0lORUxJQiAgID0gJChXSU5FU1RVQikgJChUT1BPQkpESVIpL0BMSUJfVEFSR0VUQAogTERMSUJTICAgID0gQExETElCU0AKIFlBQ0MgICAgICA9IEBZQUNDQAogTEVYICAgICAgID0gQExFWEAKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KaW5kZXggODAyODM5MS4uMzJiNzdlZiAxMDA2NDQKLS0tIGEvTWFrZWZpbGUuaW4KKysrIGIvTWFrZWZpbGUuaW4KQEAgLTEsNiArMSw3IEBACiAjIFRoaXMgTWFrZWZpbGUgdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyB0YXJnZXRzOgogIwogIyBhbGwgKGRlZmF1bHQpOglidWlsZCB3aW5lCisjIGxpYjogICAgICAgICAgICAgICAgICBidWlsZCBsaWJ3aW5lCiAjIGNsZWFuOgkJcmVtb3ZlIGFsbCBpbnRlcm1lZGlhdGUgZmlsZXMKICMgZGlzdGNsZWFuOgkJYWxzbyByZW1vdmUgYWxsIGZpbGVzIGNyZWF0ZWQgYnkgY29uZmlndXJlCiAjIGluc3RhbGw6ICAgICAgICAgICAgICBpbnN0YWxsIGV2ZXJ5dGhpbmcKQEAgLTExLDYgKzEyLDcgQEAKICMgTWFpbiB0YXJnZXQgdG8gYnVpbGQKIAogTUFJTl9UQVJHRVQgPSBATUFJTl9UQVJHRVRACitMSUJfVEFSR0VUICA9IEBMSUJfVEFSR0VUQAogCiAjIERpcmVjdG9yaWVzCiAKQEAgLTIwLDcgKzIyLDcgQEAKIFZQQVRIICAgICA9IEBzcmNkaXJACiBNT0RVTEUgICAgPSBub25lCiAKLUNPTU1PTlNVQkRJUlMgPSBcCitMSUJTVUJESVJTID0gXAogCXJjIFwKIAljb250cm9scyBcCiAJZmlsZXMgXApAQCAtMjgsNiArMzAsNyBAQAogCWdyYXBoaWNzL21ldGFmaWxlZHJ2IFwKIAlncmFwaGljcy94MTFkcnYgXAogCWlwYyBcCisJbGlicmFyeSBcCiAJbG9hZGVyIFwKIAltZW1vcnkgXAogCW1pc2MgXApAQCAtNDYsMjcgKzQ5LDI0IEBACiAJaWYxNjMyIFwKIAltaXNjZW11CiAKLUxJQlNVQkRJUlMgPSBsaWJyYXJ5Ci0KIFBST0dTVUJESVJTID0gbGlidGVzdCBwcm9ncmFtcwogCiBET0NTVUJESVJTID0gZG9jdW1lbnRhdGlvbgogCiAjIEFsbCBzdWItZGlyZWN0b3JpZXMKIEFMTFNVQkRJUlMgPSBcCi0JJChDT01NT05TVUJESVJTKSBcCi0JJChFTVVTVUJESVJTKSBcCiAJJChMSUJTVUJESVJTKSBcCisJJChFTVVTVUJESVJTKSBcCiAJJChQUk9HU1VCRElSUykgXAogCSQoRE9DU1VCRElSUykKIAogIyBTdWItZGlyZWN0b3JpZXMgdG8gcnVuIG1ha2UgZGVwZW5kIGludG8KLURFUEVORFNVQkRJUlMgPSAkKENPTU1PTlNVQkRJUlMpICQoTElCU1VCRElSUykgJChFTVVTVUJESVJTKSAkKERPQ1NVQkRJUlMpCitERVBFTkRTVUJESVJTID0gJChMSUJTVUJESVJTKSAkKEVNVVNVQkRJUlMpICQoRE9DU1VCRElSUykKIAogIyBTdWItZGlyZWN0b3JpZXMgdG8gcnVuIG1ha2UgaW5zdGFsbCBpbnRvCiBJTlNUQUxMU1VCRElSUyA9ICQoRE9DU1VCRElSUykKIAotQ09NTU9OT0JKUyA9IFwKK0xJQk9CSlMgPSBcCiAJY29udHJvbHMvY29udHJvbHMubyBcCiAJZmlsZXMvZmlsZXMubyBcCiAJZ3JhcGhpY3MvZ3JhcGhpY3MubyBcCkBAIC05MCwzNCArOTAsMzMgQEAKIAlpZjE2MzIvaWYxNjMyLm8gXAogCW1pc2NlbXUvbWlzY2VtdS5vCiAKLUxJQk9CSlMgPSBsaWJyYXJ5L2xpYnJhcnkubwotCiBhbGw6ICQoTUFJTl9UQVJHRVQpCiAKIEBNQUtFX1JVTEVTQAogCiBpbnN0YWxsOjogaW5zdGFsbF8kKE1BSU5fVEFSR0VUKQogCi13aW5lIHdpbmUuc3ltOiAkKENPTU1PTlNVQkRJUlMpICQoRU1VU1VCRElSUykgZHVtbXkKLQkkKENDKSAtbyB3aW5lICQoQ09NTU9OT0JKUykgJChFTVVPQkpTKSAkKExET1BUSU9OUykgJChYX0xJQlMpICQoWFBNX0xJQikgJChYTElCKSAkKExETElCUykKK2VtdTogd2luZQorCitsaWI6ICQoTElCX1RBUkdFVCkKKword2luZSB3aW5lLnN5bTogJChMSUJfVEFSR0VUKSAkKEVNVVNVQkRJUlMpIGR1bW15CisJJChDQykgLW8gd2luZSAkKEVNVU9CSlMpICQoTElCX1RBUkdFVCkgJChMRE9QVElPTlMpICQoWF9MSUJTKSAkKFhQTV9MSUIpICQoWExJQikgJChMRExJQlMpCiAJbm0gLW4gd2luZSB8IGdyZXAgLXYgX2NvbXBpbGVkID53aW5lLnN5bQogCi1pbnN0YWxsX3dpbmU6IGR1bW15Ci0JJChJTlNUQUxMX1BST0dSQU0pIHdpbmUgJChiaW5kaXIpL3dpbmUKLQotbGlid2luZS5hOiAkKENPTU1PTlNVQkRJUlMpICQoTElCU1VCRElSUykgZHVtbXkKK2xpYndpbmUuYTogJChMSUJTVUJESVJTKSBkdW1teQogCSQoUk0pICRACi0JJChBUikgJEAgJChDT01NT05PQkpTKSAkKExJQk9CSlMpCisJJChBUikgJEAgJChMSUJPQkpTKQogCSQoUkFOTElCKSAkQAogCi1pbnN0YWxsX2xpYndpbmUuYTogaW5zdGFsbF9pbmNsdWRlcwotCSQoSU5TVEFMTF9EQVRBKSBsaWJ3aW5lLmEgJChsaWJkaXIpCitsaWJ3aW5lLnNvLjEuMDogJChMSUJTVUJESVJTKSBkdW1teQorCSQoQ0MpIC1zaGFyZWQgLVdsLC1zb25hbWUsbGlid2luZS5zbyAtbyRAICQoTElCT0JKUykgJChMRE9QVElPTlMpICQoWF9MSUJTKSAkKFhQTV9MSUIpICQoWExJQikgJChMRExJQlMpCiAKLWxpYndpbmUuc28uMS4wOiAkKENPTU1PTlNVQkRJUlMpICQoTElCU1VCRElSUykgZHVtbXkKLQkkKENDKSAtc2hhcmVkIC1XbCwtc29uYW1lLGxpYndpbmUuc28gLW8kQCAkKENPTU1PTk9CSlMpICQoTElCT0JKUykgJChMRE9QVElPTlMpICQoWF9MSUJTKSAkKFhQTV9MSUIpICQoWExJQikgJChMRExJQlMpCitpbnN0YWxsX2VtdTogZHVtbXkKKwkkKElOU1RBTExfUFJPR1JBTSkgd2luZSAkKGJpbmRpcikvd2luZQogCi1pbnN0YWxsX2xpYndpbmUuc28uMS4wOiBpbnN0YWxsX2luY2x1ZGVzCi0JJChJTlNUQUxMX0RBVEEpIGxpYndpbmUuc28uMS4wICQobGliZGlyKQoraW5zdGFsbF9saWI6IGluc3RhbGxfaW5jbHVkZXMKKwkkKElOU1RBTExfREFUQSkgJChMSUJfVEFSR0VUKSAkKGxpYmRpcikKIAogaW5zdGFsbF9pbmNsdWRlczogZHVtbXkKIAlpZiBbIC1kICQoaW5jbHVkZWRpcikgXTsgdGhlbiA6IDsgZWxzZSAkKE1LRElSKSAkKGluY2x1ZGVkaXIpOyBmaSAKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQppbmRleCAwMWJjNzkxLi5iZDkwMGUyIDEwMDY0NAotLS0gYS9SRUFETUUKKysrIGIvUkVBRE1FCkBAIC0yMywxMyArMjMsMTIgQEAKIGFsc28gYmUgZm91bmQgb24gZnRwLngub3JnIGFuZCBhbGwgaXRzIG1pcnJvciBzaXRlcy4KIAogVG8gYnVpbGQgV2luZSwgZmlyc3QgZG8gYSAiLi9jb25maWd1cmUiIGFuZCB0aGVuIGEgIm1ha2UgZGVwZW5kOyBtYWtlIi4KLVRoZSBleGVjdXRhYmxlICJ3aW5lIiB3aWxsIGJlIGJ1aWx0LiAgIndpbmUiIHdpbGwgbG9hZCBhbmQgcnVuIDE2LWJpdAotV2luZG93cyBleGVjdXRhYmxlcy4KK1RoaXMgd2lsbCBidWlsZCB0aGUgbGlicmFyeSAibGlid2luZS5hIiBhbmQgdGhlIHByb2dyYW0gIndpbmUiLgogCi1UbyBidWlsZCBXaW5lbGliLCBkbyBhICIuL2NvbmZpZ3VyZSAtLXdpdGgtbGlicmFyeSIsIGFuZCB0aGVuIGEgIm1ha2UKLWRlcGVuZDsgbWFrZSIuIFRoZSBsaWJyYXJ5ICJ3aW5lbGliLmEiIHdpbGwgYmUgYnVpbHQsIGFsbG93aW5nIHRvCi1jb21waWxlIFdpbmRvd3Mgc291cmNlIGNvZGUgdW5kZXIgVW5peC4gSWYgeW91IGhhdmUgYW4gRUxGIGNvbXBpbGVyLAoteW91IGNhbiB1c2UgIi4vY29uZmlndXJlIC0td2l0aC1kbGwiIGluc3RlYWQgdG8gYnVpbGQgYSBzaGFyZWQgbGlicmFyeS4KK1RoZSBwcm9ncmFtICJ3aW5lIiB3aWxsIGxvYWQgYW5kIHJ1biBXaW5kb3dzIGV4ZWN1dGFibGVzLgorVGhlIGxpYnJhcnkgImxpYndpbmUuYSIgY2FuIGJlIHVzZWQgdG8gY29tcGlsZSBhbmQgbGluayBXaW5kb3dzIHNvdXJjZQorY29kZSB1bmRlciBVbml4LiAgSWYgeW91IGhhdmUgYW4gRUxGIGNvbXBpbGVyLCB5b3UgY2FuIHVzZQorIi4vY29uZmlndXJlIC0tZW5hYmxlLWRsbCIgdG8gYnVpbGQgYSBzaGFyZWQgbGlicmFyeSBpbnN0ZWFkLgogCiBUbyB1cGdyYWRlIHRvIGEgbmV3IHJlbGVhc2UgYnkgdXNpbmcgYSBwYXRjaCBmaWxlLCBmaXJzdCBjZCB0byB0aGUKIHRvcC1sZXZlbCBkaXJlY3Rvcnkgb2YgdGhlIHJlbGVhc2UgKHRoZSBvbmUgY29udGFpbmluZyB0aGlzIFJFQURNRQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IGQ1NjI2ODYuLjgzYmEwMDggMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTEzLDExICsxMywxMSBAQAogYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAogIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgogYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWxpYnJhcnkgICAgICAgICAgYnVpbGQgV2luZSBhcyBhIGxpYnJhcnkgaW5zdGVhZCBvZiBhbiBlbXVsYXRvciIKKyAgLS1kaXNhYmxlLWVtdWxhdG9yICAgICAgYnVpbGQgb25seSB0aGUgV2luZSBsaWJyYXJ5LCBub3QgdGhlIGVtdWxhdG9yIgogYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWRsbCAgICAgICAgICAgICAgYnVpbGQgV2luZSBhcyBhIERMTCBpbnN0ZWFkIG9mIGFuIGVtdWxhdG9yIgorICAtLWVuYWJsZS1kbGwgICAgICAgICAgICBidWlsZCB0aGUgV2luZSBsaWJyYXJ5IGFzIGEgRExMIgogYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWlwYyAgICAgICAgICAgICAgdXNlIGludGVyLXByb2Nlc3MgY29tbXVuaWNhdGlvbiBmb3IgRERFIgorICAtLWVuYWJsZS1pcGMgICAgICAgICAgICB1c2UgaW50ZXItcHJvY2VzcyBjb21tdW5pY2F0aW9uIGZvciBEREUiCiBhY19oZWxwPSIkYWNfaGVscAogICAtLXdpdGgteCAgICAgICAgICAgICAgICB1c2UgdGhlIFggV2luZG93IFN5c3RlbSIKIApAQCAtNTUzLDI2ICs1NTMsMjcgQEAKIHRlc3QgLXogIiRQUk9HRVhUIiAmJiBQUk9HRVhUPSIiIAogCiAKLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGlicmFyeSBvciAtLXdpdGhvdXQtbGlicmFyeSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbGlicmFyeStzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9saWJyYXJ5IgotICBPUFRJT05TPSItRFdJTkVMSUIiIE1BSU5fVEFSR0VUPSJsaWJ3aW5lLmEiCi1lbHNlCi0gIE9QVElPTlM9IiIgTUFJTl9UQVJHRVQ9IndpbmUiCitNQUlOX1RBUkdFVD1lbXUKK0xJQl9UQVJHRVQ9bGlid2luZS5hCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1lbXVsYXRvciBvciAtLWRpc2FibGUtZW11bGF0b3Igd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZW11bGF0b3Irc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2VtdWxhdG9yIgorICBpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyI7IHRoZW4gTUFJTl9UQVJHRVQ9ImxpYiI7IGZpCiBmaQogCiAKLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZGxsIG9yIC0td2l0aG91dC1kbGwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2RsbCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9kbGwiCi0gIE9QVElPTlM9Ii1EV0lORUxJQiIgTUFJTl9UQVJHRVQ9ImxpYndpbmUuc28uMS4wIgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRsbCBvciAtLWRpc2FibGUtZGxsIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2RsbCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfZGxsIgorICBpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyI7IHRoZW4gOiA7IGVsc2UgTElCX1RBUkdFVD0ibGlid2luZS5zby4xLjAiOyBmaQogZmkKIAogCiAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWlwYyBvciAtLXdpdGhvdXQtaXBjIHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7d2l0aF9pcGMrc2V0fSIgPSBzZXQ7IHRoZW4KICAgd2l0aHZhbD0iJHdpdGhfaXBjIgotICBPUFRJT05TPSIkT1BUSU9OUyAtRENPTkZJR19JUEMiCisgIGlmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIjsgdGhlbiA6IDsgZWxzZSBPUFRJT05TPSItRENPTkZJR19JUEMiOyBmaQogZmkKIAogCkBAIC01ODAsOCArNTgxLDkgQEAKIAogCiAKKwogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTg1OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1ODc6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQogc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC02MTAsNyArNjEyLDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjE0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjYxNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTYzOSw3ICs2NDEsNyBAQAogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBjYzsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NjQ1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjg3LDcgKzY4OSw3IEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY5MTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2OTM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CiAKIGFjX2V4dD1jCiAjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCkBAIC02OTcsMTEgKzY5OSwxMSBAQAogY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCiAKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDcwMSAiY29uZmlndXJlIgorI2xpbmUgNzAzICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIG1haW4oKXtyZXR1cm4oMCk7fQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcwNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcwNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCiAgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KICAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCkBAIC03MjEsMTIgKzcyMywxMiBAQAogICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQogZmkKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MjU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo3Mjc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKIGVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgogY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MzA6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo3MzI6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC03MzUsNyArNzM3LDcgQEAKICAgeWVzOwogI2VuZGlmCiBFT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3Mzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgoraWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjc0MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgIGFjX2N2X3Byb2dfZ2NjPXllcwogZWxzZQogICBhY19jdl9wcm9nX2djYz1ubwpAQCAtNzUwLDcgKzc1Miw3IEBACiAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgogICBDRkxBR1M9CiAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzU0OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQorZWNobyAiY29uZmlndXJlOjc1NjogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNzc4LDcgKzc4MCw3IEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzgyOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CitlY2hvICJjb25maWd1cmU6Nzg0OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CiAjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgogaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KICAgQ1BQPQpAQCAtNzkzLDEzICs3OTUsMTMgQEAKICAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKICAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzk3ICJjb25maWd1cmUiCisjbGluZSA3OTkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPGFzc2VydC5oPgogU3ludGF4IEVycm9yCiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjgwMzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODA1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICA6CkBAIC04MTAsMTMgKzgxMiwxMyBAQAogICBybSAtcmYgY29uZnRlc3QqCiAgIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODE0ICJjb25maWd1cmUiCisjbGluZSA4MTYgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPGFzc2VydC5oPgogU3ludGF4IEVycm9yCiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjgyMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODIyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICA6CkBAIC04NDMsNyArODQ1LDcgQEAKICMgVXNlcyBhY18gdmFycyBhcyB0ZW1wcyB0byBhbGxvdyBjb21tYW5kIGxpbmUgdG8gb3ZlcnJpZGUgY2FjaGUgYW5kIGNoZWNrcy4KICMgLS13aXRob3V0LXggb3ZlcnJpZGVzIGV2ZXJ5dGhpbmcgZWxzZSwgYnV0IGRvZXMgbm90IHRvdWNoIHRoZSBjYWNoZS4KIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBYIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NDc6IGNoZWNraW5nIGZvciBYIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo4NDk6IGNoZWNraW5nIGZvciBYIiA+JjUKIAogIyBDaGVjayB3aGV0aGVyIC0td2l0aC14IG9yIC0td2l0aG91dC14IHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7d2l0aF94K3NldH0iID0gc2V0OyB0aGVuCkBAIC05MDUsMTIgKzkwNywxMiBAQAogCiAgICMgRmlyc3QsIHRyeSB1c2luZyB0aGF0IGZpbGUgd2l0aCBubyBzcGVjaWFsIGRpcmVjdG9yeSBzcGVjaWZpZWQuCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5MDkgImNvbmZpZ3VyZSIKKyNsaW5lIDkxMSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8JHhfZGlyZWN0X3Rlc3RfaW5jbHVkZT4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6OTE0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTk3OSwxNCArOTgxLDE0IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiAgIExJQlM9Ii1sJHhfZGlyZWN0X3Rlc3RfbGlicmFyeSAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDk4MyAiY29uZmlndXJlIgorI2xpbmUgOTg1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CiAke3hfZGlyZWN0X3Rlc3RfZnVuY3Rpb259KCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5OTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5OTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIExJQlM9IiRhY19zYXZlX0xJQlMiCiAjIFdlIGNhbiBsaW5rIFggcHJvZ3JhbXMgd2l0aCBubyBzcGVjaWFsIGxpYnJhcnkgcGF0aC4KQEAgLTEwOTIsMTcgKzEwOTQsMTcgQEAKICAgICBjYXNlICJgKHVuYW1lIC1zcikgMj4vZGV2L251bGxgIiBpbgogICAgICJTdW5PUyA1IiopCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIC1SIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzcGFjZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA5NjogY2hlY2tpbmcgd2hldGhlciAtUiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3BhY2UiID4mNQorZWNobyAiY29uZmlndXJlOjEwOTg6IGNoZWNraW5nIHdoZXRoZXIgLVIgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlIiA+JjUKICAgICAgIGFjX3hzYXZlX0xJQlM9IiRMSUJTIjsgTElCUz0iJExJQlMgLVIkeF9saWJyYXJpZXMiCiAgICAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDk5ICJjb25maWd1cmUiCisjbGluZSAxMTAxICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEwODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfUl9ub3NwYWNlPXllcwogZWxzZQpAQCAtMTExOCwxNCArMTEyMCwxNCBAQAogICAgICAgZWxzZQogCUxJQlM9IiRhY194c2F2ZV9MSUJTIC1SICR4X2xpYnJhcmllcyIKIAljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTIyICJjb25maWd1cmUiCisjbGluZSAxMTI0ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTI5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEzMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfUl9zcGFjZT15ZXMKIGVsc2UKQEAgLTExNTcsNyArMTE1OSw3IEBACiAgICAgIyBsaWJyYXJpZXMgd2VyZSBidWlsdCB3aXRoIERFQ25ldCBzdXBwb3J0LiAgQW5kIGthcmxAY3MudW1iLmVkdSBzYXlzCiAgICAgIyB0aGUgQWxwaGEgbmVlZHMgZG5ldF9zdHViIChkbmV0IGRvZXMgbm90IGV4aXN0KS4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE2MTogY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXQiID4mNQorZWNobyAiY29uZmlndXJlOjExNjM6IGNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0IiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gZG5ldCdfJ2RuZXRfbnRvYSB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTE2NSw3ICsxMTY3LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sZG5ldCAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTY5ICJjb25maWd1cmUiCisjbGluZSAxMTcxICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xMTc2LDcgKzExNzgsNyBAQAogZG5ldF9udG9hKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTgwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE4MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTExOTgsNyArMTIwMCw3IEBACiAKICAgICBpZiB0ZXN0ICRhY19jdl9saWJfZG5ldF9kbmV0X250b2EgPSBubzsgdGhlbgogICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXRfc3R1YiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIwMjogY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXRfc3R1YiIgPiY1CitlY2hvICJjb25maWd1cmU6MTIwNDogY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXRfc3R1YiIgPiY1CiBhY19saWJfdmFyPWBlY2hvIGRuZXRfc3R1YidfJ2RuZXRfbnRvYSB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTIwNiw3ICsxMjA4LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sZG5ldF9zdHViICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMTAgImNvbmZpZ3VyZSIKKyNsaW5lIDEyMTIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTEyMTcsNyArMTIxOSw3IEBACiBkbmV0X250b2EoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyMjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTI0NiwxMiArMTI0OCwxMiBAQAogICAgICMgVGhlIG5zbCBsaWJyYXJ5IHByZXZlbnRzIHByb2dyYW1zIGZyb20gb3BlbmluZyB0aGUgWCBkaXNwbGF5CiAgICAgIyBvbiBJcml4IDUuMiwgYWNjb3JkaW5nIHRvIGRpY2tleUBjbGFyay5uZXQuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNTA6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxMjUyOiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI1NSAiY29uZmlndXJlIgorI2xpbmUgMTI1NyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBnZXRob3N0YnluYW1lKCk7IGJlbG93LiAgKi8KQEAgLTEyNzQsNyArMTI3Niw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjc4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI4MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lPXllcyIKIGVsc2UKQEAgLTEyOTUsNyArMTI5Nyw3IEBACiAKICAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX2dldGhvc3RieW5hbWUgPSBubzsgdGhlbgogICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyOTk6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxMzAxOiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1CiBhY19saWJfdmFyPWBlY2hvIG5zbCdfJ2dldGhvc3RieW5hbWUgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTEzMDMsNyArMTMwNSw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbG5zbCAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzA3ICJjb25maWd1cmUiCisjbGluZSAxMzA5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xMzE0LDcgKzEzMTYsNyBAQAogZ2V0aG9zdGJ5bmFtZSgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMxODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xMzQ0LDEyICsxMzQ2LDEyIEBACiAgICAgIyAtbHNvY2tldCBtdXN0IGJlIGdpdmVuIGJlZm9yZSAtbG5zbCBpZiBib3RoIGFyZSBuZWVkZWQuCiAgICAgIyBXZSBhc3N1bWUgdGhhdCBpZiBjb25uZWN0IG5lZWRzIC1sbnNsLCBzbyBkb2VzIGdldGhvc3RieW5hbWUuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNvbm5lY3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNDg6IGNoZWNraW5nIGZvciBjb25uZWN0IiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxMzUwOiBjaGVja2luZyBmb3IgY29ubmVjdCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19jb25uZWN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM1MyAiY29uZmlndXJlIgorI2xpbmUgMTM1NSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBjb25uZWN0KCk7IGJlbG93LiAgKi8KQEAgLTEzNzIsNyArMTM3NCw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzc2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM3ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfZnVuY19jb25uZWN0PXllcyIKIGVsc2UKQEAgLTEzOTMsNyArMTM5NSw3IEBACiAKICAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX2Nvbm5lY3QgPSBubzsgdGhlbgogICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNvbm5lY3QgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzOTc6IGNoZWNraW5nIGZvciBjb25uZWN0IGluIC1sc29ja2V0IiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxMzk5OiBjaGVja2luZyBmb3IgY29ubmVjdCBpbiAtbHNvY2tldCIgPiY1CiBhY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ2Nvbm5lY3QgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTE0MDEsNyArMTQwMyw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbHNvY2tldCAkWF9FWFRSQV9MSUJTICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQwNSAiY29uZmlndXJlIgorI2xpbmUgMTQwNyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtMTQxMiw3ICsxNDE0LDcgQEAKIGNvbm5lY3QoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDE4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTQzNiwxMiArMTQzOCwxMiBAQAogCiAgICAgIyBnb21lekBtaS51bmktZXJsYW5nZW4uZGUgc2F5cyAtbHBvc2l4IGlzIG5lY2Vzc2FyeSBvbiBBL1VYLgogICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciByZW1vdmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0NDA6IGNoZWNraW5nIGZvciByZW1vdmUiID4mNQorZWNobyAiY29uZmlndXJlOjE0NDI6IGNoZWNraW5nIGZvciByZW1vdmUiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfcmVtb3ZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ0NSAiY29uZmlndXJlIgorI2xpbmUgMTQ0NyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciByZW1vdmUoKTsgYmVsb3cuICAqLwpAQCAtMTQ2NCw3ICsxNDY2LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0Njg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jX3JlbW92ZT15ZXMiCiBlbHNlCkBAIC0xNDg1LDcgKzE0ODcsNyBAQAogCiAgICAgaWYgdGVzdCAkYWNfY3ZfZnVuY19yZW1vdmUgPSBubzsgdGhlbgogICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJlbW92ZSBpbiAtbHBvc2l4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDg5OiBjaGVja2luZyBmb3IgcmVtb3ZlIGluIC1scG9zaXgiID4mNQorZWNobyAiY29uZmlndXJlOjE0OTE6IGNoZWNraW5nIGZvciByZW1vdmUgaW4gLWxwb3NpeCIgPiY1CiBhY19saWJfdmFyPWBlY2hvIHBvc2l4J18ncmVtb3ZlIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xNDkzLDcgKzE0OTUsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxwb3NpeCAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDk3ICJjb25maWd1cmUiCisjbGluZSAxNDk5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xNTA0LDcgKzE1MDYsNyBAQAogcmVtb3ZlKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTA4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUxMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTE1MjgsMTIgKzE1MzAsMTIgQEAKIAogICAgICMgQlNESSBCU0QvT1MgMi4xIG5lZWRzIC1saXBjIGZvciBYT3BlbkRpc3BsYXkuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNobWF0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTMyOiBjaGVja2luZyBmb3Igc2htYXQiID4mNQorZWNobyAiY29uZmlndXJlOjE1MzQ6IGNoZWNraW5nIGZvciBzaG1hdCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19zaG1hdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1MzcgImNvbmZpZ3VyZSIKKyNsaW5lIDE1MzkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAogICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgc2htYXQoKTsgYmVsb3cuICAqLwpAQCAtMTU1Niw3ICsxNTU4LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1NjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTYyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jX3NobWF0PXllcyIKIGVsc2UKQEAgLTE1NzcsNyArMTU3OSw3IEBACiAKICAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX3NobWF0ID0gbm87IHRoZW4KICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaG1hdCBpbiAtbGlwYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU4MTogY2hlY2tpbmcgZm9yIHNobWF0IGluIC1saXBjIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxNTgzOiBjaGVja2luZyBmb3Igc2htYXQgaW4gLWxpcGMiID4mNQogYWNfbGliX3Zhcj1gZWNobyBpcGMnXydzaG1hdCB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTU4NSw3ICsxNTg3LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1saXBjICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1ODkgImNvbmZpZ3VyZSIKKyNsaW5lIDE1OTEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTE1OTYsNyArMTU5OCw3IEBACiBzaG1hdCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYwMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xNjI5LDcgKzE2MzEsNyBAQAogICAjIGxpYnJhcmllcyB3ZSBjaGVjayBmb3IgYmVsb3csIHNvIHVzZSBhIGRpZmZlcmVudCB2YXJpYWJsZS4KICAgIyAgLS1pbnRlcnJhbkB1bHVydS5TdGFuZm9yZC5FRFUsIGtiQGNzLnVtYi5lZHUuCiAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBJY2VDb25uZWN0aW9uTnVtYmVyIGluIC1sSUNFIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjMzOiBjaGVja2luZyBmb3IgSWNlQ29ubmVjdGlvbk51bWJlciBpbiAtbElDRSIgPiY1CitlY2hvICJjb25maWd1cmU6MTYzNTogY2hlY2tpbmcgZm9yIEljZUNvbm5lY3Rpb25OdW1iZXIgaW4gLWxJQ0UiID4mNQogYWNfbGliX3Zhcj1gZWNobyBJQ0UnXydJY2VDb25uZWN0aW9uTnVtYmVyIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xNjM3LDcgKzE2MzksNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxJQ0UgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTY0MSAiY29uZmlndXJlIgorI2xpbmUgMTY0MyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtMTY0OCw3ICsxNjUwLDcgQEAKIEljZUNvbm5lY3Rpb25OdW1iZXIoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjU0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTY3Nyw3ICsxNjc5LDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2ODE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MTY4MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1lBQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMTcwOSw3ICsxNzExLDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZmxleCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgZmxleDsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzEzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjE3MTU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMTc0Miw3ICsxNzQ0LDcgQEAKICAgKikgYWNfbGliPWwgOzsKICAgZXNhYwogICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc0NjogY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiID4mNQorZWNobyAiY29uZmlndXJlOjE3NDg6IGNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gJGFjX2xpYidfJ3l5d3JhcCB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTc1MCw3ICsxNzUyLDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sJGFjX2xpYiAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNzU0ICJjb25maWd1cmUiCisjbGluZSAxNzU2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xNzYxLDcgKzE3NjMsNyBAQAogeXl3cmFwKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzY1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc2NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTE3ODYsNyArMTc4OCw3IEBACiAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3OTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MTc5MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0xODIzLDcgKzE4MjUsNyBAQAogIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgogIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODI3OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxODI5OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKIGlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xODczLDcgKzE4NzUsNyBAQAogdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg3NzogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1CitlY2hvICJjb25maWd1cmU6MTg3OTogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MTl9TJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTE4OTQsNyArMTg5Niw3IEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgaTM4Nl9zZXRfbGR0IGluIC1saTM4NiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg5ODogY2hlY2tpbmcgZm9yIGkzODZfc2V0X2xkdCBpbiAtbGkzODYiID4mNQorZWNobyAiY29uZmlndXJlOjE5MDA6IGNoZWNraW5nIGZvciBpMzg2X3NldF9sZHQgaW4gLWxpMzg2IiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gaTM4NidfJ2kzODZfc2V0X2xkdCB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTkwMiw3ICsxOTA0LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1saTM4NiAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTA2ICJjb25maWd1cmUiCisjbGluZSAxOTA4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xOTEzLDcgKzE5MTUsNyBAQAogaTM4Nl9zZXRfbGR0KCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTE3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTkxOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTE5NDEsNyArMTk0Myw3IEBACiB0aGVuCiAgIENGTEFHUz0iJENGTEFHUyAtV2FsbCIKICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBnY2Mgc3RyZW5ndGgtcmVkdWNlIGJ1ZyIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NDU6IGNoZWNraW5nICJmb3IgZ2NjIHN0cmVuZ3RoLXJlZHVjZSBidWciIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxOTQ3OiBjaGVja2luZyAiZm9yIGdjYyBzdHJlbmd0aC1yZWR1Y2UgYnVnIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTE5NDksNyArMTk1MSw3IEBACiAgIGFjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zz0ieWVzIgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTUzICJjb25maWd1cmUiCisjbGluZSAxOTU1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4odm9pZCkgewpAQCAtMTk2MCw3ICsxOTYyLDcgQEAKICAgZXhpdCggQXJyYXlbMV0gIT0gLTIgKTsKIH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTY0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5NjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnPSJubyIKIGVsc2UKQEAgLTE5ODMsNyArMTk4NSw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk4NzogY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIgPiY1CitlY2hvICJjb25maWd1cmU6MTk4OTogY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19leHRlcm5fcHJlZml4JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTE5OTUsMTQgKzE5OTcsMTQgQEAKIAkubG9uZyAwCiBFT0YKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE5OTkgImNvbmZpZ3VyZSIKKyNsaW5lIDIwMDEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogZXh0ZXJuIGludCBhY190ZXN0OwogaW50IG1haW4oKSB7CiBpZiAoYWNfdGVzdCkgcmV0dXJuIDEKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAwODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19leHRlcm5fcHJlZml4PSJ5ZXMiCiBlbHNlCkBAIC0yMDI1LDI0ICsyMDI3LDI1IEBACiBmaQogCiAKLWlmIHRlc3QgIiRNQUlOX1RBUkdFVCIgPSAibGlid2luZS5zby4xLjAiCitETExGTEFHUz0iIgoraWYgdGVzdCAiJExJQl9UQVJHRVQiID0gImxpYndpbmUuc28uMS4wIgogdGhlbgogICBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBkbGwiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDMyOiBjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBkbGwiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMDM1OiBjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBkbGwiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2RsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIHNhdmVkX2NmbGFncz0kQ0ZMQUdTCiAgIENGTEFHUz0iJENGTEFHUyAtZlBJQyAtc2hhcmVkIC1XbCwtc29uYW1lLGNvbmZ0ZXN0LnNvLjEuMCIKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjAzOSAiY29uZmlndXJlIgorI2xpbmUgMjA0MiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewogcmV0dXJuIDEKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDQ2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA0OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19kbGw9InllcyIKIGVsc2UKQEAgLTIwNTksMjIgKzIwNjIsMjMgQEAKIGVjaG8gIiRhY190IiIkYWNfY3ZfY19kbGwiIDE+JjYKICAgaWYgdGVzdCAiJGFjX2N2X2NfZGxsIiA9ICJ5ZXMiCiAgIHRoZW4KLSAgICBDRkxBR1M9IiRDRkxBR1MgLWZQSUMiCisgICAgRExMRkxBR1M9Ii1mUElDIgogICBlbHNlCi0gICAgTUFJTl9UQVJHRVQ9ImxpYndpbmUuYSIKKyAgICBMSUJfVEFSR0VUPSJsaWJ3aW5lLmEiCiAgIGZpCiBmaQogCiAKKwogZm9yIGFjX2Z1bmMgaW4gbWVtbW92ZSB0Y2dldGF0dHIgdXNsZWVwIHdhaXQ0IHdhaXRwaWQKIGRvCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNzM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICJjb25maWd1cmU6MjA3NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjA3OCAiY29uZmlndXJlIgorI2xpbmUgMjA4MiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCkBAIC0yMDk3LDcgKzIxMDEsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEwMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMDU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgogZWxzZQpAQCAtMjEyMiwxMiArMjEyNiwxMiBAQAogZG9uZQogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTI2OiBjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMTMwOiBjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RhdF9icm9rZW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTMxICJjb25maWd1cmUiCisjbGluZSAyMTM1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgpAQCAtMjE3OCwxMiArMjE4MiwxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxODI6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMTg2OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxODcgImNvbmZpZ3VyZSIKKyNsaW5lIDIxOTEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKQEAgLTIyMzIsNyArMjIzNiw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjM2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNDA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX2NvbnN0PXllcwogZWxzZQpAQCAtMjI1MywxMiArMjI1NywxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNTc6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMjYxOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjYyICJjb25maWd1cmUiCisjbGluZSAyMjY2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KQEAgLTIyNjYsNyArMjI3MCw3IEBACiAjaW5jbHVkZSA8ZmxvYXQuaD4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI3MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjI3NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtMjI4Myw3ICsyMjg3LDcgQEAKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCiAgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyODcgImNvbmZpZ3VyZSIKKyNsaW5lIDIyOTEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0cmluZy5oPgogRU9GCkBAIC0yMzAxLDcgKzIzMDUsNyBAQAogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMwNSAiY29uZmlndXJlIgorI2xpbmUgMjMwOSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RkbGliLmg+CiBFT0YKQEAgLTIzMjIsNyArMjMyNiw3IEBACiAgIDoKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMyNiAiY29uZmlndXJlIgorI2xpbmUgMjMzMCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQpAQCAtMjMzMyw3ICsyMzM3LDcgQEAKIGV4aXQgKDApOyB9CiAKIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzM3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgOgogZWxzZQpAQCAtMjM1NywxMiArMjM2MSwxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM2MTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitlY2hvICJjb25maWd1cmU6MjM2NTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzY2ICJjb25maWd1cmUiCisjbGluZSAyMzcwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpZiBTVERDX0hFQURFUlMKQEAgLTI1NTgsNiArMjU2Miw3IEBACiBzJUBMRExJQlNAJSRMRExJQlMlZwogcyVAUFJPR0VYVEAlJFBST0dFWFQlZwogcyVATUFJTl9UQVJHRVRAJSRNQUlOX1RBUkdFVCVnCitzJUBMSUJfVEFSR0VUQCUkTElCX1RBUkdFVCVnCiBzJUBPUFRJT05TQCUkT1BUSU9OUyVnCiBzJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKIHMlQENDQCUkQ0MlZwpAQCAtMjU3Myw2ICsyNTc4LDcgQEAKIHMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCiBzJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwogcyVATE5fU0AlJExOX1MlZworcyVARExMRkxBR1NAJSRETExGTEFHUyVnCiAvQE1BS0VfUlVMRVNAL3IgJE1BS0VfUlVMRVMKIHMlQE1BS0VfUlVMRVNAJSVnCiAKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgppbmRleCA5ZTk3ZDI4Li45ZTRkNzAyIDEwMDY0NAotLS0gYS9jb25maWd1cmUuaW4KKysrIGIvY29uZmlndXJlLmluCkBAIC0xMiwyMCArMTIsMjQgQEAKIAogZG5sICoqKiogQ29tbWFuZC1saW5lIGFyZ3VtZW50cyAqKioqCiAKLUFDX0FSR19XSVRIKGxpYnJhcnksCi1bICAtLXdpdGgtbGlicmFyeSAgICAgICAgICBidWlsZCBXaW5lIGFzIGEgbGlicmFyeSBpbnN0ZWFkIG9mIGFuIGVtdWxhdG9yXSwKLVtPUFRJT05TPSItRFdJTkVMSUIiIE1BSU5fVEFSR0VUPSJsaWJ3aW5lLmEiXSwKLVtPUFRJT05TPSIiIE1BSU5fVEFSR0VUPSJ3aW5lIl0pCitkbmwgRGVmYXVsdCB2YWx1ZXMKK01BSU5fVEFSR0VUPWVtdQorTElCX1RBUkdFVD1saWJ3aW5lLmEKIAotQUNfQVJHX1dJVEgoZGxsLAotWyAgLS13aXRoLWRsbCAgICAgICAgICAgICAgYnVpbGQgV2luZSBhcyBhIERMTCBpbnN0ZWFkIG9mIGFuIGVtdWxhdG9yXSwKLVtPUFRJT05TPSItRFdJTkVMSUIiIE1BSU5fVEFSR0VUPSJsaWJ3aW5lLnNvLjEuMCJdKQorQUNfQVJHX0VOQUJMRShlbXVsYXRvciwKK1sgIC0tZGlzYWJsZS1lbXVsYXRvciAgICAgIGJ1aWxkIG9ubHkgdGhlIFdpbmUgbGlicmFyeSwgbm90IHRoZSBlbXVsYXRvcl0sCitbaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAibm8iOyB0aGVuIE1BSU5fVEFSR0VUPSJsaWIiOyBmaV0pCisKK0FDX0FSR19FTkFCTEUoZGxsLAorWyAgLS1lbmFibGUtZGxsICAgICAgICAgICAgYnVpbGQgdGhlIFdpbmUgbGlicmFyeSBhcyBhIERMTF0sCitbaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAibm8iOyB0aGVuIDogOyBlbHNlIExJQl9UQVJHRVQ9ImxpYndpbmUuc28uMS4wIjsgZmldKQogCiBBQ19BUkdfV0lUSChpcGMsCi1bICAtLXdpdGgtaXBjICAgICAgICAgICAgICB1c2UgaW50ZXItcHJvY2VzcyBjb21tdW5pY2F0aW9uIGZvciBEREVdLAotW09QVElPTlM9IiRPUFRJT05TIC1EQ09ORklHX0lQQyJdKQorWyAgLS1lbmFibGUtaXBjICAgICAgICAgICAgdXNlIGludGVyLXByb2Nlc3MgY29tbXVuaWNhdGlvbiBmb3IgRERFXSwKK1tpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyI7IHRoZW4gOiA7IGVsc2UgT1BUSU9OUz0iLURDT05GSUdfSVBDIjsgZmldKQogCiBBQ19TVUJTVChNQUlOX1RBUkdFVCkKK0FDX1NVQlNUKExJQl9UQVJHRVQpCiBBQ19TVUJTVChPUFRJT05TKQogCiBkbmwgKioqKiBDaGVjayBmb3Igc29tZSBwcm9ncmFtcyBhbmQgbGlicmFyaWVzICoqKioKQEAgLTg5LDcgKzkzLDggQEAKIAogZG5sICoqKiogQ2hlY2sgZm9yIHdvcmtpbmcgZGxsICoqKioKIAotaWYgdGVzdCAiJE1BSU5fVEFSR0VUIiA9ICJsaWJ3aW5lLnNvLjEuMCIKK0RMTEZMQUdTPSIiCitpZiB0ZXN0ICIkTElCX1RBUkdFVCIgPSAibGlid2luZS5zby4xLjAiCiB0aGVuCiAgIEFDX0NBQ0hFX0NIRUNLKCJ3aGV0aGVyIHdlIGNhbiBidWlsZCBhIGRsbCIsCiAgICAgICAgICAgICAgICAgIGFjX2N2X2NfZGxsLApAQCAtMTAwLDExICsxMDUsMTIgQEAKICAgXSkKICAgaWYgdGVzdCAiJGFjX2N2X2NfZGxsIiA9ICJ5ZXMiCiAgIHRoZW4KLSAgICBDRkxBR1M9IiRDRkxBR1MgLWZQSUMiCisgICAgRExMRkxBR1M9Ii1mUElDIgogICBlbHNlCi0gICAgTUFJTl9UQVJHRVQ9ImxpYndpbmUuYSIKKyAgICBMSUJfVEFSR0VUPSJsaWJ3aW5lLmEiCiAgIGZpCiBmaQorQUNfU1VCU1QoRExMRkxBR1MpCiAKIGRubCAqKioqIENoZWNrIGZvciBmdW5jdGlvbnMgYW5kIGhlYWRlciBmaWxlcyAqKioqCiAKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL01ha2VmaWxlLmluIGIvY29udHJvbHMvTWFrZWZpbGUuaW4KaW5kZXggMjk3NGJhNS4uM2E2NGE3YiAxMDA2NDQKLS0tIGEvY29udHJvbHMvTWFrZWZpbGUuaW4KKysrIGIvY29udHJvbHMvTWFrZWZpbGUuaW4KQEAgLTEsNCArMSw0IEBACi1ERUZTICAgICAgPSAtRF9fV0lORV9fCitERUZTICAgICAgPSBARExMRkxBR1NAIC1EX19XSU5FX18KIFRPUFNSQ0RJUiA9IEB0b3Bfc3JjZGlyQAogVE9QT0JKRElSID0gLi4KIFNSQ0RJUiAgICA9IEBzcmNkaXJACmRpZmYgLS1naXQgYS9jb250cm9scy9idXR0b24uYyBiL2NvbnRyb2xzL2J1dHRvbi5jCmluZGV4IDI3ZTczYzQuLjgzNjA3MGQgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2J1dHRvbi5jCisrKyBiL2NvbnRyb2xzL2J1dHRvbi5jCkBAIC0xMTAsMTUgKzExMCwxNiBAQAogICAgICAgICByZXR1cm4gMDsKIAogICAgIGNhc2UgV01fRVJBU0VCS0dORDoKLSAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAxOwogCiAgICAgY2FzZSBXTV9QQUlOVDoKICAgICAgICAgaWYgKGJ0blBhaW50RnVuY1tzdHlsZV0pCiAgICAgICAgIHsKICAgICAgICAgICAgIFBBSU5UU1RSVUNUMzIgcHM7Ci0gICAgICAgICAgICBIREMzMiBoZGMgPSBCZWdpblBhaW50MzIoIGhXbmQsICZwcyApOworICAgICAgICAgICAgSERDMzIgaGRjID0gd1BhcmFtID8gKEhEQzMyKXdQYXJhbSA6IEJlZ2luUGFpbnQzMiggaFduZCwgJnBzICk7CisJICAgIFNldEJrTW9kZTMyKCBoZGMsIE9QQVFVRSApOwogICAgICAgICAgICAgKGJ0blBhaW50RnVuY1tzdHlsZV0pKCB3bmRQdHIsIGhkYywgT0RBX0RSQVdFTlRJUkUgKTsKLSAgICAgICAgICAgIEVuZFBhaW50MzIoIGhXbmQsICZwcyApOworICAgICAgICAgICAgaWYoICF3UGFyYW0gKSBFbmRQYWludDMyKCBoV25kLCAmcHMgKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIApAQCAtMzg0LDcgKzM4NSwxNSBAQAogICAgIHJib3ggPSBydGV4dCA9IGNsaWVudDsKIAogICAgIGlmIChpbmZvUHRyLT5oRm9udCkgU2VsZWN0T2JqZWN0MzIoIGhEQywgaW5mb1B0ci0+aEZvbnQgKTsKLSAgICBoQnJ1c2ggPSBCVVRUT05fU0VORF9DVExDT0xPUiggd25kUHRyLCBoREMgKTsKKworICAgIC8qIFNvbWV0aGluZyBpcyBzdGlsbCBub3QgcmlnaHQsIGNoZWNrYm94ZXMgKGFuZCBlZGl0IGNvbnRyb2xzKQorICAgICAqIGluIHdzcGluZzMyIGhhdmUgd2hpdGUgYmFja2dyb3VuZHMgaW5zdGVhZCBvZiBkYXJrIGdyZXkuCisgICAgICogQlVUVE9OX1NFTkRfQ1RMQ09MT1IoKSBpcyBldmVuIHdvcnNlIHNpbmNlIGl0IHJldHVybnMgMCBpbiB0aGlzCisgICAgICogcGFydGljdWxhciBjYXNlIGFuZCB0aGUgYmFja2dyb3VuZCBpcyBub3QgcGFpbnRlZCBhdCBhbGwuCisgICAgICovCisKKyAgICBoQnJ1c2ggPSBHZXRDb250cm9sQnJ1c2goIHduZFB0ci0+aHduZFNlbGYsIGhEQywgQ1RMQ09MT1JfQlROICk7CisKICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgQlNfTEVGVFRFWFQpIAogICAgIHsKIAkvKiBtYWdpYyArNCBpcyB3aGF0IENUTDNEIGV4cGVjdHMgKi8KQEAgLTQyMyw2ICs0MzIsNyBAQAogICAgICAgICAgICAgICAgIFNldFRleHRDb2xvcjMyKCBoREMsIEdldFN5c0NvbG9yMzIoQ09MT1JfR1JBWVRFWFQpICk7CiAgICAgICAgICAgICBEcmF3VGV4dDE2KCBoREMsIHduZFB0ci0+dGV4dCwgdGV4dGxlbiwgJnJ0ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgRFRfU0lOR0xFTElORSB8IERUX1ZDRU5URVIgKTsKKwkgICAgdGV4dGxlbiA9IDA7IC8qIHNraXAgRHJhd1RleHQoKSBiZWxvdyAqLwogICAgICAgICB9CiAgICAgfQogCkBAIC00NTMsMTQgKzQ2MywxOSBAQAogICovCiBzdGF0aWMgdm9pZCBCVVRUT05fQ2hlY2tBdXRvUmFkaW9CdXR0b24oIFdORCAqd25kUHRyICkKIHsKLSAgICBIV05EMzIgcGFyZW50LCBzaWJsaW5nOworICAgIEhXTkQzMiBwYXJlbnQsIHNpYmxpbmcsIHN0YXJ0OwogICAgIGlmICghKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSkgcmV0dXJuOwogICAgIHBhcmVudCA9IHduZFB0ci0+cGFyZW50LT5od25kU2VsZjsKLSAgICBmb3Ioc2libGluZyA9IEdldE5leHREbGdHcm91cEl0ZW0zMiggcGFyZW50LCB3bmRQdHItPmh3bmRTZWxmLCBGQUxTRSApOwotICAgICAgICBzaWJsaW5nICE9IHduZFB0ci0+aHduZFNlbGYgJiYgc2libGluZyAhPSAwOwotICAgICAgICBzaWJsaW5nID0gR2V0TmV4dERsZ0dyb3VwSXRlbTMyKCBwYXJlbnQsIHNpYmxpbmcsIEZBTFNFICkpCi0JICAgIGlmKChXSU5fRmluZFduZFB0cihzaWJsaW5nKS0+ZHdTdHlsZSAmIDB4MGYpID09IEJTX0FVVE9SQURJT0JVVFRPTikKLQkJU2VuZE1lc3NhZ2UzMkEoIHNpYmxpbmcsIEJNX1NFVENIRUNLMzIsIEJVVFRPTl9VTkNIRUNLRUQsIDAgKTsKKyAgICAvKiBhc3N1cmUgdGhhdCBzdGFydGluZyBjb250cm9sIGlzIG5vdCBkaXNhYmxlZCBvciBpbnZpc2libGUgKi8KKyAgICBzdGFydCA9IHNpYmxpbmcgPSBHZXROZXh0RGxnR3JvdXBJdGVtMzIoIHBhcmVudCwgd25kUHRyLT5od25kU2VsZiwgVFJVRSApOworICAgIGRvCisgICAgeworICAgICAgICBpZiAoIXNpYmxpbmcpIGJyZWFrOworICAgICAgICBpZiAoKHduZFB0ci0+aHduZFNlbGYgIT0gc2libGluZykgJiYKKyAgICAgICAgICAgICgoV0lOX0ZpbmRXbmRQdHIoc2libGluZyktPmR3U3R5bGUgJiAweDBmKSA9PSBCU19BVVRPUkFESU9CVVRUT04pKQorICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIHNpYmxpbmcsIEJNX1NFVENIRUNLMzIsIEJVVFRPTl9VTkNIRUNLRUQsIDAgKTsKKyAgICAgICAgc2libGluZyA9IEdldE5leHREbGdHcm91cEl0ZW0zMiggcGFyZW50LCBzaWJsaW5nLCBGQUxTRSApOworICAgIH0gd2hpbGUgKHNpYmxpbmcgIT0gc3RhcnQpOwogfQogCiAKQEAgLTUwNiw5ICs1MjEsOSBAQAogICAgIEdldENsaWVudFJlY3QxNiggd25kUHRyLT5od25kU2VsZiwgJnJjKTsKIAogICAgIGlmIChpbmZvUHRyLT5oRm9udCkgU2VsZWN0T2JqZWN0MzIoIGhEQywgaW5mb1B0ci0+aEZvbnQgKTsKLSAgICBoQnJ1c2ggPSBCVVRUT05fU0VORF9DVExDT0xPUiggd25kUHRyLCBoREMgKTsKLSAgICBGaWxsUmVjdDE2KCBoREMsICZyYywgaEJydXNoICk7CisgICAgaEJydXNoID0gR2V0Q29udHJvbEJydXNoKCB3bmRQdHItPmh3bmRTZWxmLCBoREMsIENUTENPTE9SX0JUTiApOwogCisgICAgRmlsbFJlY3QxNiggaERDLCAmcmMsIGhCcnVzaCApOwogICAgIGlmICgoYWN0aW9uID09IE9EQV9GT0NVUykgfHwKICAgICAgICAgKChhY3Rpb24gPT0gT0RBX0RSQVdFTlRJUkUpICYmIChpbmZvUHRyLT5zdGF0ZSAmIEJVVFRPTl9IQVNGT0NVUykpKQogICAgICAgICBEcmF3Rm9jdXNSZWN0MTYoIGhEQywgJnJjICk7CmRpZmYgLS1naXQgYS9jb250cm9scy9lZGl0LmMgYi9jb250cm9scy9lZGl0LmMKaW5kZXggYzZiY2FmZS4uYTI4NTg5NSAxMDA2NDQKLS0tIGEvY29udHJvbHMvZWRpdC5jCisrKyBiL2NvbnRyb2xzL2VkaXQuYwpAQCAtMTA1NSwyNCArMTA1NSwzMyBAQAogCQlkYyA9IEdldERDMzIod25kLT5od25kU2VsZik7CiAJCWlmIChlcy0+Zm9udCkKIAkJCW9sZF9mb250ID0gU2VsZWN0T2JqZWN0MzIoZGMsIGVzLT5mb250KTsKLQkJaWYgKHggPCAwKSB7Ci0JCQl4ID0gLXg7Ci0JCQkvKiBGSVhNRTogaW5lZmZpY2llbnQgYWxnb3JpdGhtICovCi0JCQlmb3IgKGluZGV4ID0gZXMtPnhfb2Zmc2V0IDsgaW5kZXggOyBpbmRleC0tKSB7Ci0JCQkJR2V0VGV4dEV4dGVudFBvaW50MzJBKGRjLCB0ZXh0ICsgaW5kZXgsCi0JCQkJCQllcy0+eF9vZmZzZXQgLSBpbmRleCwgJnNpemUpOwotCQkJCWlmIChzaXplLmN4ID4geCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlJTlQzMiBsZW4gPSBsc3RybGVuMzJBKGVzLT50ZXh0KTsKLQkJCS8qIEZJWE1FOiBpbmVmZmljaWVudCBhbGdvcml0aG0gKi8KLQkJCWZvciAoaW5kZXggPSBlcy0+eF9vZmZzZXQgOyBpbmRleCA8IGxlbiA7IGluZGV4KyspIHsKLQkJCQlHZXRUZXh0RXh0ZW50UG9pbnQzMkEoZGMsIHRleHQgKyBlcy0+eF9vZmZzZXQsCi0JCQkJCQlpbmRleCAtIGVzLT54X29mZnNldCwgJnNpemUpOwotCQkJCWlmIChzaXplLmN4ID49IHgpCi0JCQkJCWJyZWFrOwotCQkJfQorCQlpZiAoeCA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJTlQzMiBsb3cgPSAwOworICAgICAgICAgICAgICAgICAgICBJTlQzMiBoaWdoID0gZXMtPnhfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobG93IDwgaGlnaCAtIDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIG1pZCA9IChsb3cgKyBoaWdoKSAvIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXRUZXh0RXh0ZW50UG9pbnQzMkEoIGRjLCB0ZXh0ICsgbWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcy0+eF9vZmZzZXQgLSBtaWQsICZzaXplICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZS5jeCA+IC14KSBsb3cgPSBtaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGhpZ2ggPSBtaWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBsb3c7CisJCX0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJTlQzMiBsb3cgPSBlcy0+eF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIElOVDMyIGhpZ2ggPSBsc3RybGVuMzJBKGVzLT50ZXh0KSArIDE7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsb3cgPCBoaWdoIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldFRleHRFeHRlbnRQb2ludDMyQSggZGMsIHRleHQgKyBlcy0+eF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZCAtIGVzLT54X29mZnNldCwgJnNpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplLmN4ID4geCkgaGlnaCA9IG1pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgbG93ID0gbWlkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gbG93OwogCQl9CiAJCWlmIChlcy0+c3R5bGUgJiBFU19QQVNTV09SRCkKIAkJCUhlYXBGcmVlKGVzLT5oZWFwLCAwICx0ZXh0KTsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2xpc3Rib3guYyBiL2NvbnRyb2xzL2xpc3Rib3guYwppbmRleCAxNjVmNDgzLi5mMTYzYzQ3IDEwMDY0NAotLS0gYS9jb250cm9scy9saXN0Ym94LmMKKysrIGIvY29udHJvbHMvbGlzdGJveC5jCkBAIC00OTIsOSArNDkyLDE0IEBACiAJCQkgICBFVE9fT1BBUVVFIHwgRVRPX0NMSVBQRUQsIHJlY3QsIGl0ZW0tPnN0ciwKIAkJCSAgIHN0cmxlbihpdGVtLT5zdHIpLCBOVUxMICk7CiAgICAgICAgIGVsc2UKKwl7CisJICAgIC8qIE91dHB1dCBlbXB0eSBzdHJpbmcgdG8gcGFpbnQgYmFja2dyb3VuZCBpbiB0aGUgZnVsbCB3aWR0aC4gKi8KKwkgICAgRXh0VGV4dE91dDMyQSggaGRjLCByZWN0LT5sZWZ0ICsgMSwgcmVjdC0+dG9wICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVUT19PUEFRVUUgfCBFVE9fQ0xJUFBFRCwgcmVjdCwgTlVMTCwgMCwgTlVMTCApOwogCSAgICBUYWJiZWRUZXh0T3V0MzJBKCBoZGMsIHJlY3QtPmxlZnQgKyAxICwgcmVjdC0+dG9wICsgMSwKIAkJCSAgICAgIGl0ZW0tPnN0ciwgc3RybGVuKGl0ZW0tPnN0ciksIAogCQkJICAgICAgZGVzY3ItPm5iX3RhYnMsIGRlc2NyLT50YWJzLCAwKTsKKwl9CiAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0tPnNlbGVjdGVkKQogICAgICAgICB7CiAgICAgICAgICAgICBTZXRCa0NvbG9yMzIoIGhkYywgb2xkQmsgKTsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL21lbnUuYyBiL2NvbnRyb2xzL21lbnUuYwppbmRleCBhMzFiMmYxLi4zNWE4OWYxIDEwMDY0NAotLS0gYS9jb250cm9scy9tZW51LmMKKysrIGIvY29udHJvbHMvbWVudS5jCkBAIC0zLDYgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAxOTkzIE1hcnRpbiBBeW90dGUKICAqIENvcHlyaWdodCAxOTk0IEFsZXhhbmRyZSBKdWxsaWFyZAorICogQ29weXJpZ2h0IDE5OTcgTW9ydGVuIFdlbGluZGVyCiAgKi8KIAogLyoKQEAgLTE0Miw2ICsxNDMsNyBAQAogc3RhdGljIFdPUkQgY2hlY2tfYml0bWFwX3dpZHRoID0gMCwgY2hlY2tfYml0bWFwX2hlaWdodCA9IDA7CiBzdGF0aWMgV09SRCBhcnJvd19iaXRtYXBfd2lkdGggPSAwLCBhcnJvd19iaXRtYXBfaGVpZ2h0ID0gMDsKIAorc3RhdGljIEhCSVRNQVAzMiBoU3RkUmFkaW9DaGVjayA9IDA7CiBzdGF0aWMgSEJJVE1BUDMyIGhTdGRDaGVjayA9IDA7CiBzdGF0aWMgSEJJVE1BUDMyIGhTdGRNbkFycm93ID0gMDsKIHN0YXRpYyBIQlJVU0gzMiBoU2hhZGVCcnVzaCA9IDA7CkBAIC0zMTYsMzggKzMxOCw1MCBAQAogICovCiBCT09MMzIgTUVOVV9Jbml0KCkKIHsKLSAgICAvKiBMb2FkIG1lbnUgYml0bWFwcyAqLworICAgIEhCSVRNQVAzMiBoQml0bWFwOworICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHNoYWRlX2JpdHNbMTZdID0geyAweDU1LCAwLCAweEFBLCAwLAorCQkJCQkgICAgMHg1NSwgMCwgMHhBQSwgMCwKKwkJCQkJICAgIDB4NTUsIDAsIDB4QUEsIDAsCisJCQkJCSAgICAweDU1LCAwLCAweEFBLCAwIH07CiAKLSAgICBpZiAoKGhTdGRDaGVjayA9IExvYWRCaXRtYXAzMkEoIDAsIChMUFNUUilNQUtFSU5UUkVTT1VSQ0UoT0JNX0NIRUNLKSApKSkKKyAgICAvKiBMb2FkIG1lbnUgYml0bWFwcyAqLworICAgIGhTdGRDaGVjayA9IExvYWRCaXRtYXAzMkEoMCwgKExQU1RSKU1BS0VJTlRSRVNPVVJDRShPQk1fQ0hFQ0spKTsKKyAgICBoU3RkUmFkaW9DaGVjayA9IExvYWRCaXRtYXAzMkEoMCwgKExQU1RSKU1BS0VJTlRSRVNPVVJDRShPQk1fUkFESU9DSEVDSykpOworICAgIGhTdGRNbkFycm93ID0gTG9hZEJpdG1hcDMyQSgwLCAoTFBTVFIpTUFLRUlOVFJFU09VUkNFKE9CTV9NTkFSUk9XKSk7CisKKyAgICBpZiAoaFN0ZENoZWNrKQogICAgIHsKIAlCSVRNQVAzMiBibTsKLQogCUdldE9iamVjdDMyQSggaFN0ZENoZWNrLCBzaXplb2YoYm0pLCAmYm0gKTsKIAljaGVja19iaXRtYXBfd2lkdGggPSBibS5ibVdpZHRoOwogCWNoZWNrX2JpdG1hcF9oZWlnaHQgPSBibS5ibUhlaWdodDsKKyAgICB9IGVsc2UKKwkgcmV0dXJuIEZBTFNFOwogCi0JaWYgKChoU3RkTW5BcnJvdyA9IExvYWRCaXRtYXAzMkEoMCwoTFBTVFIpTUFLRUlOVFJFU09VUkNFKE9CTV9NTkFSUk9XKSkpKQorICAgIC8qIEFzc3VtZSB0aGF0IHJhZGlvIGNoZWNrcyBoYXZlIHRoZSBzYW1lIHNpemUgYXMgcmVndWxhciBjaGVjay4gICovCisgICAgaWYgKCFoU3RkUmFkaW9DaGVjaykKKwkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKGhTdGRNbkFycm93KQogCXsKLQkgICAgSEJJVE1BUDMyIGhCaXRtYXA7Ci0JICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHNoYWRlX2JpdHNbMTZdID0geyAweDU1LCAwLCAweEFBLCAwLAotCQkJCQkJICAgIDB4NTUsIDAsIDB4QUEsIDAsCi0JCQkJCQkgICAgMHg1NSwgMCwgMHhBQSwgMCwKLQkJCQkJCSAgICAweDU1LCAwLCAweEFBLCAwIH07CisJIEJJVE1BUDMyIGJtOwogCSAgICBHZXRPYmplY3QzMkEoIGhTdGRNbkFycm93LCBzaXplb2YoYm0pLCAmYm0gKTsKIAkgICAgYXJyb3dfYml0bWFwX3dpZHRoID0gYm0uYm1XaWR0aDsKIAkgICAgYXJyb3dfYml0bWFwX2hlaWdodCA9IGJtLmJtSGVpZ2h0OworICAgIH0gZWxzZQorCSByZXR1cm4gRkFMU0U7CiAKLQkgICAgaWYoKGhCaXRtYXAgPSBDcmVhdGVCaXRtYXAzMiggOCwgOCwgMSwgMSwgc2hhZGVfYml0cykpKQorICAgIGlmICgoaEJpdG1hcCA9IENyZWF0ZUJpdG1hcDMyKCA4LCA4LCAxLCAxLCBzaGFkZV9iaXRzKSkpCiAJICAgIHsKIAkJaWYoKGhTaGFkZUJydXNoID0gQ3JlYXRlUGF0dGVybkJydXNoMzIoIGhCaXRtYXAgKSkpCiAJCXsKIAkJICAgIERlbGV0ZU9iamVjdDMyKCBoQml0bWFwICk7Ci0JCSAgICBpZigoTUVOVV9EZWZTeXNQb3B1cCA9IE1FTlVfQ29weVN5c1BvcHVwKCkpKSByZXR1cm4gVFJVRTsKLQkJfQotCSAgICB9CisJICAgICAgaWYgKChNRU5VX0RlZlN5c1BvcHVwID0gTUVOVV9Db3B5U3lzUG9wdXAoKSkpCisJCSAgIHJldHVybiBUUlVFOwogCX0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwkvKiBmYWlsdXJlICovCisKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNzIwLDcgKzczNCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBNRU5VX01lbnVCYXJDYWxjU2l6ZQogICoKLSAqIEZJWE1FOiBXb3JkIDYgaW1wbGVtZW50cyBpdCdzIG93biBNREkgYW5kIGl0J3MgJ2Nsb3NlIHdpbmRvdycgYml0bWFwCisgKiBGSVhNRTogV29yZCA2IGltcGxlbWVudHMgaXRzIG93biBNREkgYW5kIGl0cyBvd24gJ2Nsb3NlIHdpbmRvdycgYml0bWFwCiAgKiBoZWlnaHQgaXMgb2ZmIGJ5IDEgcGl4ZWwgd2hpY2ggY2F1c2VzIGxlbmd0aHkgd2luZG93IHJlbG9jYXRpb25zIHdoZW4KICAqIGFjdGl2ZSBkb2N1bWVudCB3aW5kb3cgaXMgbWF4aW1pemVkL3Jlc3RvcmVkLgogICoKQEAgLTkzNiwxMCArOTUwLDE2IEBACiAJICAgKi8KIAogCWlmIChscGl0ZW0tPmZTdGF0ZSAmIE1GX0NIRUNLRUQpCi0gICAgICAgICAgICBHUkFQSF9EcmF3Qml0bWFwKCBoZGMsIGxwaXRlbS0+aENoZWNrQml0ID8gbHBpdGVtLT5oQ2hlY2tCaXQKLQkJCSAgICAgIDogaFN0ZENoZWNrLCByZWN0LmxlZnQsICh5IC0gY2hlY2tfYml0bWFwX2hlaWdodCkgLyAyLCAKLQkJCSAgICAgIDAsIDAsIGNoZWNrX2JpdG1hcF93aWR0aCwgY2hlY2tfYml0bWFwX2hlaWdodCwgVFJVRSApOwotICAgICAgICBlbHNlIGlmIChscGl0ZW0tPmhVbkNoZWNrQml0KQorCXsKKwkgICAgSEJJVE1BUDMyIGJtID0KKwkJIGxwaXRlbS0+aENoZWNrQml0ID8gbHBpdGVtLT5oQ2hlY2tCaXQgOgorCQkgKChscGl0ZW0tPmZUeXBlICYgTUZUX1JBRElPQ0hFQ0spCisJCSAgPyBoU3RkUmFkaW9DaGVjayA6IGhTdGRDaGVjayk7CisgICAgICAgICAgICBHUkFQSF9EcmF3Qml0bWFwKCBoZGMsIGJtLCByZWN0LmxlZnQsCisJCQkgICAgICAoeSAtIGNoZWNrX2JpdG1hcF9oZWlnaHQpIC8gMiwKKwkJCSAgICAgIDAsIDAsIGNoZWNrX2JpdG1hcF93aWR0aCwKKwkJCSAgICAgIGNoZWNrX2JpdG1hcF9oZWlnaHQsIFRSVUUgKTsKKyAgICAgICAgfSBlbHNlIGlmIChscGl0ZW0tPmhVbkNoZWNrQml0KQogICAgICAgICAgICAgR1JBUEhfRHJhd0JpdG1hcCggaGRjLCBscGl0ZW0tPmhVbkNoZWNrQml0LCByZWN0LmxlZnQsCiAJCQkgICAgICAoeSAtIGNoZWNrX2JpdG1hcF9oZWlnaHQpIC8gMiwgMCwgMCwKIAkJCSAgICAgIGNoZWNrX2JpdG1hcF93aWR0aCwgY2hlY2tfYml0bWFwX2hlaWdodCwgVFJVRSApOwpAQCAtMzg3MiwzICszODkyLDEwNSBAQAogICAgIE1FTlVJVEVNICppdGVtID0gTUVOVV9JbnNlcnRJdGVtKGhNZW51LCB1SXRlbSwgYnlwb3MpOwogICAgIHJldHVybiBTZXRNZW51SXRlbUluZm8zMl9jb21tb24oaXRlbSwgKGNvbnN0IE1FTlVJVEVNSU5GTzMyQSopbHBtaWksIFRSVUUpOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUNoZWNrTWVudVJhZGlvSXRlbTMyICAgIChVU0VSMzIuNDcpCisgKi8KKworQk9PTDMyIFdJTkFQSSBDaGVja01lbnVSYWRpb0l0ZW0zMihITUVOVTMyIGhNZW51LAorCQkJCSAgIFVJTlQzMiBmaXJzdCwgVUlOVDMyIGxhc3QsIFVJTlQzMiBjaGVjaywKKwkJCQkgICBCT09MMzIgYnlwb3MpCit7CisgICAgIE1FTlVJVEVNICptaWZpcnN0LCAqbWlsYXN0LCAqbWljaGVjazsKKyAgICAgSE1FTlUzMiBtZmlyc3QgPSBoTWVudSwgbWxhc3QgPSBoTWVudSwgbWNoZWNrID0gaE1lbnU7CisKKyAgICAgZHByaW50Zl9tZW51IChzdGRkZWIsCisJCSAgICJDaGVja01lbnVSYWRpb0l0ZW0zMjogb3gleDogJWQtJWQsIGNoZWNrICVkLCBieXBvcz0lZFxuIiwKKwkJICAgaE1lbnUsIGZpcnN0LCBsYXN0LCBjaGVjaywgYnlwb3MpOworCisgICAgIG1pZmlyc3QgPSBNRU5VX0ZpbmRJdGVtICgmbWZpcnN0LCAmZmlyc3QsIGJ5cG9zKTsKKyAgICAgbWlsYXN0ID0gTUVOVV9GaW5kSXRlbSAoJm1sYXN0LCAmbGFzdCwgYnlwb3MpOworICAgICBtaWNoZWNrID0gTUVOVV9GaW5kSXRlbSAoJm1jaGVjaywgJmNoZWNrLCBieXBvcyk7CisKKyAgICAgaWYgKG1pZmlyc3QgPT0gTlVMTCB8fCBtaWxhc3QgPT0gTlVMTCB8fCBtaWNoZWNrID09IE5VTEwgfHwKKwkgbWlmaXJzdCA+IG1pbGFzdCB8fCBtZmlyc3QgIT0gbWxhc3QgfHwgbWZpcnN0ICE9IG1jaGVjayB8fAorCSBtaWNoZWNrID4gbWlsYXN0IHx8IG1pY2hlY2sgPCBtaWZpcnN0KQorCSAgcmV0dXJuIEZBTFNFOworCisgICAgIHdoaWxlIChtaWZpcnN0IDw9IG1pbGFzdCkKKyAgICAgeworCSAgaWYgKG1pZmlyc3QgPT0gbWljaGVjaykKKwkgIHsKKwkgICAgICAgbWlmaXJzdC0+ZlR5cGUgfD0gTUZUX1JBRElPQ0hFQ0s7CisJICAgICAgIG1pZmlyc3QtPmZTdGF0ZSB8PSBNRlNfQ0hFQ0tFRDsKKwkgIH0gZWxzZSB7CisJICAgICAgIG1pZmlyc3QtPmZUeXBlICY9IH5NRlRfUkFESU9DSEVDSzsKKwkgICAgICAgbWlmaXJzdC0+ZlN0YXRlICY9IH5NRlNfQ0hFQ0tFRDsKKwkgIH0KKwkgIG1pZmlyc3QrKzsKKyAgICAgfQorCisgICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUNoZWNrTWVudVJhZGlvSXRlbTE2ICAgIChub3QgYSBXaW5kb3dzIEFQSSkKKyAqLworCitCT09MMTYgV0lOQVBJIENoZWNrTWVudVJhZGlvSXRlbTE2KEhNRU5VMTYgaE1lbnUsCisJCQkJICAgVUlOVDE2IGZpcnN0LCBVSU5UMTYgbGFzdCwgVUlOVDE2IGNoZWNrLAorCQkJCSAgIEJPT0wxNiBieXBvcykKK3sKKyAgICAgcmV0dXJuIENoZWNrTWVudVJhZGlvSXRlbTMyIChoTWVudSwgZmlyc3QsIGxhc3QsIGNoZWNrLCBieXBvcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJR2V0TWVudUl0ZW1SZWN0MzIgICAgKFVTRVIzMi4yNjYpCisgKi8KKworQk9PTDMyIFdJTkFQSSBHZXRNZW51SXRlbVJlY3QzMiAoSFdORDMyIGh3bmQsIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiB1SXRlbSwKKwkJCQkgTFBSRUNUMzIgcmVjdCkKK3sKKyAgICAgUkVDVDMyIHNhdmVyZWN0LCBjbGllbnRyZWN0OworICAgICBCT09MMzIgYmFycDsKKyAgICAgSERDMzIgaGRjOworICAgICBXTkQgKnduZFB0cjsKKyAgICAgTUVOVUlURU0gKml0ZW07CisgICAgIEhNRU5VMzIgb3JnaE1lbnUgPSBoTWVudTsKKworICAgICBkcHJpbnRmX21lbnUgKHN0ZGRlYiwgIkdldE1lbnVJdGVtUmVjdDMyICgweCV4LDB4JXgsJWQsJXApXG4iLAorCQkgICBod25kLCBoTWVudSwgdUl0ZW0sIHJlY3QpOworCisgICAgIGl0ZW0gPSBNRU5VX0ZpbmRJdGVtICgmaE1lbnUsICZ1SXRlbSwgTUZfQllQT1NJVElPTik7CisgICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyIChod25kKTsKKyAgICAgaWYgKCFyZWN0IHx8ICFpdGVtIHx8ICF3bmRQdHIpIHJldHVybiBGQUxTRTsKKworICAgICBHZXRDbGllbnRSZWN0MzIoIGh3bmQsICZjbGllbnRyZWN0ICk7CisgICAgIGhkYyA9IEdldERDRXgzMiggaHduZCwgMCwgRENYX0NBQ0hFIHwgRENYX1dJTkRPVyApOworICAgICBiYXJwID0gKGhNZW51ID09IG9yZ2hNZW51KTsKKworICAgICBzYXZlcmVjdCA9IGl0ZW0tPnJlY3Q7CisgICAgIE1FTlVfQ2FsY0l0ZW1TaXplIChoZGMsIGl0ZW0sIGh3bmQsCisJCQljbGllbnRyZWN0LmxlZnQsIGNsaWVudHJlY3QudG9wLCBiYXJwKTsKKyAgICAgKnJlY3QgPSBpdGVtLT5yZWN0OworICAgICBpdGVtLT5yZWN0ID0gc2F2ZXJlY3Q7CisKKyAgICAgUmVsZWFzZURDMzIoIGh3bmQsIGhkYyApOworICAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlHZXRNZW51SXRlbVJlY3QxNiAgICAoVVNFUi42NjUpCisgKi8KKworQk9PTDE2IFdJTkFQSSBHZXRNZW51SXRlbVJlY3QxNiAoSFdORDE2IGh3bmQsIEhNRU5VMTYgaE1lbnUsIFVJTlQxNiB1SXRlbSwKKwkJCQkgTFBSRUNUMTYgcmVjdCkKK3sKKyAgICAgUkVDVDMyIHIzMjsKKyAgICAgQk9PTDMyIHJlczsKKworICAgICBpZiAoIXJlY3QpIHJldHVybiBGQUxTRTsKKyAgICAgcmVzID0gR2V0TWVudUl0ZW1SZWN0MzIgKGh3bmQsIGhNZW51LCB1SXRlbSwgJnIzMik7CisgICAgIENPTlZfUkVDVDMyVE8xNiAoJnIzMiwgcmVjdCk7CisgICAgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9jb250cm9scy9zdGF0aWMuYyBiL2NvbnRyb2xzL3N0YXRpYy5jCmluZGV4IDBlNTY1ZjIuLjlmMWU2ODAgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3N0YXRpYy5jCisrKyBiL2NvbnRyb2xzL3N0YXRpYy5jCkBAIC04NCw3ICs4NCw3IEBACiB7CiAgICAgSElDT04xNiBwcmV2SWNvbjsKICAgICBTVEFUSUNJTkZPICppbmZvUHRyID0gKFNUQVRJQ0lORk8gKil3bmRQdHItPndFeHRyYTsKLSAgICBCSVRNQVBPQkogKmluZm8gPSBHRElfSEVBUF9MT0NLKGhpY29uKTsKKyAgICBCSVRNQVBPQkogKmluZm8gPSAoQklUTUFQT0JKICopR0RJX0hFQVBfTE9DSyhoaWNvbik7CiAKICAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIFNTX1RZUEVNQVNLKSAhPSBTU19CSVRNQVApIHJldHVybiAwOwogICAgIGlmIChoaWNvbiAmJiAhaW5mbykgewpkaWZmIC0tZ2l0IGEvY29udHJvbHMvd2lkZ2V0cy5jIGIvY29udHJvbHMvd2lkZ2V0cy5jCmluZGV4IDgxYWYwMGEuLmFjYjk1NjAgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3dpZGdldHMuYworKysgYi9jb250cm9scy93aWRnZXRzLmMKQEAgLTMyLDMxICszMiw5IEBACiBleHRlcm4gTFJFU1VMVCBXSU5BUEkgSWNvblRpdGxlV25kUHJvYyggSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICk7CiAKLS8qIFdpbjE2IGNsYXNzIGluZm8gKi8KKy8qIEJ1aWx0LWluIGNsYXNzZXMgKi8KIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBVSU5UMTYgICAgIHN0eWxlOwotICAgIElOVDE2ICAgICAgd25kRXh0cmE7Ci0gICAgSEJSVVNIMTYgICBiYWNrZ3JvdW5kOwotICAgIExQQ1NUUiAgICAgcHJvY05hbWU7Ci0gICAgTFBDU1RSICAgICBjbGFzc05hbWU7Ci19IEJVSUxUSU5fQ0xBU1NfSU5GTzE2OwotCi0vKiBXaW4xNiBidWlsdC1pbiBjbGFzc2VzICovCi0KLXN0YXRpYyBjb25zdCBCVUlMVElOX0NMQVNTX0lORk8xNiBXSURHRVRTX0J1aWx0aW5DbGFzc2VzMTZbXSA9Ci17Ci0gICAgeyBDU19HTE9CQUxDTEFTUywgc2l6ZW9mKE1ESUNMSUVOVElORk8pLAotICAgICAgU1RPQ0tfTFRHUkFZX0JSVVNILCAiTURJQ2xpZW50V25kUHJvYyIsICJNRElDbGllbnQiIH0KLX07Ci0KLSNkZWZpbmUgTkJfQlVJTFRJTl9DTEFTU0VTMTYgXAotICAgICAgICAgKHNpemVvZihXSURHRVRTX0J1aWx0aW5DbGFzc2VzMTYpL3NpemVvZihXSURHRVRTX0J1aWx0aW5DbGFzc2VzMTZbMF0pKQotCi0vKiBXaW4zMiBidWlsdC1pbiBjbGFzc2VzICovCi0KLXN0YXRpYyBXTkRDTEFTUzMyQSBXSURHRVRTX0J1aWx0aW5DbGFzc2VzMzJbQklDMzJfTkJfQ0xBU1NFU10gPQorc3RhdGljIFdORENMQVNTMzJBIFdJREdFVFNfQnVpbHRpbkNsYXNzZXNbQklDMzJfTkJfQ0xBU1NFU10gPQogewogICAgIC8qIEJJQzMyX0JVVFRPTiAqLwogICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19EQkxDTEtTIHwgQ1NfVlJFRFJBVyB8IENTX0hSRURSQVcgfCBDU19QQVJFTlREQywKQEAgLTgyLDYgKzYwLDkgQEAKICAgICAvKiBCSUMzMl9TQ1JPTEwgKi8KICAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfREJMQ0xLUyB8IENTX1ZSRURSQVcgfCBDU19IUkVEUkFXIHwgQ1NfUEFSRU5UREMsCiAgICAgICBTY3JvbGxCYXJXbmRQcm9jLCAwLCBzaXplb2YoU0NST0xMQkFSX0lORk8pLCAwLCAwLCBJRENfQVJST1csIDAsIDAsICJTY3JvbGxCYXIifSwKKyAgICAvKiBCSUMzMl9NRElDTElFTlQgKi8KKyAgICB7IENTX0dMT0JBTENMQVNTLCBNRElDbGllbnRXbmRQcm9jLAorICAgICAgMCwgc2l6ZW9mKE1ESUNMSUVOVElORk8pLCAwLCAwLCAwLCBTVE9DS19MVEdSQVlfQlJVU0gsIDAsICJNRElDbGllbnQiIH0sCiAgICAgLyogQklDMzJfREVTS1RPUCAqLwogICAgIHsgQ1NfR0xPQkFMQ0xBU1MsIERlc2t0b3BXbmRQcm9jLCAwLCBzaXplb2YoREVTS1RPUElORk8pLAogICAgICAgMCwgMCwgSURDX0FSUk9XLCAwLCAwLCBERVNLVE9QX0NMQVNTX05BTUUgfSwKQEAgLTEwMyw0NSArODQsMjIgQEAKIEJPT0wzMiBXSURHRVRTX0luaXQodm9pZCkKIHsKICAgICBpbnQgaTsKLSAgICBjaGFyICpuYW1lOwotICAgIGNvbnN0IEJVSUxUSU5fQ0xBU1NfSU5GTzE2ICppbmZvMTYgPSBXSURHRVRTX0J1aWx0aW5DbGFzc2VzMTY7Ci0gICAgV05EQ0xBU1MxNiBjbGFzczE2OwotICAgIFdORENMQVNTMzJBICpjbGFzczMyID0gV0lER0VUU19CdWlsdGluQ2xhc3NlczMyOworICAgIFdORENMQVNTMzJBICpjbHMgPSBXSURHRVRTX0J1aWx0aW5DbGFzc2VzOwogCi0gICAgaWYgKCEobmFtZSA9IFNFR1BUUl9BTExPQyggMjAgKiBzaXplb2YoY2hhcikgKSkpIHJldHVybiBGQUxTRTsKKyAgICAvKiBDcmVhdGUgYnVpbHRpbiBjbGFzc2VzICovCiAKLSAgICAvKiBDcmVhdGUgMTYtYml0IGNsYXNzZXMgKi8KLQotICAgIGNsYXNzMTYuY2JDbHNFeHRyYSAgICA9IDA7Ci0gICAgY2xhc3MxNi5oSW5zdGFuY2UgICAgID0gMDsKLSAgICBjbGFzczE2LmhJY29uICAgICAgICAgPSAwOwotICAgIGNsYXNzMTYuaEN1cnNvciAgICAgICA9IExvYWRDdXJzb3IxNiggMCwgSURDX0FSUk9XICk7Ci0gICAgY2xhc3MxNi5scHN6TWVudU5hbWUgID0gKFNFR1BUUikwOwotICAgIGNsYXNzMTYubHBzekNsYXNzTmFtZSA9IFNFR1BUUl9HRVQobmFtZSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IE5CX0JVSUxUSU5fQ0xBU1NFUzE2OyBpKyssIGluZm8xNisrKQorICAgIGZvciAoaSA9IDA7IGkgPCBCSUMzMl9OQl9DTEFTU0VTOyBpKyssIGNscysrKQogICAgIHsKLSAgICAgICAgY2xhc3MxNi5zdHlsZSAgICAgICAgID0gaW5mbzE2LT5zdHlsZTsKLSAgICAgICAgY2xhc3MxNi5scGZuV25kUHJvYyAgID0gKFdORFBST0MxNilNT0RVTEVfR2V0V25kUHJvY0VudHJ5MTYoIGluZm8xNi0+cHJvY05hbWUgKTsKLSAgICAgICAgY2xhc3MxNi5jYlduZEV4dHJhICAgID0gaW5mbzE2LT53bmRFeHRyYTsKLSAgICAgICAgY2xhc3MxNi5oYnJCYWNrZ3JvdW5kID0gaW5mbzE2LT5iYWNrZ3JvdW5kOwotICAgICAgICBzdHJjcHkoIG5hbWUsIGluZm8xNi0+Y2xhc3NOYW1lICk7Ci0gICAgICAgIGlmICghUmVnaXN0ZXJDbGFzczE2KCAmY2xhc3MxNiApKSByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgLyogQ3JlYXRlIDMyLWJpdCBjbGFzc2VzICovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgQklDMzJfTkJfQ0xBU1NFUzsgaSsrLCBjbGFzczMyKyspCi0gICAgeworICAgICAgICBjaGFyIG5hbWVbMjBdOwogICAgICAgICAvKiBKdXN0IHRvIG1ha2Ugc3VyZSB0aGUgc3RyaW5nIGlzID4gMHgxMDAwMCAqLwotICAgICAgICBzdHJjcHkoIG5hbWUsIChjaGFyICopY2xhc3MzMi0+bHBzekNsYXNzTmFtZSApOwotICAgICAgICBjbGFzczMyLT5scHN6Q2xhc3NOYW1lID0gbmFtZTsKLSAgICAgICAgY2xhc3MzMi0+aEN1cnNvciA9IExvYWRDdXJzb3IxNiggMCwgY2xhc3MzMi0+aEN1cnNvciApOwotICAgICAgICBpZiAoIShiaWNBdG9tVGFibGVbaV0gPSBSZWdpc3RlckNsYXNzMzJBKCBjbGFzczMyICkpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIHN0cmNweSggbmFtZSwgKGNoYXIgKiljbHMtPmxwc3pDbGFzc05hbWUgKTsKKyAgICAgICAgY2xzLT5scHN6Q2xhc3NOYW1lID0gbmFtZTsKKyAgICAgICAgY2xzLT5oQ3Vyc29yID0gTG9hZEN1cnNvcjE2KCAwLCBjbHMtPmhDdXJzb3IgKTsKKyAgICAgICAgaWYgKCEoYmljQXRvbVRhYmxlW2ldID0gUmVnaXN0ZXJDbGFzczMyQSggY2xzICkpKSByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgLyogRklYTUU6IGhhY2sgdG8gZW5hYmxlIHVzaW5nIGJ1aWx0LWluIGNvbnRyb2xzIHdpdGggV2luZG93cyBDT01DVEwzMiAqLwogICAgIEluaXRDb21tb25Db250cm9scygpOwotICAgIFNFR1BUUl9GUkVFKG5hbWUpOwogICAgIHJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9icmVhay5jIGIvZGVidWdnZXIvYnJlYWsuYwppbmRleCBmMjZmN2JlLi4xOWQzMzg2IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9icmVhay5jCisrKyBiL2RlYnVnZ2VyL2JyZWFrLmMKQEAgLTM4OCwxMiArMzg4LDEzIEBACiAgICAgREJHX0FERFIgY29uZF9hZGRyOwogICAgIGludCBicG51bTsKICAgICBzdHJ1Y3QgbGlzdF9pZCBsaXN0OworICAgIFdPUkQgY3M7CiAKICAgICAgIC8qIElmIG5vdCBzaW5nbGUtc3RlcHBpbmcsIGJhY2sgdXAgb3ZlciB0aGUgaW50MyBpbnN0cnVjdGlvbiAqLwogICAgIGlmICghKEVGTF9yZWcoJkRFQlVHX2NvbnRleHQpICYgU1RFUF9GTEFHKSkgRUlQX3JlZygmREVCVUdfY29udGV4dCktLTsKIAotICAgIGFkZHIuc2VnID0gKENTX3JlZygmREVCVUdfY29udGV4dCkgPT0gV0lORV9DT0RFX1NFTEVDVE9SKSA/IAotICAgICAgICAgICAgICAgIDAgOiBDU19yZWcoJkRFQlVHX2NvbnRleHQpOworICAgIEdFVF9DUyhjcyk7CisgICAgYWRkci5zZWcgPSAoQ1NfcmVnKCZERUJVR19jb250ZXh0KSA9PSBjcykgPyAwIDogQ1NfcmVnKCZERUJVR19jb250ZXh0KTsKICAgICBhZGRyLm9mZiA9IEVJUF9yZWcoJkRFQlVHX2NvbnRleHQpOwogICAgICAgICAKICAgICBicG51bSA9IERFQlVHX0ZpbmRCcmVha3BvaW50KCAmYWRkciApOwpAQCAtNTEyLDkgKzUxMywxMCBAQAogICAgIHVuc2lnbmVkIGludCAqIHZhbHVlOwogICAgIGVudW0gZXhlY19tb2RlIHJldF9tb2RlOwogICAgIEJZVEUgKmluc3RyOworICAgIFdPUkQgY3M7CiAKLSAgICBhZGRyLnNlZyA9IChDU19yZWcoJkRFQlVHX2NvbnRleHQpID09IFdJTkVfQ09ERV9TRUxFQ1RPUikgPwotICAgICAgICAgICAgICAgIDAgOiBDU19yZWcoJkRFQlVHX2NvbnRleHQpOworICAgIEdFVF9DUyhjcyk7CisgICAgYWRkci5zZWcgPSAoQ1NfcmVnKCZERUJVR19jb250ZXh0KSA9PSBjcykgPyAwIDogQ1NfcmVnKCZERUJVR19jb250ZXh0KTsKICAgICBhZGRyLm9mZiA9IEVJUF9yZWcoJkRFQlVHX2NvbnRleHQpOwogCiAgICAgLyoKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2RiZy55IGIvZGVidWdnZXIvZGJnLnkKaW5kZXggY2Q4NGM5MC4uNWZhNGI1YiAxMDA2NDQKLS0tIGEvZGVidWdnZXIvZGJnLnkKKysrIGIvZGVidWdnZXIvZGJnLnkKQEAgLTQ0MSwxMyArNDQxLDggQEAKIAkgICAgREVCVUdfUmVhZFN5bWJvbFRhYmxlKCBTeW1ib2xUYWJsZUZpbGUgKTsKICAgICAgICAgfQogCi0JLyoKLQkgKiBSZWFkIENPRkYsIE1TQywgZXRjIGRlYnVnIGluZm9ybWF0aW9uIHRoYXQgd2Ugbm90ZWQgd2hlbiB3ZQotCSAqIHN0YXJ0ZWQgdXAgdGhlIGV4ZWN1dGFibGUuCi0JICovCi0JREVCVUdfUHJvY2Vzc0RlZmVycmVkRGVidWcoKTsKLQogICAgICAgICBERUJVR19Mb2FkRW50cnlQb2ludHMoKTsKKwlERUJVR19Qcm9jZXNzRGVmZXJyZWREZWJ1ZygpOwogCWZwcmludGYoc3RkZXJyLCJcbiIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZGVidWdnZXIvaGFzaC5jIGIvZGVidWdnZXIvaGFzaC5jCmluZGV4IGRjODFiZDYuLjgxNTcxNWEgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2hhc2guYworKysgYi9kZWJ1Z2dlci9oYXNoLmMKQEAgLTYzMywyMSArNjMzLDE5IEBACiAJICogVHJ5IGFuZCBmaW5kIHRoZSBuZWFyZXN0IGxpbmUgbnVtYmVyIHRvIHRoZSBjdXJyZW50IG9mZnNldC4KIAkgKi8KIAlpZiggbmVhcmVzdC0+bGluZXRhYiAhPSBOVUxMICkKLQkgIHsKLQkgICAgLyoKLQkgICAgICogRklYTUUgLSB0aGlzIGlzIGFuIGluZWZmaWNpZW50IGxpbmVhciBzZWFyY2guICBBIGJpbmFyeQotCSAgICAgKiBzZWFyY2ggd291bGQgYmUgYmV0dGVyIGlmIHRoaXMgZ2V0cyB0byBiZSBhIHBlcmZvcm1hbmNlCi0JICAgICAqIGJvdHRsZW5lY2suCi0JICAgICAqLwotCSAgICBmb3IoaT0wOyBpIDwgbmVhcmVzdC0+bl9saW5lczsgaSsrKQotCSAgICAgIHsKLQkJaWYoIGFkZHItPm9mZiA8IG5lYXJlc3QtPmxpbmV0YWJbaV0ucGNfb2Zmc2V0Lm9mZiApCi0JCXsKLQkJICBicmVhazsKLQkJfQotCQlsaW5lbm8gPSBuZWFyZXN0LT5saW5ldGFiW2ldLmxpbmVfbnVtYmVyOwotCSAgICAgIH0KLQkgIH0KKyAgICAgICAgeworICAgICAgICAgICAgbG93ID0gMDsKKyAgICAgICAgICAgIGhpZ2ggPSBuZWFyZXN0LT5uX2xpbmVzOworICAgICAgICAgICAgd2hpbGUgKChoaWdoIC0gbG93KSA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWlkID0gKGhpZ2ggKyBsb3cpIC8gMjsKKyAgICAgICAgICAgICAgICBpZiAoYWRkci0+b2ZmIDwgbmVhcmVzdC0+bGluZXRhYlttaWRdLnBjX29mZnNldC5vZmYpCisgICAgICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBsb3cgPSBtaWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW5lbm8gPSBuZWFyZXN0LT5saW5ldGFiW2xvd10ubGluZV9udW1iZXI7CisgICAgICAgIH0KIAogCWlmKCBsaW5lbm8gIT0gLTEgKQogCSAgewpAQCAtNzk5LDYgKzc5Nyw3IEBACiAgICAgY2hhciBidWZmZXJbMjU2XTsKICAgICBpbnQgaSwgajsKICAgICBJTUFHRV9FWFBPUlRfRElSRUNUT1JZICpleHBvcnRzOworICAgIElNQUdFX0RBVEFfRElSRUNUT1JZICpkZWJ1Z19kaXI7CiAgICAgRFdPUkQgbG9hZF9hZGRyOwogICAgIFdPUkQgKm9yZGluYWxzOwogICAgIHZvaWQgKipmdW5jdGlvbnM7CkBAIC04NTksNiArODU4LDExIEBACiAgICAgICAgIGFkZHIub2ZmID0gKERXT1JEKVJWQSggZnVuY3Rpb25zW2ldICk7CiAgICAgICAgIERFQlVHX0FkZFN5bWJvbCggYnVmZmVyLCAmYWRkciwgTlVMTCwgU1lNX1dJTjMyIHwgU1lNX0ZVTkMgKTsKICAgICB9CisKKyAgICBkZWJ1Z19kaXIgPSAmcGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfREVCVUddOworICAgIGlmIChkZWJ1Z19kaXItPlNpemUpCisgICAgICAgIERFQlVHX1JlZ2lzdGVyRGVidWdJbmZvKCBwZSwgbG9hZF9hZGRyLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfZGlyLT5WaXJ0dWFsQWRkcmVzcywgZGVidWdfZGlyLT5TaXplICk7CiAjdW5kZWYgUlZBCiB9CiAKQEAgLTk3Niw3ICs5ODAsNiBAQAogewogICAgIHN0cnVjdCBuYW1lX2hhc2ggKiBuZWFyZXN0ID0gTlVMTDsKICAgICBpbnQgbWlkLCBoaWdoLCBsb3c7Ci0gICAgaW50IGk7CiAKICAgICBpZiggc29ydGxpc3RfdmFsaWQgPT0gRkFMU0UgKQogICAgICAgewpAQCAtMTEwMCwyNCArMTEwMywxOCBAQAogICAgIGlmKCAobmVhcmVzdC0+c291cmNlZmlsZSAhPSBOVUxMKQogCSYmIChhZGRyLT5vZmYgLSBuZWFyZXN0LT5hZGRyLm9mZiA8IDB4MTAwMDAwKSApCiAgICAgICB7Ci0JLyoKLQkgKiBGSVhNRSAtIHRoaXMgaXMgYW4gaW5lZmZpY2llbnQgbGluZWFyIHNlYXJjaC4gIEEgYmluYXJ5Ci0JICogc2VhcmNoIHdvdWxkIGJlIGJldHRlciBpZiB0aGlzIGdldHMgdG8gYmUgYSBwZXJmb3JtYW5jZQotCSAqIGJvdHRsZW5lY2suCi0JICovCi0JZm9yKGk9MDsgaSA8IG5lYXJlc3QtPm5fbGluZXM7IGkrKykKLQkgIHsKLQkgICAgaWYoIGFkZHItPm9mZiA9PSBuZWFyZXN0LT5saW5ldGFiW2ldLnBjX29mZnNldC5vZmYgKQotCSAgICAgIHsKLQkJcmV0dXJuIEFUX0xJTkVOVU1CRVI7Ci0JICAgICAgfQotCSAgICBpZiggYWRkci0+b2ZmIDwgbmVhcmVzdC0+bGluZXRhYltpXS5wY19vZmZzZXQub2ZmICkKLQkgICAgICB7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLQotCXJldHVybiBOT1RfT05fTElORU5VTUJFUjsKKyAgICAgICAgICBsb3cgPSAwOworICAgICAgICAgIGhpZ2ggPSBuZWFyZXN0LT5uX2xpbmVzOworICAgICAgICAgIHdoaWxlICgoaGlnaCAtIGxvdykgPiAxKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbWlkID0gKGhpZ2ggKyBsb3cpIC8gMjsKKyAgICAgICAgICAgICAgaWYgKGFkZHItPm9mZiA8IG5lYXJlc3QtPmxpbmV0YWJbbWlkXS5wY19vZmZzZXQub2ZmKSBoaWdoID0gbWlkOworICAgICAgICAgICAgICBlbHNlIGxvdyA9IG1pZDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGFkZHItPm9mZiA9PSBuZWFyZXN0LT5saW5ldGFiW2xvd10ucGNfb2Zmc2V0Lm9mZikKKyAgICAgICAgICAgICAgcmV0dXJuIEFUX0xJTkVOVU1CRVI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICByZXR1cm4gTk9UX09OX0xJTkVOVU1CRVI7CiAgICAgICB9CiAKICAgICByZXR1cm4gRlVOQ19IQVNfTk9fTElORVM7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9tc2MuYyBiL2RlYnVnZ2VyL21zYy5jCmluZGV4IDNiYzY5YWYuLjgwOTRkODYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL21zYy5jCisrKyBiL2RlYnVnZ2VyL21zYy5jCkBAIC0zNCwxMSArMzQsNiBAQAogI2luY2x1ZGUgInBlZXhlLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCi0vKgotICogVGhpcyBpcyB1c2VkIHNvIHRoYXQgd2UgaGF2ZSBzb21lIGlkZWEgb2Ygd2hhdCB3ZSBhcmUgaW4gZmFjdCBsb2FkaW5nCi0gKiBhdCBhbnkgZ2l2ZW4gdGltZS4KLSAqLwotY2hhciAqIERFQlVHX2N1cnJfbW9kdWxlID0gTlVMTDsKIAogLyoKICAqIFRoaXMgaXMgYW4gaW5kZXggd2UgdXNlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGRlYnVnIGluZm9ybWF0aW9uCkBAIC04ODYsNyArODgxLDggQEAKICAqIFdlIGRvbid0IGZ1bGx5IHByb2Nlc3MgaXQgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KICAqLwogaW50Ci1ERUJVR19SZWdpc3RlckRlYnVnSW5mbyhzdHJ1Y3QgcGVfZGF0YSAqIHBlLGludCBsb2FkX2FkZHIsIHVfbG9uZyB2X2FkZHIsIHVfbG9uZyBzaXplKQorREVCVUdfUmVnaXN0ZXJEZWJ1Z0luZm8oc3RydWN0IHBlX2RhdGEgKiBwZSxpbnQgbG9hZF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIHVfbG9uZyB2X2FkZHIsIHVfbG9uZyBzaXplKQogewogICBpbnQJCQkgIGhhc19jb2RldmlldyA9IEZBTFNFOwogICBpbnQJCQkgIHJ0biA9IEZBTFNFOwpAQCAtOTU2LDEzICs5NTIsMTMgQEAKIAkgICAqIHRvIHByb2NlZWQgaWYgd2Uga25vdyB3aGF0IHdlIG5lZWQgdG8gZG8gbmV4dC4KIAkgICAqLwogCSAgZGVlZmVyLT5kYmdfc2l6ZSA9IGRiZ3B0ci0+U2l6ZU9mRGF0YTsKLQkgIGRlZWZlci0+ZGJnX2luZm8gPSBwZS0+bWFwcGVkZGxsK2RiZ3B0ci0+UG9pbnRlclRvUmF3RGF0YTsKKwkgIGRlZWZlci0+ZGJnX2luZm8gPSAoY2hhciAqKShwZS0+bWFwcGVkZGxsK2RiZ3B0ci0+UG9pbnRlclRvUmF3RGF0YSk7CiAJICBkZWVmZXItPmxvYWRfYWRkciA9IChjaGFyICopIGxvYWRfYWRkcjsKIAkgIGRlZWZlci0+ZGJnZGlyID0gZGJncHRyOwogCSAgZGVlZmVyLT5uZXh0ID0gZGJnbGlzdDsKIAkgIGRlZWZlci0+bG9hZGVkID0gRkFMU0U7CiAJICBkZWVmZXItPmRiZ19pbmRleCA9IERFQlVHX25leHRfaW5kZXg7Ci0JICBkZWVmZXItPm1vZHVsZV9uYW1lID0geHN0cmR1cChERUJVR19jdXJyX21vZHVsZSk7CisJICBkZWVmZXItPm1vZHVsZV9uYW1lID0geHN0cmR1cChtb2R1bGVfbmFtZSk7CiAKIAkgIGRlZWZlci0+c2VjdHAgPSBwZS0+cGVfc2VnOwogCSAgZGVlZmVyLT5uc2VjdCA9IHBlLT5wZV9oZWFkZXItPkZpbGVIZWFkZXIuTnVtYmVyT2ZTZWN0aW9uczsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3JlZ2lzdGVycy5jIGIvZGVidWdnZXIvcmVnaXN0ZXJzLmMKaW5kZXggYzI4MGJiNy4uNmFiMGJhYyAxMDA2NDQKLS0tIGEvZGVidWdnZXIvcmVnaXN0ZXJzLmMKKysrIGIvZGVidWdnZXIvcmVnaXN0ZXJzLmMKQEAgLTE0NywxMyArMTQ3LDEzIEBACiAjaWZkZWYgRlNfc2lnCiAgICAgRlNfcmVnKCZERUJVR19jb250ZXh0KSAgPSBMT1dPUkQoRlNfc2lnKHNpZ2NvbnRleHQpKTsKICNlbHNlCi0gICAgX19hc21fXygibW92dyAlJWZzLCV3MCI6Ij1yIiAoRlNfcmVnKCZERUJVR19jb250ZXh0KSkpOworICAgIEdFVF9GUyggRlNfcmVnKCZERUJVR19jb250ZXh0KSApOwogICAgIEZTX3JlZygmREVCVUdfY29udGV4dCkgJj0gMHhmZmZmOwogI2VuZGlmCiAjaWZkZWYgR1Nfc2lnCiAgICAgR1NfcmVnKCZERUJVR19jb250ZXh0KSAgPSBMT1dPUkQoR1Nfc2lnKHNpZ2NvbnRleHQpKTsKICNlbHNlCi0gICAgX19hc21fXygibW92dyAlJWdzLCV3MCI6Ij1yIiAoR1NfcmVnKCZERUJVR19jb250ZXh0KSkpOworICAgIEdFVF9HUyggR1NfcmVnKCZERUJVR19jb250ZXh0KSApOwogICAgIEdTX3JlZygmREVCVUdfY29udGV4dCkgJj0gMHhmZmZmOwogI2VuZGlmCiB9CkBAIC0xODMsMTIgKzE4MywxMiBAQAogI2lmZGVmIEZTX3NpZwogICAgIEZTX3NpZyhzaWdjb250ZXh0KSAgPSBGU19yZWcoJkRFQlVHX2NvbnRleHQpOwogI2Vsc2UKLSAgICBfX2FzbV9fKCJtb3Z3ICV3MCwlJWZzIjo6InIiIChGU19yZWcoJkRFQlVHX2NvbnRleHQpKSk7CisgICAgU0VUX0ZTKCBGU19yZWcoJkRFQlVHX2NvbnRleHQpICk7CiAjZW5kaWYKICNpZmRlZiBHU19zaWcKICAgICBHU19zaWcoc2lnY29udGV4dCkgID0gR1NfcmVnKCZERUJVR19jb250ZXh0KTsKICNlbHNlCi0gICAgX19hc21fXygibW92dyAldzAsJSVncyI6OiJyIiAoR1NfcmVnKCZERUJVR19jb250ZXh0KSkpOworICAgIFNFVF9HUyggR1NfcmVnKCZERUJVR19jb250ZXh0KSApOwogI2VuZGlmCiB9CiAKQEAgLTIzOSw2ICsyMzksOCBAQAogICovCiBCT09MMzIgREVCVUdfVmFsaWRhdGVSZWdpc3RlcnModm9pZCkKIHsKKyAgICBXT1JEIGNzLCBkczsKKwogLyogQ2hlY2sgdGhhdCBhIHNlbGVjdG9yIGlzIGEgdmFsaWQgcmluZy0zIExEVCBzZWxlY3Rvciwgb3IgYSBOVUxMIHNlbGVjdG9yICovCiAjZGVmaW5lIENIRUNLX1NFRyhzZWcsbmFtZSkgXAogICAgIGlmICgoKHNlZykgJiB+MykgJiYgXApAQCAtMjQ5LDE4ICsyNTEsMTQgQEAKICAgICAgICAgcmV0dXJuIEZBTFNFOyBcCiAgICAgfQogCi0gICAgaWYgKENTX3JlZygmREVCVUdfY29udGV4dCkgIT0gV0lORV9DT0RFX1NFTEVDVE9SKQotICAgICAgICBDSEVDS19TRUcoIENTX3JlZygmREVCVUdfY29udGV4dCksICJDUyIgKTsKLSAgICBpZiAoU1NfcmVnKCZERUJVR19jb250ZXh0KSAhPSBXSU5FX0RBVEFfU0VMRUNUT1IpCi0gICAgICAgIENIRUNLX1NFRyggU1NfcmVnKCZERUJVR19jb250ZXh0KSwgIlNTIiApOwotICAgIGlmIChEU19yZWcoJkRFQlVHX2NvbnRleHQpICE9IFdJTkVfREFUQV9TRUxFQ1RPUikKLSAgICAgICAgQ0hFQ0tfU0VHKCBEU19yZWcoJkRFQlVHX2NvbnRleHQpLCAiRFMiICk7Ci0gICAgaWYgKEVTX3JlZygmREVCVUdfY29udGV4dCkgIT0gV0lORV9EQVRBX1NFTEVDVE9SKQotICAgICAgICBDSEVDS19TRUcoIEVTX3JlZygmREVCVUdfY29udGV4dCksICJFUyIgKTsKLSAgICBpZiAoRlNfcmVnKCZERUJVR19jb250ZXh0KSAhPSBXSU5FX0RBVEFfU0VMRUNUT1IpCi0gICAgICAgIENIRUNLX1NFRyggRlNfcmVnKCZERUJVR19jb250ZXh0KSwgIkZTIiApOwotICAgIGlmIChHU19yZWcoJkRFQlVHX2NvbnRleHQpICE9IFdJTkVfREFUQV9TRUxFQ1RPUikKLSAgICAgICAgQ0hFQ0tfU0VHKCBHU19yZWcoJkRFQlVHX2NvbnRleHQpLCAiR1MiICk7CisgICAgR0VUX0NTKGNzKTsKKyAgICBHRVRfRFMoZHMpOworICAgIGlmIChDU19yZWcoJkRFQlVHX2NvbnRleHQpICE9IGNzKSBDSEVDS19TRUcoQ1NfcmVnKCZERUJVR19jb250ZXh0KSwgIkNTIik7CisgICAgaWYgKFNTX3JlZygmREVCVUdfY29udGV4dCkgIT0gZHMpIENIRUNLX1NFRyhTU19yZWcoJkRFQlVHX2NvbnRleHQpLCAiU1MiKTsKKyAgICBpZiAoRFNfcmVnKCZERUJVR19jb250ZXh0KSAhPSBkcykgQ0hFQ0tfU0VHKERTX3JlZygmREVCVUdfY29udGV4dCksICJEUyIpOworICAgIGlmIChFU19yZWcoJkRFQlVHX2NvbnRleHQpICE9IGRzKSBDSEVDS19TRUcoRVNfcmVnKCZERUJVR19jb250ZXh0KSwgIkVTIik7CisgICAgaWYgKEZTX3JlZygmREVCVUdfY29udGV4dCkgIT0gZHMpIENIRUNLX1NFRyhGU19yZWcoJkRFQlVHX2NvbnRleHQpLCAiRlMiKTsKKyAgICBpZiAoR1NfcmVnKCZERUJVR19jb250ZXh0KSAhPSBkcykgQ0hFQ0tfU0VHKEdTX3JlZygmREVCVUdfY29udGV4dCksICJHUyIpOwogCiAgICAgLyogQ2hlY2sgdGhhdCBDUyBhbmQgU1MgYXJlIG5vdCBOVUxMICovCiAKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3NvdXJjZS5jIGIvZGVidWdnZXIvc291cmNlLmMKaW5kZXggNTZiNjg2YS4uMWEzNzE5NSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvc291cmNlLmMKKysrIGIvZGVidWdnZXIvc291cmNlLmMKQEAgLTQ4MCw3ICs0ODAsNiBAQAogICBEQkdfQUREUglsYXN0OwogICBEQkdfQUREUgllbmQsc3RhcnQ7CiAKLQogICBpZiAoeHN0YXJ0KSB7CiAgICAgc3RhcnQ9KnhzdGFydDsKICAgICBfZGlzYXNzZW1ibGVfZml4YWRkcigmc3RhcnQpOwpAQCAtNDkxLDkgKzQ5MCwxMiBAQAogICB9CiAgIGlmICgheHN0YXJ0ICYmICF4ZW5kKSB7CiAgICAgbGFzdCA9IERFQlVHX0xhc3REaXNhc3NlbWJsZTsKLSAgICBpZiAoIWxhc3Quc2VnICYmICFsYXN0Lm9mZikgewotICAgICAgbGFzdC5zZWcgPSAoQ1NfcmVnKCZERUJVR19jb250ZXh0KT09V0lORV9DT0RFX1NFTEVDVE9SKT8wOkNTX3JlZygmREVCVUdfY29udGV4dCk7Ci0gICAgICBsYXN0Lm9mZiA9IEVJUF9yZWcoJkRFQlVHX2NvbnRleHQpOworICAgIGlmICghbGFzdC5zZWcgJiYgIWxhc3Qub2ZmKQorICAgIHsKKyAgICAgICAgV09SRCBjczsKKyAgICAgICAgR0VUX0NTKGNzKTsKKyAgICAgICAgbGFzdC5zZWcgPSAoQ1NfcmVnKCZERUJVR19jb250ZXh0KSA9PSBjcykgPyAwIDogQ1NfcmVnKCZERUJVR19jb250ZXh0KTsKKyAgICAgICAgbGFzdC5vZmYgPSBFSVBfcmVnKCZERUJVR19jb250ZXh0KTsKICAgICB9CiAgICAgZm9yIChpPTA7aTxvZmZzZXQ7aSsrKQogICAgICAgaWYgKCFfZGlzYXNzZW1ibGUoJmxhc3QpKSBicmVhazsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3N0YWNrLmMgYi9kZWJ1Z2dlci9zdGFjay5jCmluZGV4IGNhMmJjYzcuLmZlOWY1Y2IgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL3N0YWNrLmMKKysrIGIvZGVidWdnZXIvc3RhY2suYwpAQCAtNTIsOSArNTIsMTEgQEAKIHZvaWQgREVCVUdfSW5mb1N0YWNrKHZvaWQpCiB7CiAgICAgREJHX0FERFIgYWRkcjsKKyAgICBXT1JEIHNzOwogCiAgICAgZnByaW50ZihzdGRlcnIsIlN0YWNrIGR1bXA6XG4iKTsKLSAgICBpZiAoKFNTX3JlZygmREVCVUdfY29udGV4dCkgPT0gV0lORV9EQVRBX1NFTEVDVE9SKSB8fAorICAgIEdFVF9TUyhzcyk7CisgICAgaWYgKChTU19yZWcoJkRFQlVHX2NvbnRleHQpID09IHNzKSB8fAogICAgICAgICAoR0VUX1NFTF9GTEFHUyhTU19yZWcoJkRFQlVHX2NvbnRleHQpKSAmIExEVF9GTEFHU18zMkJJVCkpCiAgICAgeyAgLyogMzItYml0IG1vZGUgKi8KICAgICAgICAgYWRkci5zZWcgPSAwOwpAQCAtODIsOSArODQsMTEgQEAKIHsKICAgICBEQkdfQUREUiBhZGRyOwogICAgIGludCBmcmFtZW5vID0gMDsKKyAgICBXT1JEIHNzOwogCiAgICAgZnByaW50ZihzdGRlcnIsIkJhY2t0cmFjZTpcbiIpOwotICAgIGlmIChTU19yZWcoJkRFQlVHX2NvbnRleHQpID09IFdJTkVfREFUQV9TRUxFQ1RPUikgIC8qIDMyLWJpdCBtb2RlICovCisgICAgR0VUX1NTKHNzKTsKKyAgICBpZiAoU1NfcmVnKCZERUJVR19jb250ZXh0KSA9PSBzcykgIC8qIDMyLWJpdCBtb2RlICovCiAgICAgewogICAgICAgICBuZnJhbWUgPSAxOwogICAgICAgICBpZiAoZnJhbWVzKSBmcmVlKCBmcmFtZXMgKTsKQEAgLTE1OCwxNCArMTYyLDE1IEBACiAgKi8KIHZvaWQgREVCVUdfU2lsZW50QmFja1RyYWNlKHZvaWQpCiB7CisgICAgV09SRCBzczsKICAgICBEQkdfQUREUiBhZGRyOwogICAgIGludCBmcmFtZW5vID0gMDsKIAogICAgIG5mcmFtZSA9IDE7CiAgICAgaWYgKGZyYW1lcykgZnJlZSggZnJhbWVzICk7CiAgICAgZnJhbWVzID0gKHN0cnVjdCBidF9pbmZvICopIHhtYWxsb2MoIHNpemVvZihzdHJ1Y3QgYnRfaW5mbykgKTsKLQotICAgIGlmIChTU19yZWcoJkRFQlVHX2NvbnRleHQpID09IFdJTkVfREFUQV9TRUxFQ1RPUikgIC8qIDMyLWJpdCBtb2RlICovCisgICAgR0VUX1NTKHNzKTsKKyAgICBpZiAoU1NfcmVnKCZERUJVR19jb250ZXh0KSA9PSBzcykgIC8qIDMyLWJpdCBtb2RlICovCiAgICAgewogICAgICAgICBhZGRyLnNlZyA9IDA7CiAgICAgICAgIGFkZHIub2ZmID0gRUlQX3JlZygmREVCVUdfY29udGV4dCk7CmRpZmYgLS1naXQgYS9kb2N1bWVudGF0aW9uL2RlYnVnZ2luZyBiL2RvY3VtZW50YXRpb24vZGVidWdnaW5nCmluZGV4IDUxYmQwZmMuLjE2ODZhZTcgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vZGVidWdnaW5nCisrKyBiL2RvY3VtZW50YXRpb24vZGVidWdnaW5nCkBAIC0xMDEsNyArMTAxLDkgQEAKIAogICBTd2l0Y2ggdG8gVU5JWCBzaGVsbCwgZ2V0IHRoZSBwcm9jZXNzLUlEIHVzaW5nICJwcyAtYXxncmVwIHdpbmUiLCBhbmQgZG8gYQogICAia2lsbCAtSFVQIDxwaWQ+IiAod2l0aG91dCAiIGFuZCA8PikuIFdpbmUgd2lsbCB0aGVuIGVudGVyIGl0cyBpbnRlcm5hbAotICBkZWJ1Z2dlciBhbmQgeW91IGNhbiBwcm9jZWVkIGFzIGV4cGxhaW5lZCBhYm92ZS4KKyAgZGVidWdnZXIgYW5kIHlvdSBjYW4gcHJvY2VlZCBhcyBleHBsYWluZWQgYWJvdmUuIEFsc28sIHlvdSBjYW4gdXNlIC1kZWJ1ZworICBzd2l0Y2ggYW5kIHRoZW4geW91IGNhbiBnZXQgaW50byBpbnRlcm5hbCBkZWJ1Z2dlciBieSBwcmVzc2luZyBDdHJsLUMgaW4gCisgIHRoZSB0ZXJtaW5hbCB3aGVyZSB5b3UgcnVuIFdpbmUuCiAKIFByb2dyYW0gcmVwb3J0cyBhbiBlcnJvciB3aXRoIGEgTWVzc2FnZWJveAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9kb2N1bWVudGF0aW9uL2ludGVybmFscyBiL2RvY3VtZW50YXRpb24vaW50ZXJuYWxzCmluZGV4IDEwYmM1NzguLjVmZmQ4MDAgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vaW50ZXJuYWxzCisrKyBiL2RvY3VtZW50YXRpb24vaW50ZXJuYWxzCkBAIC0xNyw2ICsxNyw3IEBACiBsb2NhdGVkIGluIHdpbmRvd3MvLCBjb250cm9scy8sIGFuZCBtaXNjLyBkaXJlY3Rvcmllcy4KIAogMS4gV2luZG93aW5nIHN1YnN5c3RlbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICB3aW5kb3dzL3dpbi5jCiAgICB3aW5kb3dzL3dpbnBvcy5jCkBAIC01OCwxNSArNTksMTcgQEAKICAgIGFjdGl2ZSB3aW5kb3cgKCJmb3JlZ3JvdW5kIHdpbmRvdyIgaW4gV2luMzIpIGlzIG1vdmVkIHRvIHRoZSBmcm9udAogICAgb2Ygei1vcmRlciB1bmxlc3MgaXRzIHRvcC1sZXZlbCBhbmNlc3RvciBvd25zIHBvcHVwIHdpbmRvd3MuCiAKLSAgIEFsbCB0aGVzZSBpc3N1ZXMgYXJlIGRlYWx0IHdpdGggKG9yIHN1cHBvc2VkIHRvIGJlKSBpbiAKLSAgIHdpbmRvd3Mvd2lucG9zLmMKKyAgIEFsbCB0aGVzZSBpc3N1ZXMgYXJlIGRlYWx0IHdpdGggKG9yIHN1cHBvc2VkIHRvIGJlKSBpbiB3aW5kb3dzL3dpbnBvcy5jIAorICAgd2l0aCBTZXRXaW5kb3dQb3MoKSBiZWluZyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UgdG8gdGhlIHdpbmRvdyBtYW5hZ2VyLgogCiAgICBXaW5lIHNwZWNpZmljczogaW4gZGVmYXVsdCBhbmQgbWFuYWdlZCBtb2RlIGVhY2ggdG9wLWxldmVsIHdpbmRvdwogICAgZ2V0cyBpdHMgb3duIFggY291bnRlcnBhcnQgd2l0aCBkZXNrdG9wIHdpbmRvdyBiZWluZyBiYXNpY2FsbHkgYSAKICAgIGZha2Ugc3R1Yi4gSW4gZGVza3RvcCBtb2RlLCBob3dldmVyLCBvbmx5IGRlc2t0b3Agd2luZG93IGhhcyBhbiBYCi0gICB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIGl0LgorICAgd2luZG93IGFzc29jaWF0ZWQgd2l0aCBpdC4gQWxzbywgU2V0V2luZG93UG9zKCkgc2hvdWxkIGV2ZW50dWFsbHkgYmUKKyAgIGltcGxlbWVudGVkIHZpYSBCZWdpbi9FbmQvRGVmZXJXaW5kb3dQb3MoKSBjYWxscyBhbmQgbm90IHRoZSBvdGhlciB3YXkKKyAgIGFyb3VuZC4KIAotMi4gVmlzaWJsZSByZWdpb24sIGNsaXBwaW5nIHJlZ2lvbiBhbmQgdXBkYXRlIHJlZ2lvbgorICAgMS4xIFZpc2libGUgcmVnaW9uLCBjbGlwcGluZyByZWdpb24gYW5kIHVwZGF0ZSByZWdpb24KIAogICAgd2luZG93cy9kY2UuYwogICAgd2luZG93cy93aW5wb3MuYwpAQCAtMTQzLDkgKzE0NiwxMiBAQAogICAgdGhlIERDIGNhY2hlIHRvIHJlY2FsY3VsYXRlIHZpc2libGUgcmVnaW9ucyBmb3IgZW50cmllcyB3aG9zZSB3aW5kb3dzIAogICAgd2VyZSBpbnZvbHZlZCBpbiB0aGUgb3BlcmF0aW9uLiBEQyBlbnRyaWVzIChEQ0UpIGNhbiBiZSBlaXRoZXIgcHJpdmF0ZQogICAgdG8gdGhlIHdpbmRvdywgb3IgcHJpdmF0ZSB0byB0aGUgd2luZG93IGNsYXNzLCBvciBzaGFyZWQgYmV0d2VlbiBhbGwgCi0gICB3aW5kb3dzLiBXaW5kb3dzIDMuMSBsaW1pdHMgdGhlIG51bWJlciBvZiBzaGFyZWQgRENFcyB0byA1LiAKKyAgIHdpbmRvd3MgKFdpbmRvd3MgMy4xIGxpbWl0cyB0aGUgbnVtYmVyIG9mIHNoYXJlZCBEQ0VzIHRvIDUpLgogCi0zLiBNZXNzYWdpbmcgc3Vic3lzdGVtCisgICAxLjIKKworMi4gTWVzc2FnaW5nIHN1YnN5c3RlbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICB3aW5kb3dzL3F1ZXVlLmMKICAgIHdpbmRvd3MvbWVzc2FnZS5jCmRpZmYgLS1naXQgYS9maWxlcy9NYWtlZmlsZS5pbiBiL2ZpbGVzL01ha2VmaWxlLmluCmluZGV4IDc4OGFlNmQuLjU1Yjc2YTkgMTAwNjQ0Ci0tLSBhL2ZpbGVzL01ha2VmaWxlLmluCisrKyBiL2ZpbGVzL01ha2VmaWxlLmluCkBAIC0xLDYgKzEsNiBAQAogcHJlZml4ICAgICA9IEBwcmVmaXhACiBzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1ERUZTICAgICAgID0gLURfX1dJTkVfXyAtREVUQ0RJUj1cIiQoc3lzY29uZmRpcilcIgorREVGUyAgICAgICA9IEBETExGTEFHU0AgLURfX1dJTkVfXyAtREVUQ0RJUj1cIiQoc3lzY29uZmRpcilcIgogVE9QU1JDRElSICA9IEB0b3Bfc3JjZGlyQAogVE9QT0JKRElSICA9IC4uCiBTUkNESVIgICAgID0gQHNyY2RpckAKZGlmZiAtLWdpdCBhL2ZpbGVzL2RpcmVjdG9yeS5jIGIvZmlsZXMvZGlyZWN0b3J5LmMKaW5kZXggMGY0NWZhOS4uYjRkZGI3ZSAxMDA2NDQKLS0tIGEvZmlsZXMvZGlyZWN0b3J5LmMKKysrIGIvZmlsZXMvZGlyZWN0b3J5LmMKQEAgLTYzMSw3ICs2MzEsNyBAQAogICAgIHdoaWxlICgqcmVzID09ICcvJykgcmVzKys7CiAgICAgaWYgKGJ1ZmxlbikKICAgICB7Ci0gICAgICAgIGlmIChidWZsZW4gPiAzKSBsc3RyY3B5bkF0b1coIGJ1ZmZlciArIDMsIHJlcyArIDEsIGJ1ZmxlbiAtIDMgKTsKKyAgICAgICAgaWYgKGJ1ZmxlbiA+IDMpIGxzdHJjcHluQXRvVyggYnVmZmVyICsgMywgcmVzLCBidWZsZW4gLSAzICk7IAogICAgICAgICBmb3IgKHAgPSBidWZmZXI7ICpwOyBwKyspIGlmICgqcCA9PSAnLycpICpwID0gJ1xcJzsKICAgICAgICAgaWYgKGxhc3RwYXJ0KQogICAgICAgICB7CmRpZmYgLS1naXQgYS9maWxlcy9kcml2ZS5jIGIvZmlsZXMvZHJpdmUuYwppbmRleCBmYzU5MmM2Li5mODc0ZGY4IDEwMDY0NAotLS0gYS9maWxlcy9kcml2ZS5jCisrKyBiL2ZpbGVzL2RyaXZlLmMKQEAgLTMxNCw2ICszMTQsNyBAQAogICAgICAgICB3aGlsZSAoIUlTX0VORF9PRl9OQU1FKCpwKSkgKm5leHQrKyA9ICpwKys7CiAgICAgICAgICpuZXh0ID0gMDsKICAgICB9CisgICAgKm5leHQgPSAwOwogCiAgICAgaWYgKHJvb3Rkcml2ZSAhPSAtMSkKICAgICAgICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiRFJJVkVfRmluZERyaXZlUm9vdDogJXMgLT4gZHJpdmUgJWM6LCByb290PSclcycsIG5hbWU9JyVzJ1xuIiwKQEAgLTYxOCw2ICs2MTksMTAgQEAKICAgICB9CiAgICAgaWYgKCFEUklWRV9HZXRGcmVlU3BhY2UoZHJpdmUsICZzaXplLCAmYXZhaWxhYmxlKSkgcmV0dXJuIEZBTFNFOwogCisgICAgLyogQ2FwIHRoZSBzaXplIGFuZCBhdmFpbGFibGUgYXQgMkdCIGFzIHBlciBzcGVjcy4gICovCisgICAgaWYgKHNpemUgPiAweDdmZmZmZmZmKSBzaXplID0gMHg3ZmZmZmZmZjsKKyAgICBpZiAoYXZhaWxhYmxlID4gMHg3ZmZmZmZmZikgYXZhaWxhYmxlID0gMHg3ZmZmZmZmZjsKKwogICAgICpzZWN0b3JfYnl0ZXMgICAgPSA1MTI7CiAgICAgc2l6ZSAgICAgICAgICAgIC89IDUxMjsKICAgICBhdmFpbGFibGUgICAgICAgLz0gNTEyOwpkaWZmIC0tZ2l0IGEvZmlsZXMvZmlsZS5jIGIvZmlsZXMvZmlsZS5jCmluZGV4IDUxZDQ0M2IuLmY2MGExMTUgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2ZpbGUuYworKysgYi9maWxlcy9maWxlLmMKQEAgLTEyODYsOCArMTI4Niw4IEBACiAgICAgfQogLyogICAgcHJpbnRmKCAiRklMRV9tbWFwOiBtbWFwIGZhaWxlZCAoJWQpLCBmYWtpbmcgaXRcbiIsIGVycm5vICk7Ki8KICAgICAvKiBSZXNlcnZlIHRoZSBtZW1vcnkgd2l0aCBhbiBhbm9ueW1vdXMgbW1hcCAqLwotICAgIHJldCA9IEZJTEVfbW1hcCggTlVMTCwgc3RhcnQsIHNpemVfaGlnaCwgc2l6ZV9sb3csIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBmbGFncyApOworICAgIHJldCA9IEZJTEVfZG9tbWFwKCBOVUxMLCBzdGFydCwgc2l6ZV9oaWdoLCBzaXplX2xvdywgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgZmxhZ3MgKTsKICAgICBpZiAocmV0ID09IChMUFZPSUQpLTEpIHJldHVybiByZXQ7CiAgICAgLyogTm93IHJlYWQgaW4gdGhlIGZpbGUgKi8KICAgICBpZiAoKHBvcyA9IGxzZWVrKCBmZCwgb2Zmc2V0X2xvdywgU0VFS19TRVQgKSkgPT0gLTEpCmRpZmYgLS1naXQgYS9ncmFwaGljcy9NYWtlZmlsZS5pbiBiL2dyYXBoaWNzL01ha2VmaWxlLmluCmluZGV4IDljYWI0MTEuLjU5MTJkOTAgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL01ha2VmaWxlLmluCisrKyBiL2dyYXBoaWNzL01ha2VmaWxlLmluCkBAIC0xLDQgKzEsNCBAQAotREVGUyAgICAgID0gLURfX1dJTkVfXworREVGUyAgICAgID0gQERMTEZMQUdTQCAtRF9fV0lORV9fCiBUT1BTUkNESVIgPSBAdG9wX3NyY2RpckAKIFRPUE9CSkRJUiA9IC4uCiBTUkNESVIgICAgPSBAc3JjZGlyQApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvTWFrZWZpbGUuaW4gYi9ncmFwaGljcy9tZXRhZmlsZWRydi9NYWtlZmlsZS5pbgppbmRleCBiMGNkODM1Li4xNmM0YWFlIDEwMDY0NAotLS0gYS9ncmFwaGljcy9tZXRhZmlsZWRydi9NYWtlZmlsZS5pbgorKysgYi9ncmFwaGljcy9tZXRhZmlsZWRydi9NYWtlZmlsZS5pbgpAQCAtMSw0ICsxLDQgQEAKLURFRlMgICAgICA9IC1EX19XSU5FX18KK0RFRlMgICAgICA9IEBETExGTEFHU0AgLURfX1dJTkVfXwogVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACiBUT1BPQkpESVIgPSAuLi8uLgogU1JDRElSICAgID0gQHNyY2RpckAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2JydXNoLmMgYi9ncmFwaGljcy93aW4xNmRydi9icnVzaC5jCmluZGV4IGQ2NGIxNGUuLjdlZGM4YjcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2JydXNoLmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvYnJ1c2guYwpAQCAtMjEsMTIgKzIxLDEyIEBACiAgICAgbEJydXNoMTYubGJTdHlsZSA9IGJydXNoLT5sb2dicnVzaC5sYlN0eWxlOwogICAgIGxCcnVzaDE2LmxiQ29sb3IgPSBicnVzaC0+bG9nYnJ1c2gubGJDb2xvcjsKICAgICBsQnJ1c2gxNi5sYkhhdGNoID0gYnJ1c2gtPmxvZ2JydXNoLmxiSGF0Y2g7Ci0gICAgblNpemUgPSBQUlREUlZfUmVhbGl6ZU9iamVjdCAocGh5c0Rldi0+c2VncHRyUERFVklDRSwgT0JKX0JSVVNILAorICAgIG5TaXplID0gUFJURFJWX1JlYWxpemVPYmplY3QgKHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIERSVk9CSl9CUlVTSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbEJydXNoMTYsIE5VTEwsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAKICAgICAvKiAgbWF5IG5lZWQgdG8gcmVhbGxvYyBzZWdwdHJGT250SW5mbyovCiAgICAgcGh5c0Rldi0+c2VncHRyQnJ1c2hJbmZvID0gV0lOMTZfR2xvYmFsTG9jazE2KEdsb2JhbEFsbG9jMTYoR0hORCwgblNpemUpKTsKLSAgICBuU2l6ZSA9IFBSVERSVl9SZWFsaXplT2JqZWN0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIE9CSl9CUlVTSCwKKyAgICBuU2l6ZSA9IFBSVERSVl9SZWFsaXplT2JqZWN0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIERSVk9CSl9CUlVTSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsQnJ1c2gxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEKXBoeXNEZXYtPnNlZ3B0ckJydXNoSW5mbywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW4xNmRydl9TZWdQdHJfVGV4dFhGb3JtKTsgCmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi9pbml0LmMgYi9ncmFwaGljcy93aW4xNmRydi9pbml0LmMKaW5kZXggYmEwYTQ1NC4uNjI4MTE4NiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYwpAQCAtMzU0LDEzICszNTQsMTMgQEAKICAgICAvKiBUVEQgc2hvdWxkIGNhbGN1bGF0ZSB0aGlzICovCiAgICAgCiAgICAgLyogRmlyc3QgZ2V0IHRoZSBzaXplIG9mIHRoZSByZWFsaXplZCBmb250ICovCi0gICAgblNpemUgPSBQUlREUlZfUmVhbGl6ZU9iamVjdChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCBPQkpfRk9OVCwKKyAgICBuU2l6ZSA9IFBSVERSVl9SZWFsaXplT2JqZWN0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIERSVk9CSl9GT05ULAogCQkJCSAmcExQRC0+cGFQcmludGVyRm9udHNbMF0sIE5VTEwsIAogCQkJCSAwKTsKICAgICAKICAgICBwaHlzRGV2LT5zZWdwdHJGb250SW5mbyA9IFdJTjE2X0dsb2JhbExvY2sxNihHbG9iYWxBbGxvYzE2KEdITkQsIG5TaXplKSk7CiAgICAgLyogUmVhbGl6ZSB0aGUgZm9udCAqLwotICAgIFBSVERSVl9SZWFsaXplT2JqZWN0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIE9CSl9GT05ULAorICAgIFBSVERSVl9SZWFsaXplT2JqZWN0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIERSVk9CSl9GT05ULAogCQkJICZwTFBELT5wYVByaW50ZXJGb250c1swXSwgCiAJCQkgKExQVk9JRClwaHlzRGV2LT5zZWdwdHJGb250SW5mbywgCiAJCQkgd2luMTZkcnZfU2VnUHRyX1RleHRYRm9ybSk7CmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi9wZW4uYyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L3Blbi5jCmluZGV4IGQ0YjU5MzMuLmEyNmVhOTkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L3Blbi5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L3Blbi5jCkBAIC0yNSwxMiArMjUsMTIgQEAKICAgICBsUGVuMTYubG9wbldpZHRoLnggPSBwZW4tPmxvZ3Blbi5sb3BuV2lkdGgueDsKICAgICBsUGVuMTYubG9wbldpZHRoLnkgPSBwZW4tPmxvZ3Blbi5sb3BuV2lkdGgueTsKICAgICBsUGVuMTYubG9wbkNvbG9yICAgPSBwZW4tPmxvZ3Blbi5sb3BuQ29sb3I7Ci0gICAgblNpemUgPSBQUlREUlZfUmVhbGl6ZU9iamVjdCAocGh5c0Rldi0+c2VncHRyUERFVklDRSwgT0JKX1BFTiwKKyAgICBuU2l6ZSA9IFBSVERSVl9SZWFsaXplT2JqZWN0IChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCBEUlZPQkpfUEVOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsUGVuMTYsIE5VTEwsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAKICAgICAvKiAgbWF5IG5lZWQgdG8gcmVhbGxvYyBzZWdwdHJGT250SW5mbyovCiAgICAgcGh5c0Rldi0+c2VncHRyUGVuSW5mbyA9IFdJTjE2X0dsb2JhbExvY2sxNihHbG9iYWxBbGxvYzE2KEdITkQsIG5TaXplKSk7Ci0gICAgblNpemUgPSBQUlREUlZfUmVhbGl6ZU9iamVjdChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCBPQkpfUEVOLAorICAgIG5TaXplID0gUFJURFJWX1JlYWxpemVPYmplY3QocGh5c0Rldi0+c2VncHRyUERFVklDRSwgRFJWT0JKX1BFTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsUGVuMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRClwaHlzRGV2LT5zZWdwdHJQZW5JbmZvLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L3BydGRydi5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMKaW5kZXggNGQyMmNmZi4uOGQ3ZjU1MCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMKQEAgLTQyOCwxNiArNDI4LDE2IEBACiAJCiAJc3dpdGNoICh3U3R5bGUpCiAJewotICAgICAgICBjYXNlIE9CSl9CUlVTSDoKKyAgICAgICAgY2FzZSBEUlZPQkpfQlJVU0g6CiAgICAgICAgICAgICBuU2l6ZSA9IHNpemVvZiAoTE9HQlJVU0gxNik7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPQkpfRk9OVDogCisgICAgICAgIGNhc2UgRFJWT0JKX0ZPTlQ6IAogICAgICAgICAgICAgblNpemUgPSBzaXplb2YoTE9HRk9OVDE2KTsgCiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPQkpfUEVOOgorICAgICAgICBjYXNlIERSVk9CSl9QRU46CiAgICAgICAgICAgICBuU2l6ZSA9IHNpemVvZihMT0dQRU4xNik7IAogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0JKX1BCSVRNQVA6CisgICAgICAgIGNhc2UgRFJWT0JKX1BCSVRNQVA6CiAgICAgICAgIGRlZmF1bHQ6CiAJICAgIGZwcmludGYoc3RkZXJyLCAiUFJURFJWX1JlYWxpemVPYmplY3Q6IE9iamVjdCB0eXBlICVkIG5vdCBzdXBwb3J0ZWRcbiIsIHdTdHlsZSk7CiAgICAgICAgICAgICBuU2l6ZSA9IDA7CmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvTWFrZWZpbGUuaW4gYi9ncmFwaGljcy94MTFkcnYvTWFrZWZpbGUuaW4KaW5kZXggZDdmYzFmZC4uZmJhNDQ1MSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L01ha2VmaWxlLmluCisrKyBiL2dyYXBoaWNzL3gxMWRydi9NYWtlZmlsZS5pbgpAQCAtMSw0ICsxLDQgQEAKLURFRlMgICAgICA9IC1EX19XSU5FX18KK0RFRlMgICAgICA9IEBETExGTEFHU0AgLURfX1dJTkVfXwogVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACiBUT1BPQkpESVIgPSAuLi8uLgogU1JDRElSICAgID0gQHNyY2RpckAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi90ZXh0LmMgYi9ncmFwaGljcy94MTFkcnYvdGV4dC5jCmluZGV4IDk4NGQyOTUuLjM1N2Q4ZTIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi90ZXh0LmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L3RleHQuYwpAQCAtMjY2LDkgKzI2Niw5IEBACiAgICAgewogCWxvbmcgbGluZUFzY2VudCwgbGluZURlc2NlbnQ7CiAJaWYgKCFYR2V0Rm9udFByb3BlcnR5KCBmb250LCBYQV9TVFJJS0VPVVRfQVNDRU5ULCAmbGluZUFzY2VudCApKQotCSAgICBsaW5lQXNjZW50ID0gZm9udC0+YXNjZW50IC8gMzsKKwkgICAgbGluZUFzY2VudCA9IGZvbnQtPmFzY2VudCAvIDI7CiAJaWYgKCFYR2V0Rm9udFByb3BlcnR5KCBmb250LCBYQV9TVFJJS0VPVVRfREVTQ0VOVCwgJmxpbmVEZXNjZW50ICkpCi0JICAgIGxpbmVEZXNjZW50ID0gLWxpbmVBc2NlbnQ7CisJICAgIGxpbmVEZXNjZW50ID0gLWxpbmVBc2NlbnQgKiAyIC8gMzsKIAlYU2V0TGluZUF0dHJpYnV0ZXMoIGRpc3BsYXksIGRjLT51LnguZ2MsIGxpbmVBc2NlbnQgKyBsaW5lRGVzY2VudCwKIAkJCSAgICBMaW5lU29saWQsIENhcFJvdW5kLCBKb2luQmV2ZWwgKTsgCiAJWERyYXdMaW5lKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwppbmRleCBiMDJiNzEwLi45Yjk4OGNmIDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYveGZvbnQuYworKysgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwpAQCAtOTksNiArOTksNyBAQAogc3RhdGljIGNvbnN0IGNoYXIqCUlOSUZvbnRTZWN0aW9uID0gImZvbnRzIjsKIHN0YXRpYyBjb25zdCBjaGFyKglJTklTdWJTZWN0aW9uID0gIkFsaWFzIjsKIHN0YXRpYyBjb25zdCBjaGFyKglJTklEZWZhdWx0ID0gIkRlZmF1bHQiOworc3RhdGljIGNvbnN0IGNoYXIqCUlOSURlZmF1bHRGaXhlZCA9ICJEZWZhdWx0Rml4ZWQiOwogc3RhdGljIGNvbnN0IGNoYXIqCUlOSVJlc29sdXRpb24gPSAiUmVzb2x1dGlvbiI7CiBzdGF0aWMgY29uc3QgY2hhcioJSU5JR2xvYmFsTWV0cmljcyA9ICJGb250TWV0cmljcyI7CiAKQEAgLTc4Miw2ICs3ODMsNyBAQAogICAgIGNoYXIqIAlscHN0ciwgKmxwY2g7CiAgICAgaW50CQlpLCB1cDsKICAgICBCWVRFCWJGYW1pbHlTdHlsZTsKKyAgICBjb25zdCBjaGFyKglyZWxvY1RhYmxlW10gPSB7IElOSURlZmF1bHRGaXhlZCwgSU5JRGVmYXVsdCwgTlVMTCB9OwogCiAgICAgZm9yKCBmciA9IGZvbnRMaXN0OyBmciA7IGZyID0gZnItPm5leHQgKQogICAgIHsKQEAgLTgyOCw4ICs4MzAsOSBAQAogCWZyLT5mcl9mbGFncyB8PSBGUl9OQU1FU0VUOwogICAgIH0KIAotICAgIGlmKCBQUk9GSUxFX0dldFdpbmVJbmlTdHJpbmcoIElOSUZvbnRTZWN0aW9uLCBJTklEZWZhdWx0LCAiIiwgYnVmZmVyLCAxMjggKSApCi0gICAgeworICAgIGZvciggdXAgPSAwOyByZWxvY1RhYmxlW3VwXTsgdXArKyApCisgICAgICBpZiggUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCBJTklGb250U2VjdGlvbiwgcmVsb2NUYWJsZVt1cF0sICIiLCBidWZmZXIsIDEyOCApICkKKyAgICAgIHsKIAl3aGlsZSggKmJ1ZmZlciAmJiBpc3NwYWNlKCpidWZmZXIpICkgYnVmZmVyKys7CiAJZm9yKCBmciA9IE5VTEwsIHBmciA9IGZvbnRMaXN0OyBwZnI7IHBmciA9IHBmci0+bmV4dCApCiAJewpAQCAtODQ2LDcgKzg0OSw3IEBACiAJICAgICB9CiAJICAgICBmciA9IHBmcjsKIAl9Ci0gICAgfQorICAgICAgfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2lmMTYzMi9idWlsdGluLmMgYi9pZjE2MzIvYnVpbHRpbi5jCmluZGV4IDk1ZTI5ZTMuLmQyMWYyOTQgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9idWlsdGluLmMKKysrIGIvaWYxNjMyL2J1aWx0aW4uYwpAQCAtNjAxLDYgKzYwMSw4IEBACiAgICAgaW50IGk7CiAgICAgQlVJTFRJTl9ETEwgKmRsbDsKIAorICAgIGZwcmludGYoc3RkZXJyLCJFeGFtcGxlOiAtZGxsIC1vbGUyICAgIERvIG5vdCB1c2UgZW11bGF0ZWQgT0xFMi5ETExcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCJBdmFpbGFibGUgRExMczpcbiIpOwogICAgIGZvciAoaSA9IDAsIGRsbCA9IEJ1aWx0aW5ETExzOyBkbGwtPmRlc2NyOyBkbGwrKykKICAgICB7CiAgICAgICAgIGlmICghKGRsbC0+ZmxhZ3MgJiBETExfRkxBR19BTFdBWVNfVVNFRCkpCkBAIC02MDgsNSArNjEwLDQgQEAKICAgICAgICAgICAgICAgICAgICAgICgoKytpKSAlIDgpID8gJyAnIDogJ1xuJyApOwogICAgIH0KICAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKLSAgICBleGl0KDEpOwogfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2RkZW1sLnNwZWMgYi9pZjE2MzIvZGRlbWwuc3BlYwppbmRleCA0NmMyNDIwLi45OTFkMjBjIDEwMDY0NAotLS0gYS9pZjE2MzIvZGRlbWwuc3BlYworKysgYi9pZjE2MzIvZGRlbWwuc3BlYwpAQCAtMywyMiArMywyMiBAQAogCiAyIHBhc2NhbDE2IERkZUluaXRpYWxpemUocHRyIHNlZ3B0ciBsb25nIGxvbmcpIERkZUluaXRpYWxpemUxNgogMyBwYXNjYWwxNiBEZGVVbmluaXRpYWxpemUobG9uZykgRGRlVW5pbml0aWFsaXplMTYKLTQgc3R1YiBEZGVDb25uZWN0TGlzdCAjKGxvbmcgd29yZCB3b3JkIHdvcmQgcHRyKSBEZGVDb25uZWN0TGlzdAotNSBzdHViIERkZVF1ZXJ5TmV4dFNlcnZlciAjKHdvcmQgd29yZCkgRGRlUXVlcnlOZXh0U2VydmVyCi02IHN0dWIgRGRlRGlzY29ubmVjdExpc3QgIyh3b3JkKSBEZGVEaXNjb25uZWN0TGlzdAorNCBwYXNjYWwgRGRlQ29ubmVjdExpc3QobG9uZyB3b3JkIHdvcmQgd29yZCBwdHIpIERkZUNvbm5lY3RMaXN0Cis1IHBhc2NhbCBEZGVRdWVyeU5leHRTZXJ2ZXIod29yZCB3b3JkKSBEZGVRdWVyeU5leHRTZXJ2ZXIKKzYgcGFzY2FsIERkZURpc2Nvbm5lY3RMaXN0KHdvcmQpIERkZURpc2Nvbm5lY3RMaXN0CiA3IHBhc2NhbCAgIERkZUNvbm5lY3QobG9uZyBsb25nIGxvbmcgcHRyKSBEZGVDb25uZWN0MTYKIDggcGFzY2FsMTYgRGRlRGlzY29ubmVjdChsb25nKSBEZGVEaXNjb25uZWN0MTYKIDkgc3R1YiBEZGVRdWVyeUNvbnZJbmZvICMod29yZCBsb25nIHB0cikgRGRlUXVlcnlDb252SW5mbwotMTAgc3R1YiBEZGVTZXRVc2VySGFuZGxlICMod29yZCBsb25nIGxvbmcpIERkZVNldFVzZXJIYW5kbGUKKzEwIHBhc2NhbCBEZGVTZXRVc2VySGFuZGxlKHdvcmQgbG9uZyBsb25nKSBEZGVTZXRVc2VySGFuZGxlCiAxMSBwYXNjYWwgICBEZGVDbGllbnRUcmFuc2FjdGlvbihwdHIgbG9uZyBsb25nIGxvbmcgc193b3JkIHNfd29yZCBsb25nIHB0cikKICAgICAgICAgICAgIERkZUNsaWVudFRyYW5zYWN0aW9uMTYKLTEyIHN0dWIgRGRlQWJhbmRvblRyYW5zYWN0aW9uICMobG9uZyB3b3JkIGxvbmcpIERkZUFiYW5kb25UcmFuc2FjdGlvbgotMTMgc3R1YiBEZGVQb3N0QWR2aXNlICMobG9uZyB3b3JkIHdvcmQpIERkZVBvc3RBZHZpc2UKLTE0IHN0dWIgRGRlQ3JlYXRlRGF0YUhhbmRsZSAjKGxvbmcgcHRyIGxvbmcgbG9uZyB3b3JkIHdvcmQgd29yZCkgRGRlQ3JlYXRlRGF0YUhhbmRsZQotMTUgc3R1YiBEZGVBZGREYXRhICMod29yZCBwdHIgbG9uZyBsb25nKSBEZGVBZGREYXRhCi0xNiBzdHViIERkZUdldERhdGEgIyh3b3JkIHB0ciBsb25nIGxvbmcpIERkZUdldERhdGEKLTE3IHN0dWIgRGRlQWNjZXNzRGF0YSAjKHdvcmQgcHRyKSBEZGVBY2Nlc3NEYXRhCi0xOCBzdHViIERkZVVuYWNjZXNzRGF0YSAjKHdvcmQpIERkZVVuYWNjZXNzRGF0YQorMTIgcGFzY2FsIERkZUFiYW5kb25UcmFuc2FjdGlvbihsb25nIHdvcmQgbG9uZykgRGRlQWJhbmRvblRyYW5zYWN0aW9uCisxMyBwYXNjYWwgRGRlUG9zdEFkdmlzZShsb25nIHdvcmQgd29yZCkgRGRlUG9zdEFkdmlzZQorMTQgcGFzY2FsIERkZUNyZWF0ZURhdGFIYW5kbGUobG9uZyBwdHIgbG9uZyBsb25nIHdvcmQgd29yZCB3b3JkKSBEZGVDcmVhdGVEYXRhSGFuZGxlCisxNSBwYXNjYWwgRGRlQWRkRGF0YSh3b3JkIHB0ciBsb25nIGxvbmcpIERkZUFkZERhdGEKKzE2IHBhc2NhbCBEZGVHZXREYXRhKHdvcmQgcHRyIGxvbmcgbG9uZykgRGRlR2V0RGF0YQorMTcgcGFzY2FsIERkZUFjY2Vzc0RhdGEod29yZCBwdHIpIERkZUFjY2Vzc0RhdGEKKzE4IHBhc2NhbCBEZGVVbmFjY2Vzc0RhdGEod29yZCkgRGRlVW5hY2Nlc3NEYXRhCiAxOSBwYXNjYWwxNiBEZGVGcmVlRGF0YUhhbmRsZShsb25nKSBEZGVGcmVlRGF0YUhhbmRsZTE2CiAyMCBwYXNjYWwxNiBEZGVHZXRMYXN0RXJyb3IobG9uZykgRGRlR2V0TGFzdEVycm9yMTYKIDIxIHBhc2NhbCAgIERkZUNyZWF0ZVN0cmluZ0hhbmRsZShsb25nIHN0ciBzX3dvcmQpIERkZUNyZWF0ZVN0cmluZ0hhbmRsZTE2CkBAIC0yNiw4ICsyNiw4IEBACiAyMyBzdHViIERkZVF1ZXJ5U3RyaW5nICMobG9uZyB3b3JkIHB0ciBsb25nIHdvcmQpIERkZVF1ZXJ5U3RyaW5nCiAyNCBwYXNjYWwxNiBEZGVLZWVwU3RyaW5nSGFuZGxlKGxvbmcgbG9uZykgRGRlS2VlcFN0cmluZ0hhbmRsZTE2CiAKLTI2IHN0dWIgRGRlRW5hYmxlQ2FsbGJhY2sgIyhsb25nIHdvcmQgd29yZCkgRGRlRW5hYmxlQ2FsbGJhY2sKKzI2IHBhc2NhbCBEZGVFbmFibGVDYWxsYmFjayhsb25nIHdvcmQgd29yZCkgRGRlRW5hYmxlQ2FsbGJhY2sKIDI3IHBhc2NhbCAgIERkZU5hbWVTZXJ2aWNlKGxvbmcgbG9uZyBsb25nIHNfd29yZCkgRGRlTmFtZVNlcnZpY2UxNgogCi0zNiBzdHViIERkZUNtcFN0cmluZ0hhbmRsZXMgIyh3b3JkIHdvcmQpIERkZUNtcFN0cmluZ0hhbmRsZXMKKzM2IHBhc2NhbCBEZGVDbXBTdHJpbmdIYW5kbGVzKHdvcmQgd29yZCkgRGRlQ21wU3RyaW5nSGFuZGxlcwogMzcgcGFzY2FsICAgRGRlUmVjb25uZWN0KGxvbmcpIERkZVJlY29ubmVjdApkaWZmIC0tZ2l0IGEvaWYxNjMyL2dkaS5zcGVjIGIvaWYxNjMyL2dkaS5zcGVjCmluZGV4IGYzNjVlZDkuLjA3ODQ4ZmMgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9nZGkuc3BlYworKysgYi9pZjE2MzIvZ2RpLnNwZWMKQEAgLTMxNSw3ICszMTUsNyBAQAogNDg1IHBhc2NhbDE2IFNjYWxlV2luZG93RXh0RXgod29yZCBzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgcHRyKQogICAgICAgICAgICAgIFNjYWxlV2luZG93RXh0RXgxNgogNDg2IHBhc2NhbDE2IEdldEFzcGVjdFJhdGlvRmlsdGVyRXgod29yZCBwdHIpIEdldEFzcGVjdFJhdGlvRmlsdGVyRXgxNgotNDg5IHN0dWIgQ3JlYXRlRElCU2VjdGlvbgorNDg5IHBhc2NhbDE2IENyZWF0ZURJQlNlY3Rpb24od29yZCBwdHIgd29yZCBwdHIgd29yZCBsb25nKSBDcmVhdGVESUJTZWN0aW9uMTYKIDQ5MCBzdHViIENsb3NlRW5oTWV0YWZpbGUKIDQ5MSBzdHViIENvcHlFbmhNZXRhZmlsZQogNDkyIHN0dWIgQ3JlYXRlRW5oTWV0YWZpbGUKZGlmZiAtLWdpdCBhL2lmMTYzMi9nZGkzMi5zcGVjIGIvaWYxNjMyL2dkaTMyLnNwZWMKaW5kZXggM2EzYWJlOS4uZTMzOTU5OCAxMDA2NDQKLS0tIGEvaWYxNjMyL2dkaTMyLnNwZWMKKysrIGIvaWYxNjMyL2dkaTMyLnNwZWMKQEAgLTM3LDcgKzM3LDcgQEAKICAzMyBzdGRjYWxsIENyZWF0ZURDVyh3c3RyIHdzdHIgd3N0ciBwdHIpIENyZWF0ZURDMzJXCiAgMzQgc3RkY2FsbCBDcmVhdGVESUJQYXR0ZXJuQnJ1c2gobG9uZyBsb25nKSBDcmVhdGVESUJQYXR0ZXJuQnJ1c2gzMgogIDM1IHN0dWIgQ3JlYXRlRElCUGF0dGVybkJydXNoUHQKLSAzNiBzdGRjYWxsIENyZWF0ZURJQlNlY3Rpb24obG9uZyBwdHIgbG9uZyBwdHIgbG9uZyBsb25nKSBDcmVhdGVESUJTZWN0aW9uCisgMzYgc3RkY2FsbCBDcmVhdGVESUJTZWN0aW9uKGxvbmcgcHRyIGxvbmcgcHRyIGxvbmcgbG9uZykgQ3JlYXRlRElCU2VjdGlvbjMyCiAgMzcgc3RkY2FsbCBDcmVhdGVESUJpdG1hcChsb25nIHB0ciBsb25nIHB0ciBwdHIgbG9uZykgQ3JlYXRlRElCaXRtYXAzMgogIDM4IHN0ZGNhbGwgQ3JlYXRlRGlzY2FyZGFibGVCaXRtYXAobG9uZyBsb25nIGxvbmcpIENyZWF0ZURpc2NhcmRhYmxlQml0bWFwMzIKICAzOSBzdGRjYWxsIENyZWF0ZUVsbGlwdGljUmduKGxvbmcgbG9uZyBsb25nIGxvbmcpIENyZWF0ZUVsbGlwdGljUmduMzIKQEAgLTIzNCwxMCArMjM0LDEwIEBACiAyMjcgc3RkY2FsbCBHZXRUZXh0Q29sb3IobG9uZykgR2V0VGV4dENvbG9yMzIKIDIyOCBzdGRjYWxsIEdldFRleHRFeHRlbnRFeFBvaW50QShsb25nIHN0ciBsb25nIGxvbmcgcHRyIHB0ciBwdHIpIEdldFRleHRFeHRlbnRFeFBvaW50MzJBCiAyMjkgc3RkY2FsbCBHZXRUZXh0RXh0ZW50RXhQb2ludFcobG9uZyB3c3RyIGxvbmcgbG9uZyBwdHIgcHRyIHB0cikgR2V0VGV4dEV4dGVudEV4UG9pbnQzMlcKLTIzMCBzdGRjYWxsIEdldFRleHRFeHRlbnRQb2ludDMyQShsb25nIHN0ciBsb25nIHB0cikgR2V0VGV4dEV4dGVudFBvaW50MzJBCi0yMzEgc3RkY2FsbCBHZXRUZXh0RXh0ZW50UG9pbnQzMlcobG9uZyB3c3RyIGxvbmcgcHRyKSBHZXRUZXh0RXh0ZW50UG9pbnQzMlcKLTIzMiBzdGRjYWxsIEdldFRleHRFeHRlbnRQb2ludEEobG9uZyBzdHIgbG9uZyBwdHIpIEdldFRleHRFeHRlbnRQb2ludDMyQUJ1Z2d5Ci0yMzMgc3RkY2FsbCBHZXRUZXh0RXh0ZW50UG9pbnRXKGxvbmcgd3N0ciBsb25nIHB0cikgR2V0VGV4dEV4dGVudFBvaW50MzJXQnVnZ3kKKzIzMCBzdGRjYWxsIEdldFRleHRFeHRlbnRQb2ludDMyQShsb25nIHB0ciBsb25nIHB0cikgR2V0VGV4dEV4dGVudFBvaW50MzJBCisyMzEgc3RkY2FsbCBHZXRUZXh0RXh0ZW50UG9pbnQzMlcobG9uZyBwdHIgbG9uZyBwdHIpIEdldFRleHRFeHRlbnRQb2ludDMyVworMjMyIHN0ZGNhbGwgR2V0VGV4dEV4dGVudFBvaW50QShsb25nIHB0ciBsb25nIHB0cikgR2V0VGV4dEV4dGVudFBvaW50MzJBQnVnZ3kKKzIzMyBzdGRjYWxsIEdldFRleHRFeHRlbnRQb2ludFcobG9uZyBwdHIgbG9uZyBwdHIpIEdldFRleHRFeHRlbnRQb2ludDMyV0J1Z2d5CiAyMzQgc3RkY2FsbCBHZXRUZXh0RmFjZUEobG9uZyBsb25nIHB0cikgR2V0VGV4dEZhY2UzMkEKIDIzNSBzdGRjYWxsIEdldFRleHRGYWNlVyhsb25nIGxvbmcgcHRyKSBHZXRUZXh0RmFjZTMyVwogMjM2IHN0ZGNhbGwgR2V0VGV4dE1ldHJpY3NBKGxvbmcgcHRyKSBHZXRUZXh0TWV0cmljczMyQQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3NoZWxsMzIuc3BlYyBiL2lmMTYzMi9zaGVsbDMyLnNwZWMKaW5kZXggYTA2NGI0Ni4uMDRkMWFiNyAxMDA2NDQKLS0tIGEvaWYxNjMyL3NoZWxsMzIuc3BlYworKysgYi9pZjE2MzIvc2hlbGwzMi5zcGVjCkBAIC01LDEyICs1LDEzIEBACiAjICh0aGVzZSBuZWVkIHRvIGhhdmUgdGhlc2UgZXhhY3Qgb3JkaW5hbHMsIGZvciBzb21lIHdpbjk1IGRsbHMgCiAjICBpbXBvcnQgc2hlbGwzMi5kbGwgYnkgb3JkaW5hbCkKIAorICAgMiBzdHViIFNIRUxMMzJfMgogICAgMyBzdHViIENoZWNrRXNjYXBlc0EKICAgIDYgc3R1YiBDaGVja0VzY2FwZXNXCiAgICA3IHN0ZGNhbGwgQ29tbWFuZExpbmVUb0FyZ3ZXKHB0ciBwdHIpIENvbW1hbmRMaW5lVG9Bcmd2VwogICAgOCBzdHViIENvbnRyb2xfRmlsbENhY2hlX1J1bkRMTAogICAxMiBzdGRjYWxsIENvbnRyb2xfUnVuRExMKGxvbmcgbG9uZyBsb25nIGxvbmcpIENvbnRyb2xfUnVuRExMCi0gIDE0IHN0dWIgRGxsR2V0Q2xhc3NPYmplY3QKKyAgMTQgc3RkY2FsbCBEbGxHZXRDbGFzc09iamVjdChsb25nIGxvbmcgcHRyKSBTSEVMTDMyX0RsbEdldENsYXNzT2JqZWN0CiAgIDIyIHN0dWIgRG9FbnZpcm9ubWVudFN1YnN0QQogICAzMyBzdHViIFNIRUxMMzJfMzMKICAgMzQgc3R1YiBTSEVMTDMyXzM0CmRpZmYgLS1naXQgYS9pZjE2MzIvc2lnbmFsLmMgYi9pZjE2MzIvc2lnbmFsLmMKaW5kZXggZDU4MTBkMS4uMDAzZTA2MiAxMDA2NDQKLS0tIGEvaWYxNjMyL3NpZ25hbC5jCisrKyBiL2lmMTYzMi9zaWduYWwuYwpAQCAtMzIsMTggKzMyLDYgQEAKICNpbmNsdWRlICJtaXNjZW11LmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCiAKLS8qIFNpZ25hbCBoYW5kbGVyIGRlY2xhcmF0aW9uICovCi0KLSNpZmRlZiBsaW51eAotIyBkZWZpbmUgSEFORExFUl9ERUYobmFtZSkgdm9pZCBuYW1lIChpbnQgc2lnbmFsLCBTSUdDT05URVhUIGNvbnRleHQpCi0jIGRlZmluZSBIQU5ETEVSX0NPTlRFWFQgKCZjb250ZXh0KQotI2VsaWYgZGVmaW5lZChfX3N2cjRfXykgfHwgZGVmaW5lZChfU0NPX0RTKQotIyBkZWZpbmUgSEFORExFUl9ERUYobmFtZSkgdm9pZCBuYW1lKGludCBzaWduYWwsIHZvaWQgKnNpZ2luZm8sIFNJR0NPTlRFWFQgKmNvbnRleHQpCi0jIGRlZmluZSBIQU5ETEVSX0NPTlRFWFQgY29udGV4dAotI2Vsc2UKLSMgZGVmaW5lIEhBTkRMRVJfREVGKG5hbWUpIHZvaWQgbmFtZShpbnQgc2lnbmFsLCBpbnQgY29kZSwgU0lHQ09OVEVYVCAqY29udGV4dCkKLSMgZGVmaW5lIEhBTkRMRVJfQ09OVEVYVCBjb250ZXh0Ci0jZW5kaWYKIAogZXh0ZXJuIHZvaWQgU0lHTkFMX1NldEhhbmRsZXIoIGludCBzaWcsIHZvaWQgKCpmdW5jKSgpLCBpbnQgZmxhZ3MgKTsKIGV4dGVybiBCT09MMzIgSU5TVFJfRW11bGF0ZUluc3RydWN0aW9uKCBTSUdDT05URVhUICpjb250ZXh0ICk7CkBAIC04MCw3ICs2OCw5IEBACiAgKi8KIHN0YXRpYyBIQU5ETEVSX0RFRihTSUdOQUxfZmF1bHQpCiB7Ci0gICAgaWYgKENTX3NpZyhIQU5ETEVSX0NPTlRFWFQpID09IFdJTkVfQ09ERV9TRUxFQ1RPUikKKyAgICBXT1JEIGNzOworICAgIEdFVF9DUyhjcyk7CisgICAgaWYgKENTX3NpZyhIQU5ETEVSX0NPTlRFWFQpID09IGNzKQogICAgIHsKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiU2VnbWVudGF0aW9uIGZhdWx0IGluIDMyLWJpdCBjb2RlICgweCUwOGx4KS5cbiIsCiAgICAgICAgICAgICAgICAgIEVJUF9zaWcoSEFORExFUl9DT05URVhUKSApOwpAQCAtMTIwLDEzICsxMTAsMTMgQEAKICNpZmRlZiBGU19zaWcKICAgICBGU19yZWcoY29udGV4dCkgID0gTE9XT1JEKEZTX3NpZyhzaWdjb250ZXh0KSk7CiAjZWxzZQotICAgIF9fYXNtX18oIm1vdncgJSVmcywldzAiOiI9ciIgKEZTX3JlZygmREVCVUdfY29udGV4dCkpKTsKKyAgICBHRVRfRlMoIEZTX3JlZygmREVCVUdfY29udGV4dCkgKTsKICAgICBGU19yZWcoY29udGV4dCkgJj0gMHhmZmZmOwogI2VuZGlmCiAjaWZkZWYgR1Nfc2lnCiAgICAgR1NfcmVnKGNvbnRleHQpICA9IExPV09SRChHU19zaWcoc2lnY29udGV4dCkpOwogI2Vsc2UKLSAgICBfX2FzbV9fKCJtb3Z3ICUlZ3MsJXcwIjoiPXIiIChHU19yZWcoJkRFQlVHX2NvbnRleHQpKSk7CisgICAgR0VUX0dTKCBHU19yZWcoJkRFQlVHX2NvbnRleHQpICk7CiAgICAgR1NfcmVnKGNvbnRleHQpICY9IDB4ZmZmZjsKICNlbmRpZgogfQpAQCAtMTU3LDEyICsxNDcsMTIgQEAKICNpZmRlZiBGU19zaWcKICAgICBGU19zaWcoc2lnY29udGV4dCkgID0gRlNfcmVnKGNvbnRleHQpOwogI2Vsc2UKLSAgICBfX2FzbV9fKCJtb3Z3ICV3MCwlJWZzIjo6InIiIChGU19yZWcoY29udGV4dCkpKTsKKyAgICBTRVRfRlMoIEZTX3JlZygmREVCVUdfY29udGV4dCkgKTsKICNlbmRpZgogI2lmZGVmIEdTX3NpZwogICAgIEdTX3NpZyhzaWdjb250ZXh0KSAgPSBHU19yZWcoY29udGV4dCk7CiAjZWxzZQotICAgIF9fYXNtX18oIm1vdncgJXcwLCUlZ3MiOjoiciIgKEdTX3JlZyhjb250ZXh0KSkpOworICAgIFNFVF9HUyggR1NfcmVnKCZERUJVR19jb250ZXh0KSApOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2lmMTYzMi90aHVuay5jIGIvaWYxNjMyL3RodW5rLmMKaW5kZXggMDUwMmYyOC4uNGE5YTQ0NiAxMDA2NDQKLS0tIGEvaWYxNjMyL3RodW5rLmMKKysrIGIvaWYxNjMyL3RodW5rLmMKQEAgLTkzLDExICs5MywxNCBAQAogLyogVEFTS19SZXNjaGVkdWxlKCkgMTYtYml0IGVudHJ5IHBvaW50ICovCiBzdGF0aWMgRkFSUFJPQzE2IFRBU0tfUmVzY2hlZHVsZVByb2M7CiAKK2V4dGVybiB2b2lkIENhbGxGcm9tMTZfbG9uZ193d3dsbCh2b2lkKTsKKwogLyogQ2FsbGJhY2tzIGZ1bmN0aW9uIHRhYmxlIGZvciB0aGUgZW11bGF0b3IgKi8KIHN0YXRpYyBjb25zdCBDQUxMQkFDS1NfVEFCTEUgQ0FMTEJBQ0tfRW11bGF0b3JUYWJsZSA9CiB7CiAgICAgKHZvaWQgKilDYWxsVG8xNl9yZWdzX3Nob3J0LCAgICAgICAgICAgLyogQ2FsbFJlZ2lzdGVyUHJvYyAqLwogICAgIFRIVU5LX0NhbGxUYXNrUmVzY2hlZHVsZSwgICAgICAgICAgICAgIC8qIENhbGxUYXNrUmVzY2hlZHVsZVByb2MgKi8KKyAgICBDYWxsRnJvbTE2X2xvbmdfd3d3bGwsICAgICAgICAgICAgICAgICAvKiBDYWxsRnJvbTE2V25kUHJvYyAqLwogICAgIFRIVU5LX0NhbGxXbmRQcm9jMTYsICAgICAgICAgICAgICAgICAgIC8qIENhbGxXbmRQcm9jICovCiAgICAgKHZvaWQgKilDYWxsVG8xNl9sb25nX2x3d2xsLCAgICAgICAgICAgLyogQ2FsbERyaXZlclByb2MgKi8KICAgICAodm9pZCAqKUNhbGxUbzE2X3dvcmRfd3dsbGwsICAgICAgICAgICAvKiBDYWxsRHJpdmVyQ2FsbGJhY2sgKi8KQEAgLTIwOSwxNiArMjEyLDMyIEBACiAgICAgRUJQX3JlZygmY29udGV4dCkgPSBPRkZTRVRPRihJRjE2MzJfU2F2ZWQxNl9zc19zcCkKICAgICAgICAgICAgICAgICAgICAgICAgICsgKFdPUkQpJigoU1RBQ0sxNkZSQU1FKikwKS0+YnA7CiAKLSAgICBpZiAoKChtc2cgPT0gV01fQ1JFQVRFKSB8fCAobXNnID09IFdNX05DQ1JFQVRFKSkgJiYgbFBhcmFtKQorICAgIGlmIChsUGFyYW0pCiAgICAgewotICAgICAgICAvKiBCdWlsZCB0aGUgQ1JFQVRFU1RSVUNUIG9uIHRoZSAxNi1iaXQgc3RhY2suICovCi0gICAgICAgIC8qIFRoaXMgaXMgcmVhbGx5IHVnbHksIGJ1dCBzb21lIHByb2dyYW1zIChub3RhYmx5IHRoZSAqLwotICAgICAgICAvKiAiVW5kb2N1bWVudGVkIFdpbmRvd3MiIGV4YW1wbGVzKSB3YW50IGl0IHRoYXQgd2F5LiAgKi8KLSAgICAgICAgQ1JFQVRFU1RSVUNUMTYgKmNzID0gKENSRUFURVNUUlVDVDE2ICopUFRSX1NFR19UT19MSU4obFBhcmFtKTsKLSAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKCpjcyk7Ci0gICAgICAgIGxQYXJhbSA9IFNUQUNLMTZfUFVTSCggb2Zmc2V0ICk7Ci0gICAgICAgIG1lbWNweSggUFRSX1NFR19UT19MSU4obFBhcmFtKSwgY3MsIG9mZnNldCApOworCS8qIFNvbWUgcHJvZ3JhbXMgKGVnLiB0aGUgIlVuZG9jdW1lbnRlZCBXaW5kb3dzIiBleGFtcGxlcywgSldQKSBvbmx5CisgICAgICAgICAgIHdvcmsgaWYgc3RydWN0dXJlcyBwYXNzZWQgaW4gbFBhcmFtIGFyZSBwbGFjZWQgaW4gdGhlIHN0YWNrL2RhdGEKKyAgICAgICAgICAgc2VnbWVudC4gUHJvZ3JhbW1lcnMgZWFzaWx5IG1ha2UgdGhlIG1pc3Rha2Ugb2YgY29udmVydGluZyBsUGFyYW0KKyAgICAgICAgICAgdG8gYSBuZWFyIHJhdGhlciB0aGFuIGEgZmFyIHBvaW50ZXIsIHNpbmNlIFdpbmRvd3MgYXBwYXJlbnRseQorICAgICAgICAgICBhbGxvd3MgdGhpcy4gV2UgY29weSB0aGUgc3RydWN0dXJlcyB0byB0aGUgMTYgYml0IHN0YWNrOyB0aGlzIGlzCisgICAgICAgICAgIHVnbHkgYnV0IG1ha2VzIHRoZXNlIHByb2dyYW1zIHdvcmsuICovCisJc3dpdGNoIChtc2cpCisJeworCSAgY2FzZSBXTV9DUkVBVEU6CisJICBjYXNlIFdNX05DQ1JFQVRFOgorCSAgICBvZmZzZXQgPSBzaXplb2YoQ1JFQVRFU1RSVUNUMTYpOyBicmVhazsKKwkgIGNhc2UgV01fRFJBV0lURU06CisJICAgIG9mZnNldCA9IHNpemVvZihEUkFXSVRFTVNUUlVDVDE2KTsgYnJlYWs7CisJICBjYXNlIFdNX0NPTVBBUkVJVEVNOgorCSAgICBvZmZzZXQgPSBzaXplb2YoQ09NUEFSRUlURU1TVFJVQ1QxNik7IGJyZWFrOworCX0KKwlpZiAob2Zmc2V0KQorCXsKKwkgICAgdm9pZCAqcyA9IFBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CisJICAgIGxQYXJhbSA9IFNUQUNLMTZfUFVTSCggb2Zmc2V0ICk7CisJICAgIG1lbWNweSggUFRSX1NFR19UT19MSU4obFBhcmFtKSwgcywgb2Zmc2V0ICk7CisJfQogICAgIH0KKwogICAgIGFyZ3MgPSAoV09SRCAqKUNVUlJFTlRfU1RBQ0sxNiAtIDc7CiAgICAgYXJnc1swXSA9IExPV09SRChsUGFyYW0pOwogICAgIGFyZ3NbMV0gPSBISVdPUkQobFBhcmFtKTsKZGlmZiAtLWdpdCBhL2lmMTYzMi91c2VyLnNwZWMgYi9pZjE2MzIvdXNlci5zcGVjCmluZGV4IGRkNThlYzkuLjUyMWRlYjkgMTAwNjQ0Ci0tLSBhL2lmMTYzMi91c2VyLnNwZWMKKysrIGIvaWYxNjMyL3VzZXIuc3BlYwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAzODkgc3R1YiBMb2FkSW1hZ2UKIDM5MCBzdHViIENvcHlJbWFnZQogMzkxIHN0dWIgU2lnbmFsUHJvYzMyCi0zOTQgc3R1YiBEcmF3SWNvbkV4CiszOTQgcGFzY2FsMTYgRHJhd0ljb25FeCh3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCkgRHJhd0ljb25FeDE2CiAzOTUgc3R1YiBHZXRJY29uSW5mbwogMzk3IHBhc2NhbDE2IFJlZ2lzdGVyQ2xhc3NFeChwdHIpIFJlZ2lzdGVyQ2xhc3NFeDE2CiAzOTggcGFzY2FsMTYgR2V0Q2xhc3NJbmZvRXgod29yZCBzZWdzdHIgcHRyKSBHZXRDbGFzc0luZm9FeDE2CkBAIC00OTEsNyArNDkxLDcgQEAKIDY2MiBzdHViIERyYXdNZW51YmFyVGVtcAogNjYzIHN0dWIgR2V0TWVudURlZmF1bHRJdGVtCiA2NjQgc3R1YiBTZXRNZW51RGVmYXVsdEl0ZW0KLTY2NSBzdHViIEdldE1lbnVJdGVtUmVjdAorNjY1IHBhc2NhbDE2IEdldE1lbnVJdGVtUmVjdCh3b3JkIHdvcmQgd29yZCBwdHIpIEdldE1lbnVJdGVtUmVjdDE2CiA2NjYgc3R1YiBDaGVja01lbnVSYWRpb0l0ZW0KIDY2NyBzdHViIFRyYWNrUG9wdXBNZW51RXgKIDY2OCBzdHViIFNldFdpbmRvd1JnbgpkaWZmIC0tZ2l0IGEvaWYxNjMyL3VzZXIzMi5zcGVjIGIvaWYxNjMyL3VzZXIzMi5zcGVjCmluZGV4IGI2ZjMyMWIuLjkxNzgyYjYgMTAwNjQ0Ci0tLSBhL2lmMTYzMi91c2VyMzIuc3BlYworKysgYi9pZjE2MzIvdXNlcjMyLnNwZWMKQEAgLTQ3LDcgKzQ3LDcgQEAKICA0NCBzdGRjYWxsIENoYXJVcHBlclcod3N0cikgQ2hhclVwcGVyMzJXCiAgNDUgc3RkY2FsbCBDaGVja0RsZ0J1dHRvbihsb25nIGxvbmcgbG9uZykgQ2hlY2tEbGdCdXR0b24zMgogIDQ2IHN0ZGNhbGwgQ2hlY2tNZW51SXRlbShsb25nIGxvbmcgbG9uZykgQ2hlY2tNZW51SXRlbTMyCi0gNDcgc3R1YiBDaGVja01lbnVSYWRpb0l0ZW0KKyA0NyBzdGRjYWxsIENoZWNrTWVudVJhZGlvSXRlbShsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIENoZWNrTWVudVJhZGlvSXRlbTMyCiAgNDggc3RkY2FsbCBDaGVja1JhZGlvQnV0dG9uKGxvbmcgbG9uZyBsb25nIGxvbmcpIENoZWNrUmFkaW9CdXR0b24zMgogIDQ5IHN0ZGNhbGwgQ2hpbGRXaW5kb3dGcm9tUG9pbnQobG9uZyBsb25nIGxvbmcpIENoaWxkV2luZG93RnJvbVBvaW50MzIKICA1MCBzdHViIENoaWxkV2luZG93RnJvbVBvaW50RXgKQEAgLTU4LDggKzU4LDggQEAKICA1NSBzdHViIENsb3NlRGVza3RvcAogIDU2IHN0ZGNhbGwgQ2xvc2VXaW5kb3cobG9uZykgQ2xvc2VXaW5kb3czMgogIDU3IHN0dWIgQ2xvc2VXaW5kb3dTdGF0aW9uCi0gNTggc3R1YiBDb3B5QWNjZWxlcmF0b3JUYWJsZUEKLSA1OSBzdHViIENvcHlBY2NlbGVyYXRvclRhYmxlVworIDU4IHN0ZGNhbGwgQ29weUFjY2VsZXJhdG9yVGFibGVBKGxvbmcgcHRyIGxvbmcpIENvcHlBY2NlbGVyYXRvclRhYmxlMzJBCisgNTkgc3RkY2FsbCBDb3B5QWNjZWxlcmF0b3JUYWJsZVcobG9uZyBwdHIgbG9uZykgQ29weUFjY2VsZXJhdG9yVGFibGUzMlcKICA2MCBzdGRjYWxsIENvcHlJY29uKGxvbmcpIENvcHlJY29uMzIKICA2MSBzdGRjYWxsIENvcHlJbWFnZShsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIENvcHlJbWFnZTMyCiAgNjIgc3RkY2FsbCBDb3B5UmVjdChwdHIgcHRyKSBDb3B5UmVjdDMyCkBAIC0xMzIsNyArMTMyLDcgQEAKIDEyNyBzdGRjYWxsIERlZldpbmRvd1Byb2NXKGxvbmcgbG9uZyBsb25nIGxvbmcpIERlZldpbmRvd1Byb2MzMlcKIDEyOCBzdGRjYWxsIERlZmVyV2luZG93UG9zKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgRGVmZXJXaW5kb3dQb3MzMgogMTI5IHN0ZGNhbGwgRGVsZXRlTWVudShsb25nIGxvbmcgbG9uZykgRGVsZXRlTWVudTMyCi0xMzAgc3R1YiBEZXN0cm95QWNjZWxlcmF0b3JUYWJsZQorMTMwIHN0ZGNhbGwgRGVzdHJveUFjY2VsZXJhdG9yVGFibGUobG9uZykgRGVzdHJveUFjY2VsZXJhdG9yVGFibGUKIDEzMSBzdGRjYWxsIERlc3Ryb3lDYXJldCgpIERlc3Ryb3lDYXJldDMyCiAxMzIgc3RkY2FsbCBEZXN0cm95Q3Vyc29yKGxvbmcpIERlc3Ryb3lDdXJzb3IzMgogMTMzIHN0ZGNhbGwgRGVzdHJveUljb24obG9uZykgRGVzdHJveUljb24zMgpAQCAtMTYyLDcgKzE2Miw3IEBACiAxNTcgc3R1YiBEcmF3RnJhbWUKIDE1OCBzdGRjYWxsIERyYXdGcmFtZUNvbnRyb2wobG9uZyBwdHIgbG9uZyBsb25nKSBEcmF3RnJhbWVDb250cm9sMzIKIDE1OSBzdGRjYWxsIERyYXdJY29uKGxvbmcgbG9uZyBsb25nIGxvbmcpIERyYXdJY29uMzIKLTE2MCBzdHViIERyYXdJY29uRXgKKzE2MCBzdGRjYWxsIERyYXdJY29uRXgobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIERyYXdJY29uRXgzMgogMTYxIHN0ZGNhbGwgRHJhd01lbnVCYXIobG9uZykgRHJhd01lbnVCYXIzMgogMTYyIHN0ZGNhbGwgRHJhd1N0YXRlQShsb25nIGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIERyYXdTdGF0ZTMyQQogMTYzIHN0dWIgRHJhd1N0YXRlVwpAQCAtMjY4LDcgKzI2OCw3IEBACiAyNjMgc3RkY2FsbCBHZXRNZW51SXRlbUlEKGxvbmcgbG9uZykgR2V0TWVudUl0ZW1JRDMyCiAyNjQgc3RkY2FsbCBHZXRNZW51SXRlbUluZm9BKGxvbmcgbG9uZyBsb25nIHB0cikgR2V0TWVudUl0ZW1JbmZvMzJBCiAyNjUgc3RkY2FsbCBHZXRNZW51SXRlbUluZm9XKGxvbmcgbG9uZyBsb25nIHB0cikgR2V0TWVudUl0ZW1JbmZvMzJXCi0yNjYgc3R1YiBHZXRNZW51SXRlbVJlY3QKKzI2NiBzdGRjYWxsIEdldE1lbnVJdGVtUmVjdChsb25nIGxvbmcgbG9uZyBwdHIpIEdldE1lbnVJdGVtUmVjdDMyCiAyNjcgc3RkY2FsbCBHZXRNZW51U3RhdGUobG9uZyBsb25nIGxvbmcpIEdldE1lbnVTdGF0ZTMyCiAyNjggc3RkY2FsbCBHZXRNZW51U3RyaW5nQShsb25nIGxvbmcgcHRyIGxvbmcgbG9uZykgR2V0TWVudVN0cmluZzMyQQogMjY5IHN0ZGNhbGwgR2V0TWVudVN0cmluZ1cobG9uZyBsb25nIHB0ciBsb25nIGxvbmcpIEdldE1lbnVTdHJpbmczMlcKZGlmZiAtLWdpdCBhL2lmMTYzMi93cHJvY3Muc3BlYyBiL2lmMTYzMi93cHJvY3Muc3BlYwppbmRleCAzNTFjOTc0Li5mNzNhMTE4IDEwMDY0NAotLS0gYS9pZjE2MzIvd3Byb2NzLnNwZWMKKysrIGIvaWYxNjMyL3dwcm9jcy5zcGVjCkBAIC0xLDcgKzEsNiBAQAogbmFtZQl3cHJvY3MKIHR5cGUJd2luMTYKIAotMTAgcGFzY2FsIE1ESUNsaWVudFduZFByb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgTURJQ2xpZW50V25kUHJvYwogMTQgcGFzY2FsIEZpbGVPcGVuRGxnUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBGaWxlT3BlbkRsZ1Byb2MKIDE1IHBhc2NhbCBGaWxlU2F2ZURsZ1Byb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgRmlsZVNhdmVEbGdQcm9jCiAxNiBwYXNjYWwgQ29sb3JEbGdQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIENvbG9yRGxnUHJvYwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY2NlbC5oIGIvaW5jbHVkZS9hY2NlbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWIzYmU4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYWNjZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIEFDQ0VMRVJBVE9SUwotICoKLSAqIHRha2VuIHN0cmFpZ2h0IGZyb20gV2luMzIgU0RLIGluY2x1ZGVzCi0gKi8KLQotI2lmbmRlZiBfX1dJTkVfQUNDRUxfSAotI2RlZmluZSBfX1dJTkVfQUNDRUxfSAotCi0jaW5jbHVkZSAid2luZG93cy5oIgotCi0jcHJhZ21hIHBhY2soMSkKLQotI2RlZmluZQlGVklSVEtFWQlUUlVFICAgICAgICAgIC8qIEFzc3VtZWQgdG8gYmUgPT0gVFJVRSAqLwotI2RlZmluZQlGTk9JTlZFUlQJMHgwMgotI2RlZmluZQlGU0hJRlQJCTB4MDQKLSNkZWZpbmUJRkNPTlRST0wJMHgwOAotI2RlZmluZQlGQUxUCQkweDEwCi0KLXR5cGVkZWYgc3RydWN0IHRhZ0FDQ0VMMTYgewotCUJZVEUJZlZpcnQ7CQkvKiBBbHNvIGNhbGxlZCB0aGUgZmxhZ3MgZmllbGQgKi8KLQlXT1JECWtleTsKLQlXT1JECWNtZDsKLX0gQUNDRUwxNiwgKkxQQUNDRUwxNjsKLQotdHlwZWRlZiBzdHJ1Y3QgdGFnQUNDRUwzMiB7Ci0JQllURQlmVmlydDsJCS8qIEFsc28gY2FsbGVkIHRoZSBmbGFncyBmaWVsZCAqLwotCUJZVEUJcGFkMDsKLQlXT1JECWtleTsKLQlXT1JECWNtZDsKLQlXT1JECXBhZDE7Ci19IEFDQ0VMMzIsICpMUEFDQ0VMMzI7Ci0KLSNwcmFnbWEgcGFjayg0KQotCi0jZW5kaWYgIC8qIF9fV0lORV9BQ0NFTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcHMvb2JtX3JhZGlvY2hlY2sgYi9pbmNsdWRlL2JpdG1hcHMvb2JtX3JhZGlvY2hlY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjYzRlOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vYm1fcmFkaW9jaGVjawpAQCAtMCwwICsxLDIzIEBACisvKiBYUE0gKi8KK3N0YXRpYyBjaGFyICpvYm1fcmFkaW9jaGVja1tdID0geworLyogc2l6ZSAqLworIjE0IDE0IDIgMSIsCisvKiBjb2xvcnMgKi8KKyIuCXMgd2hpdGUJYyB3aGl0ZSIsCisiIwlzIGJsYWNrCWMgYmxhY2siLAorLyogcGl4ZWxzICovCisiLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4jIyMjLi4uLi4iLAorIi4uLi4jIyMjIyMuLi4uIiwKKyIuLi4jIyMjIyMjIy4uLiIsCisiLi4uIyMjIyMjIyMuLi4iLAorIi4uLiMjIyMjIyMjLi4uIiwKKyIuLi4jIyMjIyMjIy4uLiIsCisiLi4uLiMjIyMjIy4uLi4iLAorIi4uLi4uIyMjIy4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uIgorfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYml0bWFwcy9vY3JfaWJlYW0gYi9pbmNsdWRlL2JpdG1hcHMvb2NyX2liZWFtCmluZGV4IDVmNzc1NjQuLmUzNzJhMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYml0bWFwcy9vY3JfaWJlYW0KKysrIGIvaW5jbHVkZS9iaXRtYXBzL29jcl9pYmVhbQpAQCAtMSw2ICsxLDYgQEAKIC8qIFhQTSAqLwogc3RhdGljIGNoYXIgKiBvY3JfaWJlYW1bXSA9IHsKLSIzMiAzMiAyIDEgMCA4IiwKKyIzMiAzMiAyIDEgMyA4IiwKICIgCXMgYmxhY2sgYyBibGFjayIsCiAiLglzIE5vbmUJYyBOb25lIiwKICIgICAuICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbGxiYWNrLmggYi9pbmNsdWRlL2NhbGxiYWNrLmgKaW5kZXggY2JiMjM1ZS4uODZiNjA0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYWxsYmFjay5oCisrKyBiL2luY2x1ZGUvY2FsbGJhY2suaApAQCAtMjEsNiArMjEsNyBAQAogewogICAgIFZPSUQgKENBTExCQUNLICpDYWxsUmVnaXN0ZXJQcm9jKSggQ09OVEVYVCAqLCBJTlQzMiApOwogICAgIFZPSUQgKENBTExCQUNLICpDYWxsVGFza1Jlc2NoZWR1bGVQcm9jKSh2b2lkKTsKKyAgICBWT0lEIChDQUxMQkFDSyAqQ2FsbEZyb20xNlduZFByb2MpKHZvaWQpOwogICAgIExSRVNVTFQgKENBTExCQUNLICpDYWxsV25kUHJvYykoIFdORFBST0MxNiwgSFdORDE2LCBVSU5UMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMTYsIExQQVJBTSApOwogICAgIExSRVNVTFQgKENBTExCQUNLICpDYWxsRHJpdmVyUHJvYykoIERSSVZFUlBST0MxNiwgRFdPUkQsIEhEUlZSMTYsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsaXBib2FyZC5oIGIvaW5jbHVkZS9jbGlwYm9hcmQuaAppbmRleCBkMDA3MGRmLi42OWVmMWQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsaXBib2FyZC5oCisrKyBiL2luY2x1ZGUvY2xpcGJvYXJkLmgKQEAgLTEsOSArMSwxMCBAQAogI2lmbmRlZiBfX1dJTkVfQ0xJUEJPQVJEX0gKICNkZWZpbmUgX19XSU5FX0NMSVBCT0FSRF9ICiAKLXZvaWQgQ0xJUEJPQVJEX1JlYWRTZWxlY3Rpb24oV2luZG93IHcsQXRvbSBwcm9wKTsKLXZvaWQgQ0xJUEJPQVJEX1JlbGVhc2VTZWxlY3Rpb24oV2luZG93IHcsSFdORDMyIGh3bmQpOwotdm9pZCBDTElQQk9BUkRfRGlzT3duKFdORCogcFduZCk7Cit2b2lkIENMSVBCT0FSRF9SZXNldExvY2soSFFVRVVFMTYgaHFSZWYsIEhRVUVVRTE2IGhxTmV3KTsKK3ZvaWQgQ0xJUEJPQVJEX1Jlc2V0T3duZXIoV05EKiBwV25kKTsKK3ZvaWQgQ0xJUEJPQVJEX1JlYWRTZWxlY3Rpb24oV2luZG93IHcsIEF0b20gcHJvcCk7Cit2b2lkIENMSVBCT0FSRF9SZWxlYXNlU2VsZWN0aW9uKFdpbmRvdyB3LCBIV05EMzIgaHduZCk7CiBCT09MMzIgQ0xJUEJPQVJEX0lzUHJlc2VudChXT1JEIHdGb3JtYXQpOwogCiAjZW5kaWYgLyogX19XSU5FX0NMSVBCT0FSRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RjZS5oIGIvaW5jbHVkZS9kY2UuaAppbmRleCA5NzE4ZGY2Li4xMWQyMzVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RjZS5oCisrKyBiL2luY2x1ZGUvZGNlLmgKQEAgLTUyLDYgKzUyLDYgQEAKIGV4dGVybiB2b2lkICBEQ0VfRnJlZVdpbmRvd0RDRSggV05EKiApOwogZXh0ZXJuIElOVDE2IERDRV9FeGNsdWRlUmduKCBIREMzMiwgV05EKiwgSFJHTjMyICk7CiBleHRlcm4gSFJHTjMyIERDRV9HZXRWaXNSZ24oIEhXTkQzMiwgV09SRCApOwotZXh0ZXJuIEJPT0wzMiBEQ0VfSW52YWxpZGF0ZURDRSggV05EKiwgUkVDVDMyKiApOworZXh0ZXJuIEJPT0wzMiBEQ0VfSW52YWxpZGF0ZURDRSggV05EKiwgY29uc3QgUkVDVDMyKiApOwogCiAjZW5kaWYgIC8qIF9fV0lORV9EQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZGVtbC5oIGIvaW5jbHVkZS9kZGVtbC5oCmluZGV4IGQyZDRkMTEuLjg0NWE1OGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGRlbWwuaAorKysgYi9pbmNsdWRlL2RkZW1sLmgKQEAgLTIsNiArMiw3IEBACiAgKiBEREVNTCBsaWJyYXJ5IGRlZmluaXRpb25zCiAgKgogICogQ29weXJpZ2h0IDE5OTcgQWxleGFuZHJlIEp1bGxpYXJkCisgKiBDb3B5cmlnaHQgMTk5NyBMZW4gV2hpdGUKICAqLwogCiAjaWZuZGVmIF9fV0lORV9fRERFTUxfSApAQCAtNTAsMTIgKzUxLDE3IEBACiBCT09MMTYgICAgV0lOQVBJIERkZVVuaW5pdGlhbGl6ZTE2KERXT1JEKTsKIEJPT0wzMiAgICBXSU5BUEkgRGRlVW5pbml0aWFsaXplMzIoRFdPUkQpOwogI2RlZmluZSAgIERkZVVuaW5pdGlhbGl6ZSBXSU5FTElCX05BTUUoRGRlVW5pbml0aWFsaXplKQorSENPTlZMSVNUIFdJTkFQSSBEZGVDb25uZWN0TGlzdChEV09SRCxIU1osSFNaLEhDT05WTElTVCxMUENPTlZDT05URVhUMTYpOworSENPTlYgICAgIFdJTkFQSSBEZGVRdWVyeU5leHRTZXJ2ZXIoSENPTlZMSVNULCBIQ09OVik7CitCT09MMTYgICAgV0lOQVBJIERkZURpc2Nvbm5lY3RMaXN0KEhDT05WTElTVCk7CiBIQ09OViAgICAgV0lOQVBJIERkZUNvbm5lY3QxNihEV09SRCxIU1osSFNaLExQQ09OVkNPTlRFWFQxNik7CiBIQ09OViAgICAgV0lOQVBJIERkZUNvbm5lY3QzMihEV09SRCxIU1osSFNaLExQQ09OVkNPTlRFWFQzMik7CiAjZGVmaW5lICAgRGRlQ29ubmVjdCBXSU5FTElCX05BTUUoRGRlQ29ubmVjdCkKIEJPT0wxNiAgICBXSU5BUEkgRGRlRGlzY29ubmVjdDE2KEhDT05WKTsKIEJPT0wzMiAgICBXSU5BUEkgRGRlRGlzY29ubmVjdDMyKEhDT05WKTsKICNkZWZpbmUgICBEZGVEaXNjb25uZWN0IFdJTkVMSUJfTkFNRShEZGVEaXNjb25uZWN0KQorQk9PTDE2ICAgIFdJTkFQSSBEZGVTZXRVc2VySGFuZGxlKEhDT05WLERXT1JELERXT1JEKTsKK0hEREVEQVRBICBXSU5BUEkgRGRlQ3JlYXRlSGFuZGxlRGF0YShEV09SRCxMUEJZVEUsRFdPUkQsRFdPUkQsSFNaLFVJTlQxNixVSU5UMTYpOwogSENPTlYgICAgIFdJTkFQSSBEZGVSZWNvbm5lY3QoSENPTlYpOwogSFNaICAgICAgIFdJTkFQSSBEZGVDcmVhdGVTdHJpbmdIYW5kbGUxNihEV09SRCxMUENTVFIsSU5UMTYpOwogSFNaICAgICAgIFdJTkFQSSBEZGVDcmVhdGVTdHJpbmdIYW5kbGUzMkEoRFdPUkQsTFBDU1RSLElOVDMyKTsKQEAgLTc1LDYgKzgxLDE2IEBACiBIRERFREFUQSAgV0lOQVBJIERkZUNsaWVudFRyYW5zYWN0aW9uMzIoTFBCWVRFLERXT1JELEhDT05WLEhTWixVSU5UMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyLERXT1JELExQRFdPUkQpOwogI2RlZmluZSAgIERkZUNsaWVudFRyYW5zYWN0aW9uIFdJTkVMSUJfTkFNRShEZGVDbGllbnRUcmFuc2FjdGlvbikKK0JPT0wxNiAgICBXSU5BUEkgRGRlQWJhbmRvblRyYW5zYWN0aW9uKERXT1JELEhDT05WLERXT1JEKTsKK0JPT0wxNiAgICBXSU5BUEkgRGRlUG9zdEFkdmlzZShEV09SRCxIU1osSFNaKTsKK0hEREVEQVRBICBXSU5BUEkgRGRlQWRkRGF0YShIRERFREFUQSxMUEJZVEUsRFdPUkQsRFdPUkQpOworRFdPUkQgICAgIFdJTkFQSSBEZGVHZXREYXRhKEhEREVEQVRBLExQQllURSxEV09SRCxEV09SRCk7CitMUEJZVEUgICAgV0lOQVBJIERkZUFjY2Vzc0RhdGEoSERERURBVEEsTFBEV09SRCk7CitCT09MMTYgICAgV0lOQVBJIERkZVVuYWNjZXNzRGF0YShIRERFREFUQSk7CitCT09MMTYgICAgV0lOQVBJIERkZUVuYWJsZUNhbGxiYWNrKERXT1JELEhDT05WLFVJTlQxNik7CitpbnQgICAgICAgV0lOQVBJIERkZUNtcFN0cmluZ0hhbmRsZXMoSFNaLEhTWik7CisKKwogSERERURBVEEgIFdJTkFQSSBEZGVOYW1lU2VydmljZTE2KERXT1JELEhTWixIU1osVUlOVDE2KTsKIEhEREVEQVRBICBXSU5BUEkgRGRlTmFtZVNlcnZpY2UzMihEV09SRCxIU1osSFNaLFVJTlQzMik7CiAjZGVmaW5lICAgRGRlTmFtZVNlcnZpY2UgV0lORUxJQl9OQU1FKERkZU5hbWVTZXJ2aWNlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZWJ1Z2dlci5oIGIvaW5jbHVkZS9kZWJ1Z2dlci5oCmluZGV4IDJkN2QwMjUuLmI4NzJiM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGVidWdnZXIuaAorKysgYi9pbmNsdWRlL2RlYnVnZ2VyLmgKQEAgLTg2LDkgKzg2LDkgQEAKIAogCiAjZGVmaW5lIERCR19GSVhfQUREUl9TRUcoYWRkcixkZWZhdWx0KSBcCi0gICAgeyBpZiAoKGFkZHIpLT5zZWcgPT0gMHhmZmZmZmZmZikgKGFkZHIpLT5zZWcgPSAoZGVmYXVsdCk7IFwKLSAgICAgIGlmICgoKGFkZHIpLT5zZWcgPT0gV0lORV9DT0RFX1NFTEVDVE9SKSB8fCBcCi0gICAgICAgICAgIChhZGRyKS0+c2VnID09IFdJTkVfREFUQV9TRUxFQ1RPUikgKGFkZHIpLT5zZWcgPSAwOyB9CisgICAgeyBXT1JEIGNzLCBkczsgR0VUX0NTKGNzKTsgR0VUX0RTKGRzKTsgXAorICAgICAgaWYgKChhZGRyKS0+c2VnID09IDB4ZmZmZmZmZmYpIChhZGRyKS0+c2VnID0gKGRlZmF1bHQpOyBcCisgICAgICBpZiAoKChhZGRyKS0+c2VnID09IGNzKSB8fCAoYWRkciktPnNlZyA9PSBkcykgKGFkZHIpLT5zZWcgPSAwOyB9CiAKICNkZWZpbmUgREJHX0FERFJfVE9fTElOKGFkZHIpIFwKICAgICAoKGFkZHIpLT5zZWcgPyAoY2hhciAqKVBUUl9TRUdfT0ZGX1RPX0xJTigoYWRkciktPnNlZywoYWRkciktPm9mZikgXApAQCAtMjY2LDggKzI2Niw4IEBACiBleHRlcm4gaW50IERFQlVHX1JlYWRFeGVjdXRhYmxlRGJnSW5mbyh2b2lkKTsKIAogICAvKiBkZWJ1Z2dlci9tc2MuYyAqLwotZXh0ZXJuIGludCBERUJVR19SZWdpc3RlckRlYnVnSW5mbyhzdHJ1Y3QgcGVfZGF0YSAqcGUsCi0JCQkJICAgaW50LCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBpbnQgREVCVUdfUmVnaXN0ZXJEZWJ1Z0luZm8oc3RydWN0IHBlX2RhdGEgKnBlLCBpbnQsIGNvbnN0IGNoYXIgKiwKKwkJCQkgICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiBpbnQgREVCVUdfUHJvY2Vzc0RlZmVycmVkRGVidWcodm9pZCk7CiBleHRlcm4gaW50IERFQlVHX1JlZ2lzdGVyRUxGRGVidWdJbmZvKGludCBsb2FkX2FkZHIsIHVfbG9uZyBzaXplLCBjaGFyICogbmFtZSk7CiBleHRlcm4gdm9pZCBERUJVR19JbmZvU2hhcmUodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVnc3RyLmggYi9pbmNsdWRlL2RlYnVnc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBhYzg2NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZGVidWdzdHIuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9fV0lORV9ERUJVR1NUUl9ICisjZGVmaW5lIF9fV0lORV9ERUJVR1NUUl9ICisKKyNpbmNsdWRlICJ3aW50eXBlcy5oIgorCisvKiBUaGVzZSBmdW5jdGlvbiByZXR1cm4gYSBwcmludGFibGUgdmVyc2lvbiBvZiBhIHN0cmluZywgaW5jbHVkaW5nCisgICBxdW90ZXMuICBUaGUgc3RyaW5nIHdpbGwgYmUgdmFsaWQgZm9yIHNvbWUgdGltZSwgYnV0IG5vdCBpbmRlZmluaXRlbHkKKyAgIGFzIHN0cmluZ3MgYXJlIHJlLXVzZWQuICAqLworCitMUFNUUiBkZWJ1Z3N0cl9hbiAoTFBDU1RSIHMsIGludCBuKTsKK0xQU1RSIGRlYnVnc3RyX2EgKExQQ1NUUiBzKTsKK0xQU1RSIGRlYnVnc3RyX3duIChMUENXU1RSIHMsIGludCBuKTsKK0xQU1RSIGRlYnVnc3RyX3cgKExQQ1dTVFIgcyk7CisKKyNlbmRpZiAvKiBfX1dJTkVfREVCVUdTVFJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9nZGkuaCBiL2luY2x1ZGUvZ2RpLmgKaW5kZXggNGYyYzRlMS4uZDc0NGE0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9nZGkuaAorKysgYi9pbmNsdWRlL2dkaS5oCkBAIC0zMTgsNiArMzE4LDUgQEAKIGV4dGVybiBTY3JlZW4gKiBzY3JlZW47CiBleHRlcm4gV2luZG93IHJvb3RXaW5kb3c7CiBleHRlcm4gaW50IHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQsIHNjcmVlbkRlcHRoOwotZXh0ZXJuIGludCBkZXNrdG9wWCwgZGVza3RvcFk7ICAgLyogbWlzYy9tYWluLmMgKi8KIAogI2VuZGlmICAvKiBfX1dJTkVfR0RJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUva2V5Ym9hcmQuaCBiL2luY2x1ZGUva2V5Ym9hcmQuaAppbmRleCA5NDY1ZTNjLi4yMzA5MjczIDEwMDY0NAotLS0gYS9pbmNsdWRlL2tleWJvYXJkLmgKKysrIGIvaW5jbHVkZS9rZXlib2FyZC5oCkBAIC0xNCw2ICsxNCw2IEBACiBleHRlcm4gQllURSBBc3luY0tleVN0YXRlVGFibGVbMjU2XTsKIAogZXh0ZXJuIEJPT0wzMiBLRVlCT0FSRF9Jbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgS0VZQk9BUkRfSGFuZGxlRXZlbnQoIFhLZXlFdmVudCAqZXZlbnQgKTsKK2V4dGVybiB2b2lkIEtFWUJPQVJEX0hhbmRsZUV2ZW50KCBXTkQgKnBXbmQsIFhLZXlFdmVudCAqZXZlbnQgKTsKIAogI2VuZGlmICAvKiBfX1dJTkVfS0VZQk9BUkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZGkuaCBiL2luY2x1ZGUvbWRpLmgKaW5kZXggMzhlNTg3Mi4uZDZmNmEwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZGkuaAorKysgYi9pbmNsdWRlL21kaS5oCkBAIC0yMCwyMSArMjAsMjEgQEAKIAogI2RlZmluZSBXTV9NRElDQUxDQ0hJTERTQ1JPTEwgICAweDEwQUMgLyogdGhpcyBpcyBleGFjdGx5IHdoYXQgV2luZG93cyB1c2VzICovCiAKLWV4dGVybiBMUkVTVUxUIFdJTkFQSSBNRElDbGllbnRXbmRQcm9jKEhXTkQxNiBod25kLCBVSU5UMTYgbWVzc2FnZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworZXh0ZXJuIExSRVNVTFQgV0lOQVBJIE1ESUNsaWVudFduZFByb2MoIEhXTkQzMiBod25kLCBVSU5UMzIgbWVzc2FnZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICk7CiAKIHR5cGVkZWYgc3RydWN0IAogewotICAgIFVJTlQxNiAgIAluQWN0aXZlQ2hpbGRyZW47Ci0gICAgSFdORDE2ICAgCWh3bmRDaGlsZE1heGltaXplZDsKLSAgICBIV05EMTYgICAJaHduZEFjdGl2ZUNoaWxkOwotICAgIEhNRU5VMTYgIAloV2luZG93TWVudTsKLSAgICBVSU5UMzIgICAJaWRGaXJzdENoaWxkOwotICAgIExQU1RSIAlmcmFtZVRpdGxlOwotICAgIFVJTlQxNgluVG90YWxDcmVhdGVkOwotICAgIFVJTlQxNiAgIAltZGlGbGFnczsKLSAgICBVSU5UMTYgICAJc2JSZWNhbGM7CQkvKiBTQl94eHggZmxhZ3MgZm9yIHNjcm9sbGJhciBmaXh1cCAqLwotICAgIEhXTkQxNiAgIAlzZWxmOworICAgIFVJTlQzMiAgICAgIG5BY3RpdmVDaGlsZHJlbjsKKyAgICBIV05EMzIgICAgICBod25kQ2hpbGRNYXhpbWl6ZWQ7CisgICAgSFdORDMyICAgICAgaHduZEFjdGl2ZUNoaWxkOworICAgIEhNRU5VMzIgICAgIGhXaW5kb3dNZW51OworICAgIFVJTlQzMiAgICAgIGlkRmlyc3RDaGlsZDsKKyAgICBMUFNUUiAgICAgICBmcmFtZVRpdGxlOworICAgIFVJTlQzMiAgICAgIG5Ub3RhbENyZWF0ZWQ7CisgICAgVUlOVDMyICAgICAgbWRpRmxhZ3M7CisgICAgVUlOVDMyICAgICAgc2JSZWNhbGM7ICAgLyogU0JfeHh4IGZsYWdzIGZvciBzY3JvbGxiYXIgZml4dXAgKi8KKyAgICBIV05EMzIgICAgICBzZWxmOwogfSBNRElDTElFTlRJTkZPOwogCiAjZW5kaWYgLyogX19XSU5FX01ESV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21tc3lzdGVtLmggYi9pbmNsdWRlL21tc3lzdGVtLmgKaW5kZXggZGNlOWNiMC4uZmE1YTUwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tbXN5c3RlbS5oCisrKyBiL2luY2x1ZGUvbW1zeXN0ZW0uaApAQCAtMjYsNyArMjYsNyBAQAogREVDTF9XSU5FTElCX1RZUEUoTU1WRVJTSU9OKTsKIHR5cGVkZWYgVUlOVDE2CU1DSURFVklDRUlEMTY7CiB0eXBlZGVmIFVJTlQzMglNQ0lERVZJQ0VJRDMyOwotREVDTF9XSU5FTElCX1RZUEUoTUNJREVWSUNFKTsKK0RFQ0xfV0lORUxJQl9UWVBFKE1DSURFVklDRUlEKTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFVJTlQxNiAgICB3VHlwZTsJCS8qIGluZGljYXRlcyB0aGUgY29udGVudHMgb2YgdGhlIHVuaW9uICovCkBAIC0yNTcsOCArMjU3LDggQEAKICAgICBXT1JECXdSZXNlcnZlZDE7CQkvKiBwYWRkaW5nICovCiAgICAgRFdPUkQJZHdTdXBwb3J0OwkJLyogZnVuY3Rpb25hbGl0eSBzdXBwb3J0ZWQgYnkgZHJpdmVyICovCiB9IFdBVkVPVVRDQVBTMzJXLCAqTFBXQVZFT1VUQ0FQUzMyVzsKLURFQ0xfV0lORUxJQl9UWVBFKFdBVkVPVVRDQVBTKTsKLURFQ0xfV0lORUxJQl9UWVBFKExQV0FWRU9VVENBUFMpOworREVDTF9XSU5FTElCX1RZUEVfQVcoV0FWRU9VVENBUFMpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTFBXQVZFT1VUQ0FQUyk7CiAKICNkZWZpbmUgV0FWRUNBUFNfUElUQ0ggICAgICAgICAgMHgwMDAxICAgLyogc3VwcG9ydHMgcGl0Y2ggY29udHJvbCAqLwogI2RlZmluZSBXQVZFQ0FQU19QTEFZQkFDS1JBVEUgICAweDAwMDIgICAvKiBzdXBwb3J0cyBwbGF5YmFjayByYXRlIGNvbnRyb2wgKi8KQEAgLTI5Myw4ICsyOTMsOCBAQAogICAgIFdPUkQJd0NoYW5uZWxzOwkJLyogbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCAqLwogICAgIFdPUkQJd1Jlc2VydmVkMTsKIH0gV0FWRUlOQ0FQUzMyVywgKkxQV0FWRUlOQ0FQUzMyVzsKLURFQ0xfV0lORUxJQl9UWVBFKFdBVkVJTkNBUFMpOwotREVDTF9XSU5FTElCX1RZUEUoTFBXQVZFSU5DQVBTKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKFdBVkVJTkNBUFMpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTFBXQVZFSU5DQVBTKTsKIAogI2RlZmluZSBXQVZFX0lOVkFMSURGT1JNQVQgICAgIDB4MDAwMDAwMDAgICAgICAgLyogaW52YWxpZCBmb3JtYXQgKi8KICNkZWZpbmUgV0FWRV9GT1JNQVRfMU0wOCAgICAgICAweDAwMDAwMDAxICAgICAgIC8qIDExLjAyNSBrSHosIE1vbm8sICAgOC1iaXQgICovCkBAIC0xMTgxLDggKzExODEsOCBAQAogICAgIFdDSEFSCXN6TmFtZVtNSVhFUl9MT05HX05BTUVfQ0hBUlNdOwogfSBNSVhFUkNPTlRST0xERVRBSUxTX0xJU1RURVhUMzJXLCpMUE1JWEVSQ09OVFJPTERFVEFJTFNfTElTVFRFWFQzMlc7CiAKLURFQ0xfV0lORUxJQl9UWVBFX0FXKE1JWEVSQ09OVFJPTERFVEFJTFMpOwotREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNSVhFUkNPTlRST0xERVRBSUxTKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKE1JWEVSQ09OVFJPTERFVEFJTFNfTElTVFRFWFQpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNSVhFUkNPTlRST0xERVRBSUxTX0xJU1RURVhUKTsKIAogLyogIE1JWEVSX0dFVENPTlRST0xERVRBSUxTRl9WQUxVRSAqLwogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMTc3Myw4ICsxNzczLDggQEAKIAlEV09SRCAgIGR3UmV0U2l6ZTsKIH0gTUNJX0lORk9fUEFSTVMzMlcsICpMUE1DSV9JTkZPX1BBUk1TMzJXOwogCi1ERUNMX1dJTkVMSUJfVFlQRShNQ0lfSU5GT19QQVJNUyk7Ci1ERUNMX1dJTkVMSUJfVFlQRShMUE1DSV9JTkZPX1BBUk1TKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKE1DSV9JTkZPX1BBUk1TKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQTUNJX0lORk9fUEFSTVMpOwogCiB0eXBlZGVmIHN0cnVjdCB7CiAJRFdPUkQgICBkd0NhbGxiYWNrOwpAQCAtMTg1OCw4ICsxODU4LDggQEAKIAlMUENXU1RSCWxwZmlsZW5hbWU7CiB9IE1DSV9MT0FEX1BBUk1TMzJXLCAqTFBNQ0lfTE9BRF9QQVJNUzMyVzsKIAotREVDTF9XSU5FTElCX1RZUEUoTUNJX0xPQURfUEFSTVMpOwotREVDTF9XSU5FTElCX1RZUEUoTFBNQ0lfTE9BRF9QQVJNUyk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhNQ0lfTE9BRF9QQVJNUyk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1DSV9MT0FEX1BBUk1TKTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEICAgZHdDYWxsYmFjazsKQEAgLTE5MzIsOCArMTkzMiw4IEBACiAJTFBDV1NUUglscHN0ckNvbW1hbmQ7CiB9IE1DSV9WRF9FU0NBUEVfUEFSTVMzMlcsICpMUE1DSV9WRF9FU0NBUEVfUEFSTVMzMlc7CiAKLURFQ0xfV0lORUxJQl9UWVBFKE1DSV9WRF9FU0NBUEVfUEFSTVMpOwotREVDTF9XSU5FTElCX1RZUEUoTFBNQ0lfVkRfRVNDQVBFX1BBUk1TKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKE1DSV9WRF9FU0NBUEVfUEFSTVMpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNQ0lfVkRfRVNDQVBFX1BBUk1TKTsKIAogI2RlZmluZSBNQ0lfV0FWRV9PUEVOX0JVRkZFUiAgICAgICAgICAgIDB4MDAwMTAwMDBMCiAKQEAgLTIxOTAsOCArMjE5MCw4IEBACiAJTFBDV1NUUglscHN0clRleHQ7CiB9IE1DSV9BTklNX1dJTkRPV19QQVJNUzMyVywgKkxQTUNJX0FOSU1fV0lORE9XX1BBUk1TMzJXOwogCi1ERUNMX1dJTkVMSUJfVFlQRShNQ0lfQU5JTV9XSU5ET1dfUEFSTVMpOwotREVDTF9XSU5FTElCX1RZUEUoTFBNQ0lfQU5JTV9XSU5ET1dfUEFSTVMpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTUNJX0FOSU1fV0lORE9XX1BBUk1TKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQTUNJX0FOSU1fV0lORE9XX1BBUk1TKTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEICAgZHdDYWxsYmFjazsKQEAgLTIzMjAsOCArMjMyMCw4IEBACiAJTFBDV1NUUglscHN0clRleHQ7CiB9IE1DSV9PVkxZX1dJTkRPV19QQVJNUzMyVywgKkxQTUNJX09WTFlfV0lORE9XX1BBUk1TMzJXOwogCi1ERUNMX1dJTkVMSUJfVFlQRV9BVyhNQ0lfT1ZMWV9PUEVOX1dJTkRPV19QQVJNUyk7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1DSV9PVkxZX09QRU5fV0lORE9XX1BBUk1TKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKE1DSV9PVkxZX1dJTkRPV19QQVJNUyk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1DSV9PVkxZX1dJTkRPV19QQVJNUyk7CiAKIHR5cGVkZWYgc3RydWN0IHsKIAlEV09SRCAgIGR3Q2FsbGJhY2s7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21vZHVsZS5oIGIvaW5jbHVkZS9tb2R1bGUuaAppbmRleCA1YjdjYjJiLi40YWJmYzYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbW9kdWxlLmgKQEAgLTE0Miw3ICsxNDIsOSBAQAogZXh0ZXJuIHZvaWQgQlVJTFRJTl9QcmludERMTHModm9pZCk7CiAKIC8qIG5lX2ltYWdlLmMgKi8KLWV4dGVybiBCT09MMzIgTkVfTG9hZFNlZ21lbnQoIEhNT0RVTEUxNiBoTW9kdWxlLCBXT1JEIHNlZ251bSApOworZXh0ZXJuIEJPT0wzMiBORV9Mb2FkU2VnbWVudCggTkVfTU9EVUxFICpwTW9kdWxlLCBXT1JEIHNlZ251bSApOworZXh0ZXJuIEJPT0wzMiBORV9Mb2FkQWxsU2VnbWVudHMoIE5FX01PRFVMRSAqcE1vZHVsZSApOworZXh0ZXJuIEJPT0wzMiBORV9Mb2FkRExMcyggTkVfTU9EVUxFICpwTW9kdWxlICk7CiBleHRlcm4gdm9pZCBORV9GaXh1cFByb2xvZ3MoIE5FX01PRFVMRSAqcE1vZHVsZSApOwogZXh0ZXJuIHZvaWQgTkVfSW5pdGlhbGl6ZURMTHMoIEhNT0RVTEUxNiBoTW9kdWxlICk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXNkb3MuaCBiL2luY2x1ZGUvbXNkb3MuaAppbmRleCAxY2MwOWIxLi45YTkwMTdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21zZG9zLmgKKysrIGIvaW5jbHVkZS9tc2Rvcy5oCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJjb21tLmgiCisjaW5jbHVkZSAid2lubnQuaCIKIAogc3RydWN0IGZjYiB7CiAgICAgICAgIEJZVEUgZHJpdmU7CkBAIC01NSw4ICs1Niw2IEBACiAgICAgRFdPUkQgIGZpbGVzaXplOyAgICAgICAgICAgICAvKiAxYyBmaWxlIHNpemUgKi8KIH0gRE9TX0RJUkVOVFJZX0xBWU9VVDsKIAotI2RlZmluZSBXSU5WRVJTSU9OIDB4MGEwMyAgICAgIC8qIFdpbmRvd3MgdmVyc2lvbiAzLjEwICovCi0KICNkZWZpbmUgTUFYX0RPU19EUklWRVMJMjYKIAogZXh0ZXJuIHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgQ09NW01BWF9QT1JUU107CkBAIC0xNTcsNCArMTU2LDcgQEAKICNkZWZpbmUgRUxfU2VyaWFsICAgICAgICAgICAgMHgwNAogI2RlZmluZSBFTF9NZW1vcnkgICAgICAgICAgICAweDA1CiAKK3ZvaWQgV0lOQVBJIERPUzNDYWxsKCBDT05URVhUICpjb250ZXh0ICk7Cit2b2lkIGRvX21zY2RleCggQ09OVEVYVCAqY29udGV4dCApOworCiAjZW5kaWYgLyogX19XSU5FX01TRE9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbm9uY2xpZW50LmggYi9pbmNsdWRlL25vbmNsaWVudC5oCmluZGV4IDhiNWI2MDAuLjJiYzU5NWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbm9uY2xpZW50LmgKKysrIGIvaW5jbHVkZS9ub25jbGllbnQuaApAQCAtMTMsOCArMTMsNyBAQAogZXh0ZXJuIExPTkcgTkNfSGFuZGxlTkNBY3RpdmF0ZSggV05EICpwd25kLCBXUEFSQU0xNiB3UGFyYW0gKTsKIGV4dGVybiBMT05HIE5DX0hhbmRsZU5DQ2FsY1NpemUoIFdORCAqcFduZCwgUkVDVDMyICp3aW5SZWN0ICk7CiBleHRlcm4gTE9ORyBOQ19IYW5kbGVOQ0hpdFRlc3QoIEhXTkQzMiBod25kLCBQT0lOVDE2IHB0ICk7Ci1leHRlcm4gTE9ORyBOQ19IYW5kbGVOQ0xCdXR0b25Eb3duKCBIV05EMzIgaHduZCwgV1BBUkFNMTYgd1BhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSApOworZXh0ZXJuIExPTkcgTkNfSGFuZGxlTkNMQnV0dG9uRG93biggV05EKiBwV25kLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKTsKIGV4dGVybiBMT05HIE5DX0hhbmRsZU5DTEJ1dHRvbkRibENsayggV05EICpwV25kLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogZXh0ZXJuIExPTkcgTkNfSGFuZGxlU3lzQ29tbWFuZCggSFdORDMyIGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgUE9JTlQxNiBwdCApOwogZXh0ZXJuIExPTkcgTkNfSGFuZGxlU2V0Q3Vyc29yKCBIV05EMzIgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wdGlvbnMuaCBiL2luY2x1ZGUvb3B0aW9ucy5oCmluZGV4IGJhNDg4NDEuLmM2ODE1OGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvb3B0aW9ucy5oCisrKyBiL2luY2x1ZGUvb3B0aW9ucy5oCkBAIC00OCw2ICs0OCw3IEBACiAgICAgY2hhciAqIGRlc2t0b3BHZW9tZXRyeTsgLyogTlVMTCB3aGVuIG5vIGRlc2t0b3AgKi8KICAgICBjaGFyICogcHJvZ3JhbU5hbWU7ICAgICAvKiBUbyB1c2Ugd2hlbiBsb2FkaW5nIHJlc291cmNlcyAqLwogICAgIGNoYXIgKiBhcmd2MDsgICAgICAgICAgIC8qIGFyZ3ZbMF0gb2YgV2luZSBwcm9jZXNzICovCisgICAgY2hhciAgKmRsbEZsYWdzOyAgICAgICAgLyogLWRsbCBmbGFncyAoaGFjayBmb3IgV2luZWxpYiBzdXBwb3J0KSAqLwogICAgIGludCAgICB1c2VQcml2YXRlTWFwOwogICAgIGludCAgICB1c2VGaXhlZE1hcDsKICAgICBpbnQgICAgc3luY2hyb25vdXM7ICAgICAvKiBYIHN5bmNocm9ub3VzIG1vZGUgKi8KQEAgLTgxLDQgKzgyLDcgQEAKIAkJCQkgICBpbnQgZGVmICk7CiBleHRlcm4gY2hhciogUFJPRklMRV9HZXRTdHJpbmdJdGVtKCBjaGFyKiApOwogCisvKiBWZXJzaW9uIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHZvaWQgVkVSU0lPTl9QYXJzZVZlcnNpb24oIGNoYXIgKmFyZyApOworCiAjZW5kaWYgIC8qIF9fV0lORV9PUFRJT05TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2VsZWN0b3JzLmggYi9pbmNsdWRlL3NlbGVjdG9ycy5oCmluZGV4IDdmY2RlNWUuLjhjYTg5N2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2VsZWN0b3JzLmgKKysrIGIvaW5jbHVkZS9zZWxlY3RvcnMuaApAQCAtNyw3ICs3LDcgQEAKICNpZm5kZWYgX19XSU5FX1NFTEVDVE9SU19ICiAjZGVmaW5lIF9fV0lORV9TRUxFQ1RPUlNfSAogCi0jaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbnR5cGVzLmgiCiAjaW5jbHVkZSAibGR0LmgiCiAKIGV4dGVybiBXT1JEIFNFTEVDVE9SX0FsbG9jQmxvY2soIGNvbnN0IHZvaWQgKmJhc2UsIERXT1JEIHNpemUsCkBAIC0xOCwyNCArMTgsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIHJlYWRvbmx5ICk7CiBleHRlcm4gdm9pZCBTRUxFQ1RPUl9GcmVlQmxvY2soIFdPUkQgc2VsLCBXT1JEIGNvdW50ICk7CiAKLSNpZiBkZWZpbmVkKGxpbnV4KQotIyBkZWZpbmUgV0lORV9EQVRBX1NFTEVDVE9SIDB4MmIKLSMgZGVmaW5lIFdJTkVfQ09ERV9TRUxFQ1RPUiAweDIzCi0jZWxpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pCi0jIGRlZmluZSBXSU5FX0RBVEFfU0VMRUNUT1IgMHgxZgotIyBkZWZpbmUgV0lORV9DT0RFX1NFTEVDVE9SIDB4MTcKLSNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pCi0jIGRlZmluZSBXSU5FX0RBVEFfU0VMRUNUT1IgMHgyNwotIyBkZWZpbmUgV0lORV9DT0RFX1NFTEVDVE9SIDB4MWYKLSNlbGlmIGRlZmluZWQoX19zdnI0X18pIHx8IGRlZmluZWQoX1NDT19EUykKLSMgZGVmaW5lIFdJTkVfREFUQV9TRUxFQ1RPUiAweDFmCi0jIGRlZmluZSBXSU5FX0NPREVfU0VMRUNUT1IgMHgxNwotI2VsaWYgZGVmaW5lZChfX0VNWF9fKQotIyBkZWZpbmUgV0lORV9EQVRBX1NFTEVDVE9SIDB4NTMgLyogSXMgdGhpcyBhbHdheXMgdHJ1ZT8gKi8KLSMgZGVmaW5lIFdJTkVfQ09ERV9TRUxFQ1RPUiAweDViCi0jZWxzZQotIyBkZWZpbmUgV0lORV9EQVRBX1NFTEVDVE9SIDB4MDAKLSMgZGVmaW5lIFdJTkVfQ09ERV9TRUxFQ1RPUiAweDAwCi0jZW5kaWYKKyNpZmRlZiBfX2kzODZfXworIyBkZWZpbmUgX19HRVRfU0VHKHNlZyxyZXMpIF9fYXNtX18oICJtb3Z3ICUlIiBzZWcgIiwldzAiIDogIj1yIiAocmVzKSApCisjIGRlZmluZSBfX1NFVF9TRUcoc2VnLHZhbCkgX19hc21fXyggIm1vdncgJXcwLCUlIiBzZWcgOiA6ICJyIiAodmFsKSApCisjZWxzZSAgLyogX19pMzg2X18gKi8KKyMgZGVmaW5lIF9fR0VUX1NFRyhzZWcscmVzKSAoKHJlcykgPSAwKQorIyBkZWZpbmUgX19TRVRfU0VHKHNlZyx2YWwpIC8qIG5vdGhpbmcgKi8KKyNlbmRpZiAgLyogX19pMzg2X18gKi8KKworI2RlZmluZSBHRVRfQ1MoY3MpIF9fR0VUX1NFRygiY3MiLGNzKQorI2RlZmluZSBHRVRfRFMoZHMpIF9fR0VUX1NFRygiZHMiLGRzKQorI2RlZmluZSBHRVRfRVMoZXMpIF9fR0VUX1NFRygiZXMiLGVzKQorI2RlZmluZSBHRVRfRlMoZnMpIF9fR0VUX1NFRygiZnMiLGZzKQorI2RlZmluZSBHRVRfR1MoZ3MpIF9fR0VUX1NFRygiZ3MiLGdzKQorI2RlZmluZSBHRVRfU1Moc3MpIF9fR0VUX1NFRygic3MiLHNzKQorCisjZGVmaW5lIFNFVF9DUyhjcykgX19TRVRfU0VHKCJjcyIsY3MpCisjZGVmaW5lIFNFVF9EUyhkcykgX19TRVRfU0VHKCJkcyIsZHMpCisjZGVmaW5lIFNFVF9FUyhlcykgX19TRVRfU0VHKCJlcyIsZXMpCisjZGVmaW5lIFNFVF9GUyhmcykgX19TRVRfU0VHKCJmcyIsZnMpCisjZGVmaW5lIFNFVF9HUyhncykgX19TRVRfU0VHKCJncyIsZ3MpCisjZGVmaW5lIFNFVF9TUyhzcykgX19TRVRfU0VHKCJzcyIsc3MpCiAKICNlbmRpZiAvKiBfX1dJTkVfU0VMRUNUT1JTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2lnX2NvbnRleHQuaCBiL2luY2x1ZGUvc2lnX2NvbnRleHQuaAppbmRleCBiOTcxYjk3Li4wZTdiMDFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NpZ19jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9zaWdfY29udGV4dC5oCkBAIC03LDkgKzcsNyBAQAogI2lmbmRlZiBfX1dJTkVfU0lHX0NPTlRFWFRfSAogI2RlZmluZSBfX1dJTkVfU0lHX0NPTlRFWFRfSAogCi0jaWZkZWYgV0lORUxJQgotI2Vycm9yIFRoaXMgZmlsZSBtdXN0IG5vdCBiZSB1c2VkIGluIFdpbmVsaWIKLSNlbmRpZgorI2lmZGVmIF9faTM4Nl9fCiAKICNpZmRlZiBsaW51eAogdHlwZWRlZiBzdHJ1Y3QKQEAgLTM3LDIwICszNSwzNCBAQAogICAgIHVuc2lnbmVkIGxvbmcgb2xkbWFzazsKICAgICB1bnNpZ25lZCBsb25nIGNyMjsKIH0gU0lHQ09OVEVYVDsKKworI2RlZmluZSBIQU5ETEVSX0RFRihuYW1lKSB2b2lkIG5hbWUgKGludCBzaWduYWwsIFNJR0NPTlRFWFQgY29udGV4dCkKKyNkZWZpbmUgSEFORExFUl9DT05URVhUICgmY29udGV4dCkKKwogI2VuZGlmICAvKiBsaW51eCAqLwogCiAjaWYgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKQorCiAjaW5jbHVkZSA8c2lnbmFsLmg+CiB0eXBlZGVmIHN0cnVjdCBzaWdjb250ZXh0IFNJR0NPTlRFWFQ7CisKKyNkZWZpbmUgSEFORExFUl9ERUYobmFtZSkgdm9pZCBuYW1lKGludCBzaWduYWwsIGludCBjb2RlLCBTSUdDT05URVhUICpjb250ZXh0KQorI2RlZmluZSBIQU5ETEVSX0NPTlRFWFQgY29udGV4dAorCiAjZW5kaWYgIC8qIEZyZWVCU0QgKi8KIAogI2lmIGRlZmluZWQoX19zdnI0X18pIHx8IGRlZmluZWQoX1NDT19EUykKKwogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2lmZGVmIF9TQ09fRFMKICNpbmNsdWRlIDxzeXMvcmVnc2V0Lmg+CiAjZW5kaWYKICNpbmNsdWRlIDxzeXMvdWNvbnRleHQuaD4KIHR5cGVkZWYgc3RydWN0IHVjb250ZXh0IFNJR0NPTlRFWFQ7CisKKyNkZWZpbmUgSEFORExFUl9ERUYobmFtZSkgdm9pZCBuYW1lKGludCBzaWduYWwsIHZvaWQgKnNpZ2luZm8sIFNJR0NPTlRFWFQgKmNvbnRleHQpCisjZGVmaW5lIEhBTkRMRVJfQ09OVEVYVCBjb250ZXh0CisKICNlbmRpZiAgLyogc3ZyNCB8fCBTQ09fRFMgKi8KIAogI2lmZGVmIF9fRU1YX18KQEAgLTIwMiw0ICsyMTQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogI2RlZmluZSBGTF9zaWcoY29udGV4dCkgICAgICAoKihXT1JEKikmRUZMX3NpZyhjb250ZXh0KSkKIAorI2VuZGlmIC8qIF9faTM4Nl9fICovCisKICNlbmRpZiAvKiBfX1dJTkVfU0lHX0NPTlRFWFRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92ZXJzaW9uLmggYi9pbmNsdWRlL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmY5NGM4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS92ZXJzaW9uLmgKQEAgLTAsMCArMSBAQAorI2RlZmluZSBXSU5FX1JFTEVBU0VfSU5GTyAiV2luZSByZWxlYXNlIDk3MTExNiIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luLmggYi9pbmNsdWRlL3dpbi5oCmluZGV4IDEyOGEyMGYuLjA3ZGQzYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luLmgKKysrIGIvaW5jbHVkZS93aW4uaApAQCAtMzksNiArMzksNyBAQAogICAgIEJJQzMyX1BPUFVQTUVOVSwKICAgICBCSUMzMl9TVEFUSUMsCiAgICAgQklDMzJfU0NST0xMLAorICAgIEJJQzMyX01ESUNMSUVOVCwKICAgICBCSUMzMl9ERVNLVE9QLAogICAgIEJJQzMyX0RJQUxPRywKICAgICBCSUMzMl9JQ09OVElUTEUsCkBAIC0xMjcsNyArMTI4LDggQEAKIGV4dGVybiBISU5TVEFOQ0UzMiBXSU5fR2V0V2luZG93SW5zdGFuY2UoIEhXTkQzMiBod25kICk7CiBleHRlcm4gV05EKiogIFdJTl9CdWlsZFdpbkFycmF5KCBXTkQgKnduZFB0ciwgVUlOVDMyIGJ3YSwgVUlOVDMyKiBwbnVtICk7CiAKLWV4dGVybiB2b2lkIERFRldORF9TZXRUZXh0KCBXTkQgKnduZFB0ciwgTFBDU1RSIHRleHQgKTsJCSAgICAgIC8qIHdpbmRvd3MvZGVmd25kLmMgKi8KK2V4dGVybiB2b2lkIERFRldORF9TZXRUZXh0KCBXTkQgKnduZFB0ciwgTFBDU1RSIHRleHQgKTsKK2V4dGVybiBIQlJVU0gzMiBERUZXTkRfQ29udHJvbENvbG9yKCBIREMzMiBoREMsIFVJTlQxNiBjdGxUeXBlICk7ICAgICAvKiB3aW5kb3dzL2RlZnduZC5jICovCiAKIGV4dGVybiB2b2lkIFBST1BFUlRZX1JlbW92ZVdpbmRvd1Byb3BzKCBXTkQgKnBXbmQgKTsgIAkJICAgICAgLyogd2luZG93cy9wcm9wZXJ0eS5jICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luMTZkcnYuaCBiL2luY2x1ZGUvd2luMTZkcnYuaAppbmRleCA2MmQ5ZDdmLi5kMjE5MzU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbjE2ZHJ2LmgKKysrIGIvaW5jbHVkZS93aW4xNmRydi5oCkBAIC0xNDksMTAgKzE0OSwxMCBAQAogICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRDsgICAgCS8qIFByaW50ZXIgZHJpdmVyIGluZm8gKi8KIH0gV0VQRkM7CiAKLSNkZWZpbmUgT0JKX1BFTiAJMSAgICAgICAKLSNkZWZpbmUgT0JKX0JSVVNIIAkyICAKLSNkZWZpbmUgT0JKX0ZPTlQgCTMgICAKLSNkZWZpbmUgT0JKX1BCSVRNQVAgCTUKKyNkZWZpbmUgRFJWT0JKX1BFTiAJMSAgICAgICAKKyNkZWZpbmUgRFJWT0JKX0JSVVNIIAkyICAKKyNkZWZpbmUgRFJWT0JKX0ZPTlQgCTMgICAKKyNkZWZpbmUgRFJWT0JKX1BCSVRNQVAgCTUKIAogLyogV2luMTYgcHJpbnRlciBkcml2ZXIgcGh5c2ljYWwgREMgKi8KIHR5cGVkZWYgc3RydWN0CmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmRvd3MuaCBiL2luY2x1ZGUvd2luZG93cy5oCmluZGV4IGEzN2E2NjkuLmU5M2E3ZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luZG93cy5oCisrKyBiL2luY2x1ZGUvd2luZG93cy5oCkBAIC0xOTQ3LDYgKzE5NDcsNDAgQEAKIAlIQklUTUFQMzIJaGJtQ29sb3I7CiB9IElDT05JTkZPLCpMUElDT05JTkZPOwogCisKKyNkZWZpbmUJRlZJUlRLRVkJVFJVRSAgICAgICAgICAvKiBBc3N1bWVkIHRvIGJlID09IFRSVUUgKi8KKyNkZWZpbmUJRk5PSU5WRVJUCTB4MDIKKyNkZWZpbmUJRlNISUZUCQkweDA0CisjZGVmaW5lCUZDT05UUk9MCTB4MDgKKyNkZWZpbmUJRkFMVAkJMHgxMAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJZVEUgICBmVmlydDsKKyAgICBXT1JEICAga2V5OworICAgIFdPUkQgICBjbWQ7Cit9IEFDQ0VMMTYsICpMUEFDQ0VMMTY7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQllURSAgIGZWaXJ0OworICAgIEJZVEUgICBwYWQwOworICAgIFdPUkQgICBrZXk7CisgICAgV09SRCAgIGNtZDsKKyAgICBXT1JEICAgcGFkMTsKK30gQUNDRUwzMiwgKkxQQUNDRUwzMjsKKworREVDTF9XSU5FTElCX1RZUEUoQUNDRUwpOworREVDTF9XSU5FTElCX1RZUEUoTFBBQ0NFTCk7CisKKworLyogRmxhZ3MgZm9yIERyYXdJY29uRXguICAqLworI2RlZmluZSBESV9NQVNLICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERJX0lNQUdFICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgRElfTk9STUFMICAgICAgICAgICAgICAgKERJX01BU0sgfCBESV9JTUFHRSkKKyNkZWZpbmUgRElfQ09NUEFUICAgICAgICAgICAgICAgNAorI2RlZmluZSBESV9ERUZBVUxUU0laRSAgICAgICAgICA4CisKIHR5cGVkZWYgc3RydWN0IHsKIAlCWVRFIGk7ICAvKiBtdWNoIG1vcmUgLi4uLiAqLwogfSBLQU5KSVNUUlVDVDsKQEAgLTI0NTIsNiArMjQ4Niw5IEBACiAjZGVmaW5lIE9CTV9DRFJPTSAgICAgICAgICAgMzI3MjkKICNkZWZpbmUgT0JNX1RSVFlQRSAgICAgICAgICAzMjcyOAogCisvKiBXaW5lIGV4dGVuc2lvbiwgSSB0aGluay4gICovCisjZGVmaW5lIE9CTV9SQURJT0NIRUNLICAgICAgMzI3MjcKKwogI2RlZmluZSBPQk1fT0xEX0NMT1NFICAgICAgIDMyNzY3CiAjZGVmaW5lIE9CTV9TSVpFICAgICAgICAgICAgMzI3NjYKICNkZWZpbmUgT0JNX09MRF9VUEFSUk9XICAgICAzMjc2NQpAQCAtNTQ1MCw2ICs1NDg3LDkgQEAKIEJPT0wzMiAgICAgIFdJTkFQSSBCZWVwKERXT1JELERXT1JEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBDbGVhckNvbW1FcnJvcihJTlQzMixMUERXT1JELExQQ09NU1RBVCk7CiBCT09MMzIgICAgICBXSU5BUEkgQ2xvc2VIYW5kbGUoSEFORExFMzIpOworSU5UMzIgICAgICAgV0lOQVBJIENvcHlBY2NlbGVyYXRvclRhYmxlMzJBKEhBQ0NFTDMyLExQQUNDRUwzMixJTlQzMik7CitJTlQzMiAgICAgICBXSU5BUEkgQ29weUFjY2VsZXJhdG9yVGFibGUzMlcoSEFDQ0VMMzIsTFBBQ0NFTDMyLElOVDMyKTsKKyNkZWZpbmUgICAgIENvcHlBY2NlbGVyYXRvclRhYmxlIFdJTkVMSUJfTkFNRV9BVyhDb3B5QWNjZWxlcmF0b3JUYWJsZSkKIEJPT0wzMiAgICAgIFdJTkFQSSBDb3B5RmlsZTMyQShMUENTVFIsTFBDU1RSLEJPT0wzMik7CiBCT09MMzIgICAgICBXSU5BUEkgQ29weUZpbGUzMlcoTFBDV1NUUixMUENXU1RSLEJPT0wzMik7CiAjZGVmaW5lICAgICBDb3B5RmlsZSBXSU5FTElCX05BTUVfQVcoQ29weUZpbGUpCkBAIC01NDc0LDYgKzU1MTQsNyBAQAogSEFORExFMzIgICAgV0lOQVBJIENyZWF0ZVNlbWFwaG9yZTMyQShMUFNFQ1VSSVRZX0FUVFJJQlVURVMsTE9ORyxMT05HLExQQ1NUUik7CiBIQU5ETEUzMiAgICBXSU5BUEkgQ3JlYXRlU2VtYXBob3JlMzJXKExQU0VDVVJJVFlfQVRUUklCVVRFUyxMT05HLExPTkcsTFBDV1NUUik7CiAjZGVmaW5lICAgICBDcmVhdGVTZW1hcGhvcmUgV0lORUxJQl9OQU1FX0FXKENyZWF0ZVNlbWFwaG9yZSkKK0JPT0wzMiAgICAgIFdJTkFQSSBEZXN0cm95QWNjZWxlcmF0b3JUYWJsZShIQUNDRUwzMik7CiBCT09MMzIgICAgICBXSU5BUEkgRGlzYWJsZVRocmVhZExpYnJhcnlDYWxscyhITU9EVUxFMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIERvc0RhdGVUaW1lVG9GaWxlVGltZShXT1JELFdPUkQsTFBGSUxFVElNRSk7CiBJTlQzMiAgICAgICBXSU5BUEkgRW51bVByb3BzRXgzMkEoSFdORDMyLFBST1BFTlVNUFJPQ0VYMzJBLExQQVJBTSk7CkBAIC01ODc0LDYgKzU5MTUsOSBAQAogQk9PTDE2ICAgICAgV0lOQVBJIENoZWNrTWVudUl0ZW0xNihITUVOVTE2LFVJTlQxNixVSU5UMTYpOwogRFdPUkQgICAgICAgV0lOQVBJIENoZWNrTWVudUl0ZW0zMihITUVOVTMyLFVJTlQzMixVSU5UMzIpOwogI2RlZmluZSAgICAgQ2hlY2tNZW51SXRlbSBXSU5FTElCX05BTUUoQ2hlY2tNZW51SXRlbSkKK0JPT0wxNiAgICAgIFdJTkFQSSBDaGVja01lbnVSYWRpb0J1dHRvbjE2KEhNRU5VMTYsVUlOVDE2LFVJTlQxNixVSU5UMTYsQk9PTDE2KTsKK0JPT0wzMiAgICAgIFdJTkFQSSBDaGVja01lbnVSYWRpb0J1dHRvbjMyKEhNRU5VMzIsVUlOVDMyLFVJTlQzMixVSU5UMzIsQk9PTDMyKTsKKyNkZWZpbmUgICAgIENoZWNrTWVudVJhZGlvQnV0dG9uIFdJTkVMSUJfTkFNRShDaGVja01lbnVSYWRpb0J1dHRvbikKIEJPT0wxNiAgICAgIFdJTkFQSSBDaGVja1JhZGlvQnV0dG9uMTYoSFdORDE2LFVJTlQxNixVSU5UMTYsVUlOVDE2KTsKIEJPT0wzMiAgICAgIFdJTkFQSSBDaGVja1JhZGlvQnV0dG9uMzIoSFdORDMyLFVJTlQzMixVSU5UMzIsVUlOVDMyKTsKICNkZWZpbmUgICAgIENoZWNrUmFkaW9CdXR0b24gV0lORUxJQl9OQU1FKENoZWNrUmFkaW9CdXR0b24pCkBAIC01OTg2LDYgKzYwMzAsMTEgQEAKIEhCUlVTSDE2ICAgIFdJTkFQSSBDcmVhdGVESUJQYXR0ZXJuQnJ1c2gxNihIR0xPQkFMMTYsVUlOVDE2KTsKIEhCUlVTSDMyICAgIFdJTkFQSSBDcmVhdGVESUJQYXR0ZXJuQnJ1c2gzMihIR0xPQkFMMzIsVUlOVDMyKTsKICNkZWZpbmUgICAgIENyZWF0ZURJQlBhdHRlcm5CcnVzaCBXSU5FTElCX05BTUUoQ3JlYXRlRElCUGF0dGVybkJydXNoKQorSEJJVE1BUDE2ICAgV0lOQVBJIENyZWF0ZURJQlNlY3Rpb24xNiAoSERDMTYsIEJJVE1BUElORk8gKiwgVUlOVDE2LAorCQkJCSAgICAgICBMUFZPSUQgKiosIEhBTkRMRTE2LCBEV09SRCBvZmZzZXQpOworSEJJVE1BUDMyICAgV0lOQVBJIENyZWF0ZURJQlNlY3Rpb24zMiAoSERDMzIsIEJJVE1BUElORk8gKiwgVUlOVDMyLAorCQkJCSAgICAgICBMUFZPSUQgKiosIEhBTkRMRTMyLCBEV09SRCBvZmZzZXQpOworI2RlZmluZSAgICAgQ3JlYXRlRElCU2VjdGlvbiBXSU5FTElCX05BTUUoQ3JlYXRlRElCU2VjdGlvbikKIEJPT0wxNiAgICAgIFdJTkFQSSBDcmVhdGVEaXJlY3RvcnkxNihMUENTVFIsTFBWT0lEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBDcmVhdGVEaXJlY3RvcnkzMkEoTFBDU1RSLExQU0VDVVJJVFlfQVRUUklCVVRFUyk7CiBCT09MMzIgICAgICBXSU5BUEkgQ3JlYXRlRGlyZWN0b3J5MzJXKExQQ1dTVFIsTFBTRUNVUklUWV9BVFRSSUJVVEVTKTsKQEAgLTYyMDYsNiArNjI1NSwxMSBAQAogQk9PTDE2ICAgICAgV0lOQVBJIERyYXdJY29uMTYoSERDMTYsSU5UMTYsSU5UMTYsSElDT04xNik7CiBCT09MMzIgICAgICBXSU5BUEkgRHJhd0ljb24zMihIREMzMixJTlQzMixJTlQzMixISUNPTjMyKTsKICNkZWZpbmUgICAgIERyYXdJY29uIFdJTkVMSUJfTkFNRShEcmF3SWNvbikKK0JPT0wxNiAgICAgIFdJTkFQSSBEcmF3SWNvbkV4MTYoSERDMTYsSU5UMTYsSU5UMTYsSElDT04xNixJTlQxNixJTlQxNiwKKwkJCQlVSU5UMTYsSEJSVVNIMTYsVUlOVDE2KTsKK0JPT0wzMiAgICAgIFdJTkFQSSBEcmF3SWNvbkV4MzIoSERDMzIsSU5UMzIsSU5UMzIsSElDT04zMixJTlQzMixJTlQzMiwKKwkJCQlVSU5UMzIsSEJSVVNIMzIsVUlOVDMyKTsKKyNkZWZpbmUgICAgIERyYXdJY29uRXggV0lORUxJQl9OQU1FKERyYXdJY29uRXgpCiBWT0lEICAgICAgICBXSU5BUEkgRHJhd01lbnVCYXIxNihIV05EMTYpOwogQk9PTDMyICAgICAgV0lOQVBJIERyYXdNZW51QmFyMzIoSFdORDMyKTsKICNkZWZpbmUgICAgIERyYXdNZW51QmFyIFdJTkVMSUJfTkFNRShEcmF3TWVudUJhcikKQEAgLTY1OTYsNiArNjY1MCw5IEBACiBVSU5UMTYgICAgICBXSU5BUEkgR2V0TWVudUl0ZW1JRDE2KEhNRU5VMTYsSU5UMTYpOwogVUlOVDMyICAgICAgV0lOQVBJIEdldE1lbnVJdGVtSUQzMihITUVOVTMyLElOVDMyKTsKICNkZWZpbmUgICAgIEdldE1lbnVJdGVtSUQgV0lORUxJQl9OQU1FKEdldE1lbnVJdGVtSUQpCitCT09MMTYgICAgICBXSU5BUEkgR2V0TWVudUl0ZW1SZWN0MTYoSFdORDE2LEhNRU5VMTYsVUlOVDE2LExQUkVDVDE2KTsKK0JPT0wzMiAgICAgIFdJTkFQSSBHZXRNZW51SXRlbVJlY3QzMihIV05EMzIsSE1FTlUzMixVSU5UMzIsTFBSRUNUMzIpOworI2RlZmluZSAgICAgR2V0TWVudUl0ZW1SZWN0IFdJTkVMSUJfTkFNRShHZXRNZW51SXRlbVJlY3QpCiBVSU5UMTYgICAgICBXSU5BUEkgR2V0TWVudVN0YXRlMTYoSE1FTlUxNixVSU5UMTYsVUlOVDE2KTsKIFVJTlQzMiAgICAgIFdJTkFQSSBHZXRNZW51U3RhdGUzMihITUVOVTMyLFVJTlQzMixVSU5UMzIpOwogI2RlZmluZSAgICAgR2V0TWVudVN0YXRlIFdJTkVMSUJfTkFNRShHZXRNZW51U3RhdGUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbnR5cGVzLmggYi9pbmNsdWRlL3dpbnR5cGVzLmgKaW5kZXggN2NmNzlkNS4uYzU0YTQyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW50eXBlcy5oCisrKyBiL2luY2x1ZGUvd2ludHlwZXMuaApAQCAtOCwzMiArOCwyMSBAQAogI2RlZmluZSBfX1dJTkVfV0lOVFlQRVNfSAogCiAjaWZkZWYgX19XSU5FX18KLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX19XSU5FX18pICYmICFkZWZpbmVkKFdJTkVMSUIpCi0vKiBJZiB3ZSBhcmUgbm90IGNvbXBpbGluZyBXaW5lLCB0aGVuIHdlIHNob3VsZCBiZSB1c2luZyBXaW5lbGliICovCi0jZXJyb3IgWW91IG11c3QgdXNlICdjb25maWd1cmUgLS13aXRoLWxpYnJhcnknIHRvIGJ1aWxkIFdpbmVsaWIgcHJvZ3JhbXMKLSNkZWZpbmUgV0lORUxJQgotI2VuZGlmCi0KLSNpZmRlZiBXSU5FTElCCisjIGluY2x1ZGUgImNvbmZpZy5oIgorIyB1bmRlZiBXSU5FTElCCisjIHVuZGVmIFdJTkVMSUIxNgorIyB1bmRlZiBXSU5FTElCMzIKKyMgdW5kZWYgVU5JQ09ERQorI2Vsc2UgIC8qIF9fV0lORV9fICovCisjIGlmbmRlZiBXSU5FTElCCisjICBkZWZpbmUgV0lORUxJQgorIyBlbmRpZgogIyBpZmRlZiBXSU5FTElCMTYKICMgIHVuZGVmIFdJTkVMSUIzMgogIyBlbHNlCi0jICBpZm5kZWYgV0lORUxJQjMyCi0jICAgZGVmaW5lIFdJTkVMSUIzMgotIyAgZW5kaWYKKyMgIGRlZmluZSBXSU5FTElCMzIKICMgZW5kaWYKLSNlbHNlCi0jIGlmZGVmIFdJTkVMSUIzMgotIyAgdW5kZWYgV0lORUxJQjE2Ci0jICBkZWZpbmUgV0lORUxJQgotIyBlbmRpZgotIyBpZmRlZiBXSU5FTElCMTYKLSMgIGRlZmluZSBXSU5FTElCCi0jIGVuZGlmCi0jZW5kaWYKKyNlbmRpZiAgLyogX19XSU5FX18gKi8KIAogLyogTWFjcm9zIHRvIG1hcCBXaW5lbGliIG5hbWVzIHRvIHRoZSBjb3JyZWN0IGltcGxlbWVudGF0aW9uIG5hbWUgKi8KIC8qIGRlcGVuZGluZyBvbiBXSU5FTElCMTYsIFdJTkVMSUIzMiBhbmQgVU5JQ09ERSBtYWNyb3MuICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pcGMvTWFrZWZpbGUuaW4gYi9pcGMvTWFrZWZpbGUuaW4KaW5kZXggM2Q1NjMxNC4uYzE0YmJiZSAxMDA2NDQKLS0tIGEvaXBjL01ha2VmaWxlLmluCisrKyBiL2lwYy9NYWtlZmlsZS5pbgpAQCAtMSw0ICsxLDQgQEAKLURFRlMgICAgICA9IC1EX19XSU5FX18KK0RFRlMgICAgICA9IEBETExGTEFHU0AgLURfX1dJTkVfXwogVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACiBUT1BPQkpESVIgPSAuLgogU1JDRElSICAgID0gQHNyY2RpckAKZGlmZiAtLWdpdCBhL2xpYnJhcnkvTWFrZWZpbGUuaW4gYi9saWJyYXJ5L01ha2VmaWxlLmluCmluZGV4IDRmZDE5YTEuLjE5M2IwZmUgMTAwNjQ0Ci0tLSBhL2xpYnJhcnkvTWFrZWZpbGUuaW4KKysrIGIvbGlicmFyeS9NYWtlZmlsZS5pbgpAQCAtNCwyMyArNCwxMCBAQAogU1JDRElSICAgID0gQHNyY2RpckAKIFZQQVRIICAgICA9IEBzcmNkaXJACiBNT0RVTEUgICAgPSBub25lCi1MSUJNT0RVTEUgPSBsaWJyYXJ5CiAKLUxJQl9TUkNTID0gXAotCWxpYnJlcy5jIFwKLQltaXNjc3R1YnMuYworQ19TUkNTID0gd2luZXN0dWIuYwogCi1TVFVCX1NSQ1MgPSB3aW5lc3R1Yi5jCi0KLUxJQl9PQkpTICA9ICQoTElCX1NSQ1M6LmM9Lm8pCi1TVFVCX09CSlMgPSAkKFNUVUJfU1JDUzouYz0ubykKLQotQ19TUkNTID0gJChMSUJfU1JDUykgJChTVFVCX1NSQ1MpCi0KLWFsbDogJChMSUJNT0RVTEUpLm8gJChTVFVCX09CSlMpCi0KLSQoTElCTU9EVUxFKS5vOiAkKExJQl9PQkpTKQotCSQoTERDT01CSU5FKSAkKExJQl9PQkpTKSAtbyAkKExJQk1PRFVMRSkubworYWxsOiAkKENfU1JDUzouYz0ubykKIAogQE1BS0VfUlVMRVNACiAKZGlmZiAtLWdpdCBhL2xpYnJhcnkvbWlzY3N0dWJzLmMgYi9saWJyYXJ5L21pc2NzdHVicy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTYxOTE3Li4wMDAwMDAwCi0tLSBhL2xpYnJhcnkvbWlzY3N0dWJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogSkJQIChKaW0gUGV0ZXJzb24gPGpzcGV0ZXJAYmlyY2guZWUudnQuZWR1Pik6IExvdHMgb2Ygc3R1YnMgbmVlZGVkIGZvcgotICogICAgICBsaWJ3aW5lLmEuCi0gKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAid2ludHlwZXMuaCIKLQotCi0vKiBmb3Igd2luZG93cy93aW5wcm9jLmMgKi8KLXZvaWQgQ2FsbEZyb20xNl9sb25nX3d3d2xsKHZvaWQpIHt9Ci0KLWV4dGVybiBMUkVTVUxUIENvbG9yRGxnUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7Ci1leHRlcm4gTFJFU1VMVCBGaWxlT3BlbkRsZ1Byb2MoSFdORDE2LFVJTlQxNixXUEFSQU0xNixMUEFSQU0pOwotZXh0ZXJuIExSRVNVTFQgRmlsZVNhdmVEbGdQcm9jKEhXTkQxNixVSU5UMTYsV1BBUkFNMTYsTFBBUkFNKTsKLWV4dGVybiBMUkVTVUxUIEZpbmRUZXh0RGxnUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7Ci1leHRlcm4gTFJFU1VMVCBNRElDbGllbnRXbmRQcm9jKEhXTkQxNixVSU5UMTYsV1BBUkFNMTYsTFBBUkFNKTsKLWV4dGVybiBMUkVTVUxUIFByaW50RGxnUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7Ci1leHRlcm4gTFJFU1VMVCBQcmludFNldHVwRGxnUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7Ci1leHRlcm4gTFJFU1VMVCBSZXBsYWNlVGV4dERsZ1Byb2MoSFdORDE2LFVJTlQxNixXUEFSQU0xNixMUEFSQU0pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNT0RVTEVfR2V0V25kUHJvY0VudHJ5MTYgKG5vdCBhIFdpbmRvd3MgQVBJIGZ1bmN0aW9uKQotICoKLSAqIFJldHVybiBhbiBlbnRyeSBwb2ludCBmcm9tIHRoZSBXUFJPQ1MgZGxsLgotICovCi1GQVJQUk9DMTYgTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCBjaGFyICpuYW1lICkKLXsKLSNkZWZpbmUgTUFQX1NUUl9UT19QUk9DKHN0cixwcm9jKSBpZighc3RyY21wKG5hbWUsc3RyKSlyZXR1cm4gKEZBUlBST0MxNilwcm9jCi0gIE1BUF9TVFJfVE9fUFJPQygiQ29sb3JEbGdQcm9jIixDb2xvckRsZ1Byb2MpOwotICBNQVBfU1RSX1RPX1BST0MoIkZpbGVPcGVuRGxnUHJvYyIsRmlsZU9wZW5EbGdQcm9jKTsKLSAgTUFQX1NUUl9UT19QUk9DKCJGaWxlU2F2ZURsZ1Byb2MiLEZpbGVTYXZlRGxnUHJvYyk7Ci0gIE1BUF9TVFJfVE9fUFJPQygiRmluZFRleHREbGdQcm9jIixGaW5kVGV4dERsZ1Byb2MpOwotICBNQVBfU1RSX1RPX1BST0MoIk1ESUNsaWVudFduZFByb2MiLE1ESUNsaWVudFduZFByb2MpOwotICBNQVBfU1RSX1RPX1BST0MoIlByaW50RGxnUHJvYyIsUHJpbnREbGdQcm9jKTsKLSAgTUFQX1NUUl9UT19QUk9DKCJQcmludFNldHVwRGxnUHJvYyIsUHJpbnRTZXR1cERsZ1Byb2MpOwotICBNQVBfU1RSX1RPX1BST0MoIlJlcGxhY2VUZXh0RGxnUHJvYyIsUmVwbGFjZVRleHREbGdQcm9jKTsKLSAgZnByaW50ZihzdGRlcnIsIndhcm5pbmc6IE5vIG1hcHBpbmcgZm9yICVzKCksIGFkZCBvbmUgaW4gbGlicmFyeS9taXNjc3R1YnMuY1xuIixuYW1lKTsKLSAgYXNzZXJ0KCBGQUxTRSApOwotICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2xpYnJhcnkvd2luZXN0dWIuYyBiL2xpYnJhcnkvd2luZXN0dWIuYwppbmRleCAzOTk0NmIzLi5hYzE4ZGEyIDEwMDY0NAotLS0gYS9saWJyYXJ5L3dpbmVzdHViLmMKKysrIGIvbGlicmFyeS93aW5lc3R1Yi5jCkBAIC00LDggKzQsMTQgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCisvKiBTdHVicyBuZWVkZWQgZm9yIGxpbmtpbmcgd2l0aCBXaW5lbGliICovCisvKiBGSVhNRTogdGhpcyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSAqLworRkFSUFJPQzMyIEJVSUxUSU5fR2V0UHJvY0FkZHJlc3MzMiggdm9pZCAqbW9kLCBMUENTVFIgZnVuYyApIHsgcmV0dXJuIDA7IH0KK0hNT0RVTEUzMiBCVUlMVElOX0xvYWRNb2R1bGUoIExQQ1NUUiBuYW1lLCBCT09MMzIgZm9yY2UgKSB7IHJldHVybiAwOyB9CisKKwogZXh0ZXJuIGludCBQQVNDQUwgV2luTWFpbihISU5TVEFOQ0UzMixISU5TVEFOQ0UzMixMUFNUUixpbnQpOwotZXh0ZXJuIGludCBNQUlOX0luaXQodm9pZCk7CitleHRlcm4gaW50IE1BSU5fV2luZWxpYkluaXQodm9pZCk7CiBleHRlcm4gQk9PTDMyIE1BSU5fV2luZUluaXQoIGludCAqYXJnYywgY2hhciAqYXJndltdICk7CiBleHRlcm4gdm9pZCBUQVNLX1Jlc2NoZWR1bGUodm9pZCk7CiAKQEAgLTMyLDcgKzM4LDcgQEAKICAgZWxzZSBscHN6Q21kUGFyYW1bMF0gPSAnXDAnOwogICBmb3IgKGkgPSAyOyBpIDwgYXJnYzsgaSsrKSBzdHJjYXQoc3RyY2F0KGxwc3pDbWRQYXJhbSwgIiAiKSwgYXJndltpXSk7CiAKLSAgaWYoIU1BSU5fSW5pdCgpKSByZXR1cm4gMDsgLyogSkJQOiBOZWVkZWQgZm9yIERvc0RyaXZlc1tdIHN0cnVjdHVyZSwgZXRjLiAqLworICBpZighTUFJTl9XaW5lbGliSW5pdCgpKSByZXR1cm4gMDsKICAgaEluc3RhbmNlID0gV2luRXhlYzMyKCAqYXJndiwgU1dfU0hPV05PUk1BTCApOwogICBUQVNLX1Jlc2NoZWR1bGUoKTsKICAgSW5pdEFwcCggaEluc3RhbmNlICk7CmRpZmYgLS1naXQgYS9sb2FkZXIvTWFrZWZpbGUuaW4gYi9sb2FkZXIvTWFrZWZpbGUuaW4KaW5kZXggMzlmMmIzMC4uNTQ5YzNjMSAxMDA2NDQKLS0tIGEvbG9hZGVyL01ha2VmaWxlLmluCisrKyBiL2xvYWRlci9NYWtlZmlsZS5pbgpAQCAtMSw0ICsxLDQgQEAKLURFRlMgICAgICA9IC1EX19XSU5FX18KK0RFRlMgICAgICA9IEBETExGTEFHU0AgLURfX1dJTkVfXwogVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACiBUT1BPQkpESVIgPSAuLgogU1JDRElSICAgID0gQHNyY2RpckAKQEAgLTYsNiArNiw3IEBACiBNT0RVTEUgICAgPSBsb2FkZXIKIAogQ19TUkNTID0gXAorCWxpYnJlcy5jIFwKIAltYWluLmMgXAogCW1vZHVsZS5jIFwKIAluZV9pbWFnZS5jIFwKZGlmZiAtLWdpdCBhL2xpYnJhcnkvbGlicmVzLmMgYi9sb2FkZXIvbGlicmVzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYnJhcnkvbGlicmVzLmMKcmVuYW1lIHRvIGxvYWRlci9saWJyZXMuYwpkaWZmIC0tZ2l0IGEvbG9hZGVyL21haW4uYyBiL2xvYWRlci9tYWluLmMKaW5kZXggZDViZDU5ZS4uZWQ3NWMxMSAxMDA2NDQKLS0tIGEvbG9hZGVyL21haW4uYworKysgYi9sb2FkZXIvbWFpbi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKLXN0YXRpYyBjaGFyIFJDU0lkW10gPSAiJElkOiB3aW5lLmMsdiAxLjIgMTk5My8wNy8wNCAwNDowNDoyMSByb290IEV4cCByb290ICQiOwotc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0ICBSb2JlcnQgSi4gQW1zdGFkdCwgMTk5MyI7Ci0qLworICogTWFpbiBpbml0aWFsaXphdGlvbiBjb2RlCisgKi8KKwogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSAicXVldWUuaCIKICNpbmNsdWRlICJzeXNjb2xvci5oIgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKLSNpbmNsdWRlICJjYWxsYmFjay5oIgogI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJnZGkuaCIKICNpbmNsdWRlICJoZWFwLmgiCkBAIC00MSw3OCArNDAsNDggQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLSNpZm5kZWYgV0lORUxJQgotI2luY2x1ZGUgImRlYnVnZ2VyLmgiCi0jZW5kaWYKIAogaW50IF9fd2luZWxpYiA9IDE7ICAvKiBXaW5lbGliIHJ1bi10aW1lIGZsYWcgKi8KIAogSEFORExFMzIgU3lzdGVtSGVhcCA9IDA7CiBIQU5ETEUzMiBTZWdwdHJIZWFwID0gMDsKIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNYWluIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUKKyAqICAgICAgICAgICBLZXJuZWwgaW5pdGlhbGlzYXRpb24gcm91dGluZQogICovCi1pbnQgTUFJTl9Jbml0KHZvaWQpCitCT09MMzIgTUFJTl9LZXJuZWxJbml0KHZvaWQpCiB7CiAgICAgZXh0ZXJuIEJPT0wzMiBFVkVOVF9Jbml0KHZvaWQpOwotICAgIGV4dGVybiBCT09MMzIgUkVMQVlfSW5pdCh2b2lkKTsKLSAgICBleHRlcm4gQk9PTDMyIFdJTjE2RFJWX0luaXQodm9pZCk7CiAgICAgZXh0ZXJuIEJPT0wzMiBWSVJUVUFMX0luaXQodm9pZCk7Ci0gICAgZXh0ZXJuIEJPT0wzMiBXSURHRVRTX0luaXQodm9pZCk7Ci0KLSAgICBpbnQgcXVldWVTaXplOwogCiAgICAgLyogSW5pdGlhbGl6ZSB2aXJ0dWFsIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0gICAgaWYgKCFWSVJUVUFMX0luaXQoKSkgcmV0dXJuIDA7CisgICAgaWYgKCFWSVJUVUFMX0luaXQoKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgLyogQ3JlYXRlIHRoZSBzeXN0ZW0gYW5kIFNFR1BUUiBoZWFwcyAqLwotICAgIGlmICghKFN5c3RlbUhlYXAgPSBIZWFwQ3JlYXRlKCBIRUFQX0dST1dBQkxFLCAweDEwMDAwLCAwICkpKSByZXR1cm4gMDsKLSAgICBpZiAoIShTZWdwdHJIZWFwID0gSGVhcENyZWF0ZSggSEVBUF9XSU5FX1NFR1BUUiwgMCwgMCApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEoU3lzdGVtSGVhcCA9IEhlYXBDcmVhdGUoIEhFQVBfR1JPV0FCTEUsIDB4MTAwMDAsIDAgKSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIShTZWdwdHJIZWFwID0gSGVhcENyZWF0ZSggSEVBUF9XSU5FX1NFR1BUUiwgMCwgMCApKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgLyogTG9hZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlICovCi0gICAgaWYgKCFQUk9GSUxFX0xvYWRXaW5lSW5pKCkpIHJldHVybiAwOworICAgIGlmICghUFJPRklMRV9Mb2FkV2luZUluaSgpKSByZXR1cm4gRkFMU0U7CiAKICAgICAgIC8qIEluaXRpYWxpemUgRE9TIG1lbW9yeSAqLwotICAgIGlmICghRE9TTUVNX0luaXQoKSkgcmV0dXJuIDA7CisgICAgaWYgKCFET1NNRU1fSW5pdCgpKSByZXR1cm4gRkFMU0U7CiAKICAgICAgIC8qIEluaXRpYWxpemUgc2lnbmFsIGhhbmRsaW5nICovCi0gICAgaWYgKCFTSUdOQUxfSW5pdCgpKSByZXR1cm4gMDsKLQotICAgICAgLyogSW5pdGlhbGl6ZSBldmVudCBoYW5kbGluZyAqLwotICAgIGlmICghRVZFTlRfSW5pdCgpKSByZXR1cm4gMDsKLQotI2lmZGVmIFdJTkVMSUIKLSAgICAvKiBDcmVhdGUgVVNFUiBhbmQgR0RJIGhlYXAgKi8KLSAgICBVU0VSX0hlYXBTZWwgPSBHbG9iYWxBbGxvYzE2KCBHTUVNX0ZJWEVELCAweDEwMDAwICk7Ci0gICAgTG9jYWxJbml0KCBVU0VSX0hlYXBTZWwsIDAsIDB4ZmZmZiApOwotICAgIEdESV9IZWFwU2VsICA9IEdsb2JhbEFsbG9jMTYoIEdNRU1fRklYRUQsIEdESV9IRUFQX1NJWkUgKTsKLSAgICBMb2NhbEluaXQoIEdESV9IZWFwU2VsLCAwLCBHRElfSEVBUF9TSVpFLTEgKTsKLSNlbHNlCi0gICAgLyogSW5pdGlhbGl6ZSByZWxheSBjb2RlICovCi0gICAgaWYgKCFSRUxBWV9Jbml0KCkpIHJldHVybiAwOwotCi0gICAgICAvKiBJbml0aWFsaXplIHNpZ25hbCBoYW5kbGluZyAqLwotICAgIGlmICghU0lHTkFMX0luaXRFbXVsYXRvcigpKSByZXR1cm4gMDsKLQotICAgIC8qIENyZWF0ZSB0aGUgV2luMTYgcHJpbnRlciBkcml2ZXIgKi8KLSAgICBpZiAoIVdJTjE2RFJWX0luaXQoKSkgcmV0dXJuIDA7Ci0jZW5kaWYgIC8qIFdJTkVMSUIgKi8KLQotICAgIC8qIEluaXRpYWxpemUgV2luZSB0d2Vha3MgKi8KLSAgICBpZiAoIVRXRUFLX0luaXQoKSkgcmV0dXJuIDA7Ci0KLSAgICAvKiBJbml0aWFsaXplIE9FTSBCaXRtYXBzICovCi0gICAgaWYgKCFPQk1fSW5pdCgpKSByZXR1cm4gMDsKKyAgICBpZiAoIVNJR05BTF9Jbml0KCkpIHJldHVybiBGQUxTRTsKIAogICAgIC8qIEluaXRpYWxpc2UgRE9TIGRyaXZlcyAqLwotICAgIGlmICghRFJJVkVfSW5pdCgpKSByZXR1cm4gMDsKKyAgICBpZiAoIURSSVZFX0luaXQoKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgLyogSW5pdGlhbGlzZSBET1MgZGlyZWN0b3JpZXMgKi8KLSAgICBpZiAoIURJUl9Jbml0KCkpIHJldHVybiAwOworICAgIGlmICghRElSX0luaXQoKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgLyogSW5pdGlhbGl6ZSB0YXNrcyAqLwotICAgIGlmICghVEFTS19Jbml0KCkpIHJldHVybiAwOworICAgIGlmICghVEFTS19Jbml0KCkpIHJldHVybiBGQUxTRTsKKworICAgICAgLyogSW5pdGlhbGl6ZSBldmVudCBoYW5kbGluZyAqLworICAgIGlmICghRVZFTlRfSW5pdCgpKSByZXR1cm4gRkFMU0U7CiAKICAgICAvKiBJbml0aWFsaXplIGNvbW11bmljYXRpb25zICovCiAgICAgQ09NTV9Jbml0KCk7CkBAIC0xMjAsMTQgKzg5LDQ1IEBACiAgICAgLyogSW5pdGlhbGl6ZSBJTy1wb3J0IHBlcm1pc3Npb25zICovCiAgICAgSU9fcG9ydF9pbml0KCk7CiAKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBVU0VSIChhbmQgR0RJKSBpbml0aWFsaXNhdGlvbiByb3V0aW5lCisgKi8KK0JPT0wzMiBNQUlOX1VzZXJJbml0KHZvaWQpCit7CisgICAgZXh0ZXJuIEJPT0wzMiBXSURHRVRTX0luaXQodm9pZCk7CisKKyAgICBpbnQgcXVldWVTaXplOworCisgICAgLyogQ3JlYXRlIFVTRVIgYW5kIEdESSBoZWFwICovCisgICAgaWYgKCFVU0VSX0hlYXBTZWwpCisgICAgeworICAgICAgICBVU0VSX0hlYXBTZWwgPSBHbG9iYWxBbGxvYzE2KCBHTUVNX0ZJWEVELCAweDEwMDAwICk7CisgICAgICAgIExvY2FsSW5pdCggVVNFUl9IZWFwU2VsLCAwLCAweGZmZmYgKTsKKyAgICB9CisgICAgaWYgKCFHRElfSGVhcFNlbCkKKyAgICB7CisgICAgICAgIEdESV9IZWFwU2VsICA9IEdsb2JhbEFsbG9jMTYoIEdNRU1fRklYRUQsIEdESV9IRUFQX1NJWkUgKTsKKyAgICAgICAgTG9jYWxJbml0KCBHRElfSGVhcFNlbCwgMCwgR0RJX0hFQVBfU0laRS0xICk7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBXaW5lIHR3ZWFrcyAqLworICAgIGlmICghVFdFQUtfSW5pdCgpKSByZXR1cm4gRkFMU0U7CisKKyAgICAvKiBJbml0aWFsaXplIE9FTSBCaXRtYXBzICovCisgICAgaWYgKCFPQk1fSW5pdCgpKSByZXR1cm4gRkFMU0U7CisKICAgICAvKiByZWdpc3RyeSBpbml0aWFsaXNhdGlvbiAqLwogICAgIFNIRUxMX0xvYWRSZWdpc3RyeSgpOwogICAgIAogICAgIC8qIEdsb2JhbCBhdG9tIHRhYmxlIGluaXRpYWxpc2F0aW9uICovCi0gICAgaWYgKCFBVE9NX0luaXQoKSkgcmV0dXJuIDA7CisgICAgaWYgKCFBVE9NX0luaXQoKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgLyogR0RJIGluaXRpYWxpc2F0aW9uICovCi0gICAgaWYgKCFHRElfSW5pdCgpKSByZXR1cm4gMDsKKyAgICBpZiAoIUdESV9Jbml0KCkpIHJldHVybiBGQUxTRTsKIAogICAgIC8qIEluaXRpYWxpemUgc3lzdGVtIGNvbG9ycyBhbmQgbWV0cmljcyovCiAgICAgU1lTTUVUUklDU19Jbml0KCk7CkBAIC0xMzcsMTAzICsxMzcsNDkgQEAKICAgICBEQ0VfSW5pdCgpOwogCiAgICAgLyogSW5pdGlhbGl6ZSBrZXlib2FyZCAqLwotICAgIGlmICghS0VZQk9BUkRfSW5pdCgpKSByZXR1cm4gMDsKKyAgICBpZiAoIUtFWUJPQVJEX0luaXQoKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgLyogSW5pdGlhbGl6ZSB3aW5kb3cgcHJvY2VkdXJlcyAqLwotICAgIGlmICghV0lOUFJPQ19Jbml0KCkpIHJldHVybiAwOworICAgIGlmICghV0lOUFJPQ19Jbml0KCkpIHJldHVybiBGQUxTRTsKIAogICAgIC8qIEluaXRpYWxpemUgYnVpbHQtaW4gd2luZG93IGNsYXNzZXMgKi8KLSAgICBpZiAoIVdJREdFVFNfSW5pdCgpKSByZXR1cm4gMDsKKyAgICBpZiAoIVdJREdFVFNfSW5pdCgpKSByZXR1cm4gRkFMU0U7CiAKICAgICAvKiBJbml0aWFsaXplIGRpYWxvZyBtYW5hZ2VyICovCi0gICAgaWYgKCFESUFMT0dfSW5pdCgpKSByZXR1cm4gMDsKKyAgICBpZiAoIURJQUxPR19Jbml0KCkpIHJldHVybiBGQUxTRTsKIAogICAgIC8qIEluaXRpYWxpemUgbWVudXMgKi8KLSAgICBpZiAoIU1FTlVfSW5pdCgpKSByZXR1cm4gMDsKKyAgICBpZiAoIU1FTlVfSW5pdCgpKSByZXR1cm4gRkFMU0U7CiAKICAgICAvKiBDcmVhdGUgZGVza3RvcCB3aW5kb3cgKi8KLSAgICBpZiAoIVdJTl9DcmVhdGVEZXNrdG9wV2luZG93KCkpIHJldHVybiAwOworICAgIGlmICghV0lOX0NyZWF0ZURlc2t0b3BXaW5kb3coKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgLyogSW5pdGlhbGl6ZSBtZXNzYWdlIHNweWluZyAqLwotICAgIGlmICghU1BZX0luaXQoKSkgcmV0dXJuIDA7CisgICAgaWYgKCFTUFlfSW5pdCgpKSByZXR1cm4gRkFMU0U7CiAKICAgICAvKiBDaGVjayB3aW5lLmNvbmYgZm9yIG9sZC9iYWQgZW50cmllcyAqLwotICAgIGlmICghVFdFQUtfQ2hlY2tDb25maWd1cmF0aW9uKCkpIHJldHVybiAwOworICAgIGlmICghVFdFQUtfQ2hlY2tDb25maWd1cmF0aW9uKCkpIHJldHVybiBGQUxTRTsKIAogICAgIC8qIENyZWF0ZSBzeXN0ZW0gbWVzc2FnZSBxdWV1ZSAqLwogICAgIHF1ZXVlU2l6ZSA9IEdldFByb2ZpbGVJbnQzMkEoICJ3aW5kb3dzIiwgIlR5cGVBaGVhZCIsIDEyMCApOwotICAgIGlmICghUVVFVUVfQ3JlYXRlU3lzTXNnUXVldWUoIHF1ZXVlU2l6ZSApKSByZXR1cm4gMDsKKyAgICBpZiAoIVFVRVVFX0NyZWF0ZVN5c01zZ1F1ZXVlKCBxdWV1ZVNpemUgKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgLyogU2V0IGRvdWJsZSBjbGljayB0aW1lICovCiAgICAgU2V0RG91YmxlQ2xpY2tUaW1lMzIoIEdldFByb2ZpbGVJbnQzMkEoIndpbmRvd3MiLCJEb3VibGVDbGlja1NwZWVkIiw0NTIpICk7CiAKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBXaW5lbGliIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUKKyAqLworaW50IE1BSU5fV2luZWxpYkluaXQodm9pZCkKK3sKKyAgICAvKiBJbml0aWFsaXplIHRoZSBrZXJuZWwgKi8KKyAgICBpZiAoIU1BSU5fS2VybmVsSW5pdCgpKSByZXR1cm4gMDsKKworICAgIC8qIEluaXRpYWxpemUgYWxsIHRoZSBVU0VSIHN0dWZmICovCisgICAgaWYgKCFNQUlOX1VzZXJJbml0KCkpIHJldHVybiAwOwogICAgIHJldHVybiAxOwogfQotCi0KLSNpZm5kZWYgV0lORUxJQgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCQltYWluCi0gKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10gKQotewotICAgIGV4dGVybiBCT09MMzIgTUFJTl9XaW5lSW5pdCggaW50ICphcmdjLCBjaGFyICphcmd2W10gKTsKLSAgICBleHRlcm4gdm9pZCAqQ0FMTDMyX0luaXQodm9pZCk7Ci0gICAgZXh0ZXJuIGNoYXIgKiBERUJVR19hcmd2MDsKLQotICAgIGludCBpLGxvYWRlZDsKLSAgICBISU5TVEFOQ0UzMiBoYW5kbGU7Ci0KLSAgICBfX3dpbmVsaWIgPSAwOyAgLyogRmlyc3Qgb2YgYWxsLCBjbGVhciB0aGUgV2luZWxpYiBmbGFnICovCi0KLSAgICAvKgotICAgICAqIFNhdmUgdGhpcyBzbyB0aGF0IHRoZSBpbnRlcm5hbCBkZWJ1Z2dlciBjYW4gZ2V0IGEgaG9sZCBvZiBpdCBpZgotICAgICAqIGl0IG5lZWRzIHRvLgotICAgICAqLwotICAgIERFQlVHX2FyZ3YwID0gYXJndlswXTsKLQotICAgIGlmICghTUFJTl9XaW5lSW5pdCggJmFyZ2MsIGFyZ3YgKSkgcmV0dXJuIDE7Ci0gICAgaWYgKCFNQUlOX0luaXQoKSkgcmV0dXJuIDE7Ci0KLSAgICAvKiBJbml0aWFsaXplIENBTEwzMiByb3V0aW5lcyAqLwotICAgIC8qIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBqdXN0IGJlZm9yZSB0YXNrLXN3aXRjaGluZyBzdGFydHMgKi8KLSAgICBJRjE2MzJfQ2FsbExhcmdlU3RhY2sgPSAoaW50ICgqKShpbnQgKCpmdW5jKSgpLCB2b2lkICphcmcpKUNBTEwzMl9Jbml0KCk7Ci0KLSAgICBsb2FkZWQ9MDsKLSAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKChoYW5kbGUgPSBXaW5FeGVjMzIoIGFyZ3ZbaV0sIFNXX1NIT1dOT1JNQUwgKSkgPCAzMikKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3aW5lOiBjYW4ndCBleGVjICclcyc6ICIsIGFyZ3ZbaV0pOwotICAgICAgICAgICAgc3dpdGNoIChoYW5kbGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDI6IGZwcmludGYoIHN0ZGVyciwgImZpbGUgbm90IGZvdW5kXG4iICk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMTogZnByaW50Ziggc3RkZXJyLCAiaW52YWxpZCBleGUgZmlsZVxuIiApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjE6IGZwcmludGYoIHN0ZGVyciwgIndpbjMyIGV4ZWN1dGFibGVcbiIgKTsgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OiBmcHJpbnRmKCBzdGRlcnIsICJlcnJvcj0lZFxuIiwgaGFuZGxlICk7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLQlsb2FkZWQrKzsKLSAgICB9Ci0KLSAgICBpZiAoIWxvYWRlZCkgeyAvKiBub3RoaW5nIGxvYWRlZCAqLwotICAgIAlleHRlcm4gdm9pZCBNQUlOX1VzYWdlKGNoYXIqKTsKLSAgICAJTUFJTl9Vc2FnZShhcmd2WzBdKTsKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBpZiAoIUdldE51bVRhc2tzKCkpCi0gICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJ3aW5lOiBubyBleGVjdXRhYmxlIGZpbGUgZm91bmQuXG4iICk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChPcHRpb25zLmRlYnVnKSBERUJVR19BZGRNb2R1bGVCcmVha3BvaW50cygpOwotCi0gICAgWWllbGQoKTsgIC8qIFN0YXJ0IHRoZSBmaXJzdCB0YXNrICovCi0gICAgZnByaW50Ziggc3RkZXJyLCAiV2luTWFpbjogU2hvdWxkIG5ldmVyIGhhcHBlbjogcmV0dXJuZWQgZnJvbSBZaWVsZCgpXG4iICk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiAjaWZuZGVmIFdJTkVMSUIgKi8KZGlmZiAtLWdpdCBhL2xvYWRlci9tb2R1bGUuYyBiL2xvYWRlci9tb2R1bGUuYwppbmRleCBjMWQzMDQ3Li4yMDJmMTg5IDEwMDY0NAotLS0gYS9sb2FkZXIvbW9kdWxlLmMKKysrIGIvbG9hZGVyL21vZHVsZS5jCkBAIC00LDYgKzQsNyBAQAogICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAorI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTkxOCwyMCArOTE5LDU0IEBACiAgKgogICogUmV0dXJuIGFuIGVudHJ5IHBvaW50IGZyb20gdGhlIFdQUk9DUyBkbGwuCiAgKi8KLSNpZm5kZWYgV0lORUxJQgotRkFSUFJPQzE2IE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNiggY29uc3QgY2hhciAqbmFtZSApCitGQVJQUk9DMTYgTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCBMUENTVFIgbmFtZSApCiB7Ci0gICAgV09SRCBvcmRpbmFsOwotICAgIEZBUlBST0MxNiByZXQ7Ci0gICAgc3RhdGljIEhNT0RVTEUzMiBoTW9kdWxlID0gMDsKKyAgICBGQVJQUk9DMTYgcmV0ID0gTlVMTDsKIAotICAgIGlmICghaE1vZHVsZSkgaE1vZHVsZSA9IEdldE1vZHVsZUhhbmRsZTE2KCAiV1BST0NTIiApOwotICAgIG9yZGluYWwgPSBNT0RVTEVfR2V0T3JkaW5hbCggaE1vZHVsZSwgbmFtZSApOwotICAgIGlmICghKHJldCA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBoTW9kdWxlLCBvcmRpbmFsICkpKQotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJHZXRXbmRQcm9jMTY6ICVzIG5vdCBmb3VuZCwgcGxlYXNlIHJlcG9ydFxuIiwgbmFtZSApOworICAgIGlmIChfX3dpbmVsaWIpCisgICAgeworICAgICAgICAvKiBGSVhNRTogaGFjayBmb3IgV2luZWxpYiAqLworICAgICAgICBleHRlcm4gTFJFU1VMVCBDb2xvckRsZ1Byb2MoSFdORDE2LFVJTlQxNixXUEFSQU0xNixMUEFSQU0pOworICAgICAgICBleHRlcm4gTFJFU1VMVCBGaWxlT3BlbkRsZ1Byb2MoSFdORDE2LFVJTlQxNixXUEFSQU0xNixMUEFSQU0pOworICAgICAgICBleHRlcm4gTFJFU1VMVCBGaWxlU2F2ZURsZ1Byb2MoSFdORDE2LFVJTlQxNixXUEFSQU0xNixMUEFSQU0pOworICAgICAgICBleHRlcm4gTFJFU1VMVCBGaW5kVGV4dERsZ1Byb2MoSFdORDE2LFVJTlQxNixXUEFSQU0xNixMUEFSQU0pOworICAgICAgICBleHRlcm4gTFJFU1VMVCBQcmludERsZ1Byb2MoSFdORDE2LFVJTlQxNixXUEFSQU0xNixMUEFSQU0pOworICAgICAgICBleHRlcm4gTFJFU1VMVCBQcmludFNldHVwRGxnUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7CisgICAgICAgIGV4dGVybiBMUkVTVUxUIFJlcGxhY2VUZXh0RGxnUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7CisKKyAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwiQ29sb3JEbGdQcm9jIikpCisgICAgICAgICAgICByZXR1cm4gKEZBUlBST0MxNilDb2xvckRsZ1Byb2M7CisgICAgICAgIGlmICghc3RyY21wKG5hbWUsIkZpbGVPcGVuRGxnUHJvYyIpKQorICAgICAgICAgICAgcmV0dXJuIChGQVJQUk9DMTYpRmlsZU9wZW5EbGdQcm9jOworICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCJGaWxlU2F2ZURsZ1Byb2MiKSkKKyAgICAgICAgICAgIHJldHVybiAoRkFSUFJPQzE2KUZpbGVTYXZlRGxnUHJvYzsKKyAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwiRmluZFRleHREbGdQcm9jIikpCisgICAgICAgICAgICByZXR1cm4gKEZBUlBST0MxNilGaW5kVGV4dERsZ1Byb2M7CisgICAgICAgIGlmICghc3RyY21wKG5hbWUsIlByaW50RGxnUHJvYyIpKQorICAgICAgICAgICAgcmV0dXJuIChGQVJQUk9DMTYpUHJpbnREbGdQcm9jOworICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCJQcmludFNldHVwRGxnUHJvYyIpKQorICAgICAgICAgICAgcmV0dXJuIChGQVJQUk9DMTYpUHJpbnRTZXR1cERsZ1Byb2M7CisgICAgICAgIGlmICghc3RyY21wKG5hbWUsIlJlcGxhY2VUZXh0RGxnUHJvYyIpKQorICAgICAgICAgICAgcmV0dXJuIChGQVJQUk9DMTYpUmVwbGFjZVRleHREbGdQcm9jOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwid2FybmluZzogTm8gbWFwcGluZyBmb3IgJXMoKSwgYWRkIG9uZSBpbiBsaWJyYXJ5L21pc2NzdHVicy5jXG4iLG5hbWUpOworICAgICAgICBhc3NlcnQoIEZBTFNFICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBXT1JEIG9yZGluYWw7CisgICAgICAgIHN0YXRpYyBITU9EVUxFMzIgaE1vZHVsZSA9IDA7CisKKyAgICAgICAgaWYgKCFoTW9kdWxlKSBoTW9kdWxlID0gR2V0TW9kdWxlSGFuZGxlMTYoICJXUFJPQ1MiICk7CisgICAgICAgIG9yZGluYWwgPSBNT0RVTEVfR2V0T3JkaW5hbCggaE1vZHVsZSwgbmFtZSApOworICAgICAgICBpZiAoIShyZXQgPSBNT0RVTEVfR2V0RW50cnlQb2ludCggaE1vZHVsZSwgb3JkaW5hbCApKSkKKyAgICAgICAgeyAgICAgICAgICAgIAorICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiR2V0V25kUHJvYzE2OiAlcyBub3QgZm91bmRcbiIsIG5hbWUgKTsKKyAgICAgICAgICAgIGFzc2VydCggRkFMU0UgKTsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gcmV0OwogfQotI2VuZGlmCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTA5LDIwMyArMTE0NCw5NyBAQAogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKICAgICBMT0FEUEFSQU1TICpwYXJhbXMgPSAoTE9BRFBBUkFNUyAqKXBhcmFtQmxvY2s7CiAgICAgT0ZTVFJVQ1Qgb2ZzOwotI2lmbmRlZiBXSU5FTElCCi0gICAgV09SRCAqcE1vZFJlZiwgKnBETExzOwogICAgIEhGSUxFMzIgaEZpbGU7Ci0gICAgaW50IGk7Ci0gICAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBERUJVR19jdXJyX21vZHVsZTsKIAotICAgIGhNb2R1bGUgPSBNT0RVTEVfRmluZE1vZHVsZSggbmFtZSApOwotCi0gICAgaWYgKCFoTW9kdWxlKSAgLyogV2UgaGF2ZSB0byBsb2FkIHRoZSBtb2R1bGUgKi8KKyAgICBpZiAoX193aW5lbGliKQogICAgIHsKLSAgICAgICAgLyogVHJ5IHRvIGxvYWQgdGhlIGJ1aWx0LWluIGZpcnN0IGlmIG5vdCBkaXNhYmxlZCAqLwotICAgICAgICBpZiAoKGhNb2R1bGUgPSBCVUlMVElOX0xvYWRNb2R1bGUoIG5hbWUsIEZBTFNFICkpKSByZXR1cm4gaE1vZHVsZTsKKyAgICAgICAgbHN0cmNweW4zMkEoIG9mcy5zelBhdGhOYW1lLCBuYW1lLCBzaXplb2Yob2ZzLnN6UGF0aE5hbWUpICk7CisgICAgICAgIGlmICgoaE1vZHVsZSA9IE1PRFVMRV9DcmVhdGVEdW1teU1vZHVsZSggJm9mcyApKSA8IDMyKSByZXR1cm4gaE1vZHVsZTsKKyAgICAgICAgcE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrMTYoIGhNb2R1bGUgKTsKKyAgICAgICAgaFByZXZJbnN0YW5jZSA9IDA7CisgICAgICAgIGhJbnN0YW5jZSA9IE1PRFVMRV9DcmVhdGVJbnN0YW5jZSggaE1vZHVsZSwgcGFyYW1zICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhNb2R1bGUgPSBNT0RVTEVfRmluZE1vZHVsZSggbmFtZSApOwogCi0gICAgICAgIGlmICgoaEZpbGUgPSBPcGVuRmlsZTMyKCBuYW1lLCAmb2ZzLCBPRl9SRUFEICkpID09IEhGSUxFX0VSUk9SMzIpCisgICAgICAgIGlmICghaE1vZHVsZSkgIC8qIFdlIGhhdmUgdG8gbG9hZCB0aGUgbW9kdWxlICovCiAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIE5vdyB0cnkgdGhlIGJ1aWx0LWluIGV2ZW4gaWYgZGlzYWJsZWQgKi8KLSAgICAgICAgICAgIGlmICgoaE1vZHVsZSA9IEJVSUxUSU5fTG9hZE1vZHVsZSggbmFtZSwgVFJVRSApKSkKKyAgICAgICAgICAgIC8qIFRyeSB0byBsb2FkIHRoZSBidWlsdC1pbiBmaXJzdCBpZiBub3QgZGlzYWJsZWQgKi8KKyAgICAgICAgICAgIGlmICgoaE1vZHVsZSA9IEJVSUxUSU5fTG9hZE1vZHVsZSggbmFtZSwgRkFMU0UgKSkpIHJldHVybiBoTW9kdWxlOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoKGhGaWxlID0gT3BlbkZpbGUzMiggbmFtZSwgJm9mcywgT0ZfUkVBRCApKSA9PSBIRklMRV9FUlJPUjMyKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IGNvdWxkIG5vdCBsb2FkIFdpbmRvd3MgRExMICclcycsIHVzaW5nIGJ1aWx0LWluIG1vZHVsZS5cbiIsIG5hbWUgKTsKKyAgICAgICAgICAgICAgICAvKiBOb3cgdHJ5IHRoZSBidWlsdC1pbiBldmVuIGlmIGRpc2FibGVkICovCisgICAgICAgICAgICAgICAgaWYgKChoTW9kdWxlID0gQlVJTFRJTl9Mb2FkTW9kdWxlKCBuYW1lLCBUUlVFICkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2FybmluZzogY291bGQgbm90IGxvYWQgV2luZG93cyBETEwgJyVzJywgdXNpbmcgYnVpbHQtaW4gbW9kdWxlLlxuIiwgbmFtZSApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaE1vZHVsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIDI7ICAvKiBGaWxlIG5vdCBmb3VuZCAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBzdHJ1Y3R1cmUgKi8KKworICAgICAgICAgICAgaE1vZHVsZSA9IE1PRFVMRV9Mb2FkRXhlSGVhZGVyKCBoRmlsZSwgJm9mcyApOworICAgICAgICAgICAgaWYgKGhNb2R1bGUgPCAzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaE1vZHVsZSA9PSAyMSkKKyAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSA9IFBFX0xvYWRNb2R1bGUoIGhGaWxlLCAmb2ZzLCBwYXJhbUJsb2NrICk7CisgICAgICAgICAgICAgICAgZWxzZSBfbGNsb3NlMzIoIGhGaWxlICk7CisKKyAgICAgICAgICAgICAgICBpZiAoaE1vZHVsZSA8IDMyKQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJMb2FkTW9kdWxlOiBjYW4ndCBsb2FkICclcycsIGVycm9yPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBoTW9kdWxlICk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGhNb2R1bGU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMjsgIC8qIEZpbGUgbm90IGZvdW5kICovCisgICAgICAgICAgICBfbGNsb3NlMzIoIGhGaWxlICk7CisgICAgICAgICAgICBwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApOworICAgICAgICAgICAgcE1vZHVsZS0+ZmxhZ3MgfD0gdUZsYWdzOyAvKiBzdGFtcCBpbXBsaWNpdGx5IGxvYWRlZCBtb2R1bGVzICovCisKKyAgICAgICAgICAgIC8qIEFsbG9jYXRlIHRoZSBzZWdtZW50cyBmb3IgdGhpcyBtb2R1bGUgKi8KKworICAgICAgICAgICAgTU9EVUxFX0NyZWF0ZVNlZ21lbnRzKCBoTW9kdWxlICk7CisgICAgICAgICAgICBoUHJldkluc3RhbmNlID0gMDsKKyAgICAgICAgICAgIGhJbnN0YW5jZSA9IE1PRFVMRV9DcmVhdGVJbnN0YW5jZShoTW9kdWxlLChMT0FEUEFSQU1TKilwYXJhbUJsb2NrKTsKKworICAgICAgICAgICAgLyogTG9hZCB0aGUgcmVmZXJlbmNlZCBETExzICovCisKKyAgICAgICAgICAgIGlmICghTkVfTG9hZERMTHMoIHBNb2R1bGUgKSkgcmV0dXJuIDI7ICAvKiBGaWxlIG5vdCBmb3VuZCAqLworCisgICAgICAgICAgICAvKiBMb2FkIHRoZSBzZWdtZW50cyAqLworCisgICAgICAgICAgICBORV9Mb2FkQWxsU2VnbWVudHMoIHBNb2R1bGUgKTsKKworICAgICAgICAgICAgLyogRml4dXAgdGhlIGZ1bmN0aW9ucyBwcm9sb2dzICovCisKKyAgICAgICAgICAgIE5FX0ZpeHVwUHJvbG9ncyggcE1vZHVsZSApOworCisgICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIHVzYWdlIGNvdW50IGlzIDEgb24gdGhlIGZpcnN0IGxvYWRpbmcgb2YgICovCisgICAgICAgICAgICAvKiB0aGUgbW9kdWxlLCBldmVuIGlmIGl0IGNvbnRhaW5zIGNpcmN1bGFyIERMTCByZWZlcmVuY2VzICovCisKKyAgICAgICAgICAgIHBNb2R1bGUtPmNvdW50ID0gMTsKKworICAgICAgICAgICAgLyogQ2FsbCBpbml0aWFsaXphdGlvbiByb3VudGluZXMgZm9yIGFsbCBsb2FkZWQgRExMcy4gTm90ZSB0aGF0CisgICAgICAgICAgICAgKiB3aGVuIHdlIGxvYWQgaW1wbGljaXRseSBsaW5rZWQgRExMcyB0aGlzIHdpbGwgYmUgZG9uZSBieSBJbml0VGFzaygpLgorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGlmICgocE1vZHVsZS0+ZmxhZ3MgJiAoTkVfRkZMQUdTX0xJQk1PRFVMRSB8IE5FX0ZGTEFHU19JTVBMSUNJVCkpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORV9GRkxBR1NfTElCTU9EVUxFICkKKyAgICAgICAgICAgICAgICBORV9Jbml0aWFsaXplRExMcyggaE1vZHVsZSApOwogICAgICAgICB9Ci0KLQkvKgotCSAqIFJlY29yZCB0aGlzIHNvIHRoYXQgdGhlIGludGVybmFsIGRlYnVnZ2VyIGdldHMgc29tZQotCSAqIHJlY29yZCBvZiB3aGF0IGl0IGlzIHRoYXQgd2UgYXJlIHdvcmtpbmcgd2l0aC4KLQkgKi8KLQlERUJVR19jdXJyX21vZHVsZSA9IG5hbWU7Ci0KLSAgICAgICAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBzdHJ1Y3R1cmUgKi8KLQotICAgICAgICBoTW9kdWxlID0gTU9EVUxFX0xvYWRFeGVIZWFkZXIoIGhGaWxlLCAmb2ZzICk7Ci0gICAgICAgIGlmIChoTW9kdWxlIDwgMzIpCisgICAgICAgIGVsc2UgLyogbW9kdWxlIGlzIGFscmVhZHkgbG9hZGVkLCBqdXN0IGNyZWF0ZSBhIG5ldyBkYXRhIHNlZ21lbnQgaWYgaXQncyBhIHRhc2sgKi8KICAgICAgICAgewotICAgICAgICAgICAgaWYgKGhNb2R1bGUgPT0gMjEpCi0gICAgICAgICAgICAgICAgaE1vZHVsZSA9IFBFX0xvYWRNb2R1bGUoIGhGaWxlLCAmb2ZzLCBwYXJhbUJsb2NrICk7Ci0JICAgIGVsc2UgX2xjbG9zZTMyKCBoRmlsZSApOwotCi0gICAgICAgICAgICBpZiAoaE1vZHVsZSA8IDMyKQotICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkxvYWRNb2R1bGU6IGNhbid0IGxvYWQgJyVzJywgZXJyb3I9JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaE1vZHVsZSApOwotICAgICAgICAgICAgcmV0dXJuIGhNb2R1bGU7CisgICAgICAgICAgICBwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApOworICAgICAgICAgICAgaFByZXZJbnN0YW5jZSA9IE1PRFVMRV9HZXRJbnN0YW5jZSggaE1vZHVsZSApOworICAgICAgICAgICAgaEluc3RhbmNlID0gTU9EVUxFX0NyZWF0ZUluc3RhbmNlKCBoTW9kdWxlLCBwYXJhbXMgKTsKKyAgICAgICAgICAgIGlmIChoSW5zdGFuY2UgIT0gaFByZXZJbnN0YW5jZSkgIC8qIG5vdCBhIGxpYnJhcnkgKi8KKyAgICAgICAgICAgICAgICBORV9Mb2FkU2VnbWVudCggcE1vZHVsZSwgcE1vZHVsZS0+ZGdyb3VwICk7CisgICAgICAgICAgICBwTW9kdWxlLT5jb3VudCsrOwogICAgICAgICB9Ci0gICAgICAgIF9sY2xvc2UzMiggaEZpbGUgKTsKLSAgICAgICAgcE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKTsKLQlwTW9kdWxlLT5mbGFncyB8PSB1RmxhZ3M7IC8qIHN0YW1wIGltcGxpY2l0bHkgbG9hZGVkIG1vZHVsZXMgKi8KKyAgICB9IC8qICF3aW5lbGliICovCiAKLSAgICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgc2VnbWVudHMgZm9yIHRoaXMgbW9kdWxlICovCi0KLSAgICAgICAgTU9EVUxFX0NyZWF0ZVNlZ21lbnRzKCBoTW9kdWxlICk7Ci0KLSAgICAgICAgaFByZXZJbnN0YW5jZSA9IDA7Ci0gICAgICAgIGhJbnN0YW5jZSA9IE1PRFVMRV9DcmVhdGVJbnN0YW5jZSggaE1vZHVsZSwgKExPQURQQVJBTVMqKXBhcmFtQmxvY2sgKTsKLQotICAgICAgICAgIC8qIExvYWQgdGhlIHJlZmVyZW5jZWQgRExMcyAqLwotCi0gICAgICAgIHBNb2RSZWYgPSAoV09SRCAqKSgoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5tb2RyZWZfdGFibGUpOwotICAgICAgICBwRExMcyA9IChXT1JEICopR2xvYmFsTG9jazE2KCBwTW9kdWxlLT5kbGxzX3RvX2luaXQgKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBNb2R1bGUtPm1vZHJlZl9jb3VudDsgaSsrLCBwTW9kUmVmKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgYnVmZmVyWzI1Nl07Ci0gICAgICAgICAgICBCWVRFICpwc3RyID0gKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+aW1wb3J0X3RhYmxlICsgKnBNb2RSZWY7Ci0gICAgICAgICAgICBtZW1jcHkoIGJ1ZmZlciwgcHN0ciArIDEsICpwc3RyICk7Ci0gICAgICAgICAgICBzdHJjcHkoIGJ1ZmZlciArICpwc3RyLCAiLmRsbCIgKTsKLSAgICAgICAgICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJMb2FkaW5nICclcydcbiIsIGJ1ZmZlciApOwotICAgICAgICAgICAgaWYgKCEoKnBNb2RSZWYgPSBNT0RVTEVfRmluZE1vZHVsZSggYnVmZmVyICkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIElmIHRoZSBETEwgaXMgbm90IGxvYWRlZCB5ZXQsIGxvYWQgaXQgYW5kIHN0b3JlICovCi0gICAgICAgICAgICAgICAgLyogaXRzIGhhbmRsZSBpbiB0aGUgbGlzdCBvZiBETExzIHRvIGluaXRpYWxpemUuICAgKi8KLSAgICAgICAgICAgICAgICBITU9EVUxFMTYgaERMTDsKLQotICAgICAgICAgICAgICAgIGlmICgoaERMTCA9IE1PRFVMRV9Mb2FkKCBidWZmZXIsIChMUFZPSUQpLTEsIE5FX0ZGTEFHU19JTVBMSUNJVCApKSA9PSAyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogZmlsZSBub3QgZm91bmQgKi8KLSAgICAgICAgICAgICAgICAgICAgY2hhciAqcDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBUcnkgd2l0aCBwcmVwZW5kaW5nIHRoZSBwYXRoIG9mIHRoZSBjdXJyZW50IG1vZHVsZSAqLwotICAgICAgICAgICAgICAgICAgICBHZXRNb2R1bGVGaWxlTmFtZTE2KCBoTW9kdWxlLCBidWZmZXIsIHNpemVvZihidWZmZXIpICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKHAgPSBzdHJyY2hyKCBidWZmZXIsICdcXCcgKSkpIHAgPSBidWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSggcCArIDEsIHBzdHIgKyAxLCAqcHN0ciApOwotICAgICAgICAgICAgICAgICAgICBzdHJjcHkoIHAgKyAxICsgKnBzdHIsICIuZGxsIiApOwotICAgICAgICAgICAgICAgICAgICBoRExMID0gTU9EVUxFX0xvYWQoIGJ1ZmZlciwgKExQVk9JRCktMSwgTkVfRkZMQUdTX0lNUExJQ0lUICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoRExMIDwgMzIpCi0gICAgICAgICAgICAgICAgewotCQkgICAgLyogRklYTUU6IGNsZWFudXAgd2hhdCB3YXMgZG9uZSAqLwotCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkNvdWxkIG5vdCBsb2FkICclcycgcmVxdWlyZWQgYnkgJyVzJywgZXJyb3IgPSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBuYW1lLCBoRExMICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAyOyAgLyogZmlsZSBub3QgZm91bmQgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKnBNb2RSZWYgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoIGhETEwgKTsKLSAgICAgICAgICAgICAgICAqcERMTHMrKyA9ICpwTW9kUmVmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAgLyogSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIERMTCAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5FX01PRFVMRSAqcE9sZERMTCA9IE1PRFVMRV9HZXRQdHIoICpwTW9kUmVmICk7Ci0gICAgICAgICAgICAgICAgaWYgKHBPbGRETEwpIHBPbGRETEwtPmNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAgIC8qIExvYWQgdGhlIHNlZ21lbnRzICovCi0KLQlpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfU0VMRkxPQUQpCi0JewotICAgICAgICAgICAgICAgIEhGSUxFMzIgaGY7Ci0JCS8qIEhhbmRsZSBzZWxmIGxvYWRpbmcgbW9kdWxlcyAqLwotCQlTRUdUQUJMRUVOVFJZICogcFNlZ1RhYmxlID0gKFNFR1RBQkxFRU5UUlkgKikgTkVfU0VHX1RBQkxFKHBNb2R1bGUpOwotCQlTRUxGTE9BREhFQURFUiAqc2VsZmxvYWRoZWFkZXI7Ci0gICAgICAgICAgICAgICAgU1RBQ0sxNkZSQU1FICpzdGFjazE2VG9wOwotCQlITU9EVUxFMTYgaHNlbGZsb2FkID0gR2V0TW9kdWxlSGFuZGxlMTYoIldQUk9DUyIpOwotICAgICAgICAgICAgICAgIERXT1JEIG9sZHN0YWNrOwotCQlXT1JEIHNhdmVkX2Rncm91cCA9IHBTZWdUYWJsZVtwTW9kdWxlLT5kZ3JvdXAgLSAxXS5zZWxlY3RvcjsKLQotCQlkcHJpbnRmX21vZHVsZShzdGRkZWIsICJNT0RVTEVfTG9hZDogJSouKnMgaXMgYSBzZWxmLWxvYWRpbmcgbW9kdWxlIVxuIiwKLQkJCQkJKigoQllURSopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUpLAotCQkJCQkqKChCWVRFKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSksCi0JCQkJCSAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlICsgMSk7Ci0KLQkJTkVfTG9hZFNlZ21lbnQoIGhNb2R1bGUsIDEgKTsKLQkJc2VsZmxvYWRoZWFkZXIgPSAoU0VMRkxPQURIRUFERVIgKikKLQkJCVBUUl9TRUdfT0ZGX1RPX0xJTihwU2VnVGFibGUtPnNlbGVjdG9yLCAwKTsKLQkJc2VsZmxvYWRoZWFkZXItPkVudHJ5QWRkclByb2MgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RVTEVfR2V0RW50cnlQb2ludChoc2VsZmxvYWQsMjcpOwotCQlzZWxmbG9hZGhlYWRlci0+TXlBbGxvYyAgPSBNT0RVTEVfR2V0RW50cnlQb2ludChoc2VsZmxvYWQsMjgpOwotCQlzZWxmbG9hZGhlYWRlci0+U2V0T3duZXIgPSBNT0RVTEVfR2V0RW50cnlQb2ludChHZXRNb2R1bGVIYW5kbGUxNigiS0VSTkVMIiksNDAzKTsKLQkJcE1vZHVsZS0+c2VsZl9sb2FkaW5nX3NlbCA9IEdsb2JhbEhhbmRsZVRvU2VsKAotCQkJCQlHTE9CQUxfQWxsb2MgKEdNRU1fWkVST0lOSVQsCi0JCQkJCTB4RkYwMCwgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSkKLQkJCQkJKTsKLQkJb2xkc3RhY2sgPSBJRjE2MzJfU2F2ZWQxNl9zc19zcDsKLQkJSUYxNjMyX1NhdmVkMTZfc3Nfc3AgPQotICAgICAgICAgICAgICAgICAgICBQVFJfU0VHX09GRl9UT19TRUdQVFIoIHBNb2R1bGUtPnNlbGZfbG9hZGluZ19zZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjAwIC0gc2l6ZW9mKCpzdGFjazE2VG9wKSApOwotICAgICAgICAgICAgICAgIHN0YWNrMTZUb3AgPSBDVVJSRU5UX1NUQUNLMTY7Ci0gICAgICAgICAgICAgICAgc3RhY2sxNlRvcC0+c2F2ZWRfc3Nfc3AgPSAwOwotICAgICAgICAgICAgICAgIHN0YWNrMTZUb3AtPmVicCA9IDA7Ci0gICAgICAgICAgICAgICAgc3RhY2sxNlRvcC0+ZHMgPSBzdGFjazE2VG9wLT5lcyA9IHBNb2R1bGUtPnNlbGZfbG9hZGluZ19zZWw7Ci0gICAgICAgICAgICAgICAgc3RhY2sxNlRvcC0+ZW50cnlfcG9pbnQgPSAwOwotICAgICAgICAgICAgICAgIHN0YWNrMTZUb3AtPmVudHJ5X2lwID0gMDsKLSAgICAgICAgICAgICAgICBzdGFjazE2VG9wLT5lbnRyeV9jcyA9IDA7Ci0gICAgICAgICAgICAgICAgc3RhY2sxNlRvcC0+YnAgPSAwOwotICAgICAgICAgICAgICAgIHN0YWNrMTZUb3AtPmlwID0gMDsKLSAgICAgICAgICAgICAgICBzdGFjazE2VG9wLT5jcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICBoZiA9IEZJTEVfRHVwVW5peEhhbmRsZSggTU9EVUxFX09wZW5GaWxlKCBoTW9kdWxlICkgKTsKLSAgICAgICAgICAgICAgICBDYWxsYmFja3MtPkNhbGxCb290QXBwUHJvYyggc2VsZmxvYWRoZWFkZXItPkJvb3RBcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIGhmICk7Ci0gICAgICAgICAgICAgICAgX2xjbG9zZTMyKGhmKTsKLQkJLyogc29tZSBCb290QXBwIHByb2NzIG92ZXJ3cml0ZSB0aGUgc2VsZWN0b3Igb2YgZGdyb3VwICovCi0JCXBTZWdUYWJsZVtwTW9kdWxlLT5kZ3JvdXAgLSAxXS5zZWxlY3RvciA9IHNhdmVkX2Rncm91cDsKLQkJSUYxNjMyX1NhdmVkMTZfc3Nfc3AgPSBvbGRzdGFjazsKLQkJZm9yIChpID0gMjsgaSA8PSBwTW9kdWxlLT5zZWdfY291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgTkVfTG9hZFNlZ21lbnQoIGhNb2R1bGUsIGkgKTsKLQl9IAotCWVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBwTW9kdWxlLT5zZWdfY291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICBORV9Mb2FkU2VnbWVudCggaE1vZHVsZSwgaSApOwotICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBGaXh1cCB0aGUgZnVuY3Rpb25zIHByb2xvZ3MgKi8KLQotICAgICAgICBORV9GaXh1cFByb2xvZ3MoIHBNb2R1bGUgKTsKLQotICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgdXNhZ2UgY291bnQgaXMgMSBvbiB0aGUgZmlyc3QgbG9hZGluZyBvZiAgKi8KLSAgICAgICAgICAvKiB0aGUgbW9kdWxlLCBldmVuIGlmIGl0IGNvbnRhaW5zIGNpcmN1bGFyIERMTCByZWZlcmVuY2VzICovCi0KLSAgICAgICAgcE1vZHVsZS0+Y291bnQgPSAxOwotCi0JICAvKiBDYWxsIGluaXRpYWxpemF0aW9uIHJvdW50aW5lcyBmb3IgYWxsIGxvYWRlZCBETExzLiBOb3RlIHRoYXQKLQkgICAqIHdoZW4gd2UgbG9hZCBpbXBsaWNpdGx5IGxpbmtlZCBETExzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBJbml0VGFzaygpLgotCSAgICovCi0KLSAgICAgICAgaWYgKChwTW9kdWxlLT5mbGFncyAmIChORV9GRkxBR1NfTElCTU9EVUxFIHwgTkVfRkZMQUdTX0lNUExJQ0lUKSkgPT0KLQkJCSAgICAgICBORV9GRkxBR1NfTElCTU9EVUxFICkgTkVfSW5pdGlhbGl6ZURMTHMoIGhNb2R1bGUgKTsKLSAgICB9Ci0gICAgZWxzZSAvKiBtb2R1bGUgaXMgYWxyZWFkeSBsb2FkZWQsIGp1c3QgY3JlYXRlIGEgbmV3IGRhdGEgc2VnbWVudCBpZiBpdCdzIGEgdGFzayAqLwotICAgIHsKLSAgICAgICAgcE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKTsKLSAgICAgICAgaFByZXZJbnN0YW5jZSA9IE1PRFVMRV9HZXRJbnN0YW5jZSggaE1vZHVsZSApOwotICAgICAgICBoSW5zdGFuY2UgPSBNT0RVTEVfQ3JlYXRlSW5zdGFuY2UoIGhNb2R1bGUsIHBhcmFtcyApOwotICAgICAgICBpZiAoaEluc3RhbmNlICE9IGhQcmV2SW5zdGFuY2UpICAvKiBub3QgYSBsaWJyYXJ5ICovCi0gICAgICAgICAgICBORV9Mb2FkU2VnbWVudCggaE1vZHVsZSwgcE1vZHVsZS0+ZGdyb3VwICk7Ci0gICAgICAgIHBNb2R1bGUtPmNvdW50Kys7Ci0gICAgfQotCi0jZWxzZQotICAgIGxzdHJjcHluMzJBKCBvZnMuc3pQYXRoTmFtZSwgbmFtZSwgc2l6ZW9mKG9mcy5zelBhdGhOYW1lKSApOwotICAgIGlmICgoaE1vZHVsZSA9IE1PRFVMRV9DcmVhdGVEdW1teU1vZHVsZSggJm9mcyApKSA8IDMyKSByZXR1cm4gaE1vZHVsZTsKLSAgICBwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2sxNiggaE1vZHVsZSApOwotICAgIGhQcmV2SW5zdGFuY2UgPSAwOwotICAgIGhJbnN0YW5jZSA9IE1PRFVMRV9DcmVhdGVJbnN0YW5jZSggaE1vZHVsZSwgcGFyYW1zICk7Ci0jZW5kaWYgLyogV0lORUxJQiAqLwotCi0gICAgICAvKiBDcmVhdGUgYSB0YXNrIGZvciB0aGlzIGluc3RhbmNlICovCisgICAgLyogQ3JlYXRlIGEgdGFzayBmb3IgdGhpcyBpbnN0YW5jZSAqLwogCiAgICAgaWYgKCEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTElCTU9EVUxFKSAmJiAocGFyYW1CbG9jayAhPSAoTFBWT0lEKS0xKSkKICAgICB7CkBAIC0xNjc1LDEzICsxNjA0LDkgQEAKIAogCWlmICh1c2VfbG9hZF9tb2R1bGUpCiAJewotI2lmZGVmIFdJTkVMSUIKLQkgICAgLyogV0lORUxJQjogVXNlIExvYWRNb2R1bGUoKSBvbmx5IGZvciB0aGUgcHJvZ3JhbSBpdHNlbGYgKi8KLQkgICAgdXNlX2xvYWRfbW9kdWxlID0gMDsKLQkgICAgcGFyYW1zLmhFbnZpcm9ubWVudCA9IChIR0xPQkFMMTYpR2V0RE9TRW52aXJvbm1lbnQoKTsKLSNlbHNlCisJICAgIC8qIFdpbmVsaWI6IFVzZSBMb2FkTW9kdWxlKCkgb25seSBmb3IgdGhlIHByb2dyYW0gaXRzZWxmICovCisJICAgIGlmIChfX3dpbmVsaWIpIHVzZV9sb2FkX21vZHVsZSA9IDA7CiAJICAgIHBhcmFtcy5oRW52aXJvbm1lbnQgPSAoSEdMT0JBTDE2KVNFTEVDVE9ST0YoIEdldERPU0Vudmlyb25tZW50KCkgKTsKLSNlbmRpZiAgLyogV0lORUxJQiAqLwogCSAgICBwYXJhbXMuY21kTGluZSAgPSAoU0VHUFRSKVdJTjE2X0dsb2JhbExvY2sxNiggY21kTGluZUhhbmRsZSApOwogCSAgICBwYXJhbXMuc2hvd0NtZCAgPSAoU0VHUFRSKVdJTjE2X0dsb2JhbExvY2sxNiggY21kU2hvd0hhbmRsZSApOwogCSAgICBwYXJhbXMucmVzZXJ2ZWQgPSAwOwpAQCAtMTg0MCw3ICsxNzY1LDYgQEAKICAqLwogRkFSUFJPQzMyIFdJTkFQSSBHZXRQcm9jQWRkcmVzczMyKCBITU9EVUxFMzIgaE1vZHVsZSwgTFBDU1RSIGZ1bmN0aW9uICkKIHsKLSNpZm5kZWYgV0lORUxJQgogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKIAogICAgIGlmIChISVdPUkQoZnVuY3Rpb24pKQpAQCAtMTg1OCw5ICsxNzgyLDYgQEAKIAlyZXR1cm4gKEZBUlBST0MzMikwOwogICAgIH0KICAgICByZXR1cm4gUEVfRmluZEV4cG9ydGVkRnVuY3Rpb24oIHBNb2R1bGUtPnBlX21vZHVsZSwgZnVuY3Rpb24gKTsKLSNlbHNlCi0gICAgcmV0dXJuIE5VTEw7Ci0jZW5kaWYKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9sb2FkZXIvbmVfaW1hZ2UuYyBiL2xvYWRlci9uZV9pbWFnZS5jCmluZGV4IDVmYWRjZWYuLmQ0MmU1YmMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZV9pbWFnZS5jCisrKyBiL2xvYWRlci9uZV9pbWFnZS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlICJuZWV4ZS5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJnbG9iYWwuaCIKICNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAic2VsZWN0b3JzLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKQEAgLTMwLDkgKzMxLDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE5FX0xvYWRTZWdtZW50CiAgKi8KLUJPT0wzMiBORV9Mb2FkU2VnbWVudCggSE1PRFVMRTE2IGhNb2R1bGUsIFdPUkQgc2VnbnVtICkKK0JPT0wzMiBORV9Mb2FkU2VnbWVudCggTkVfTU9EVUxFICpwTW9kdWxlLCBXT1JEIHNlZ251bSApCiB7Ci0gICAgTkVfTU9EVUxFICpwTW9kdWxlOwogICAgIFNFR1RBQkxFRU5UUlkgKnBTZWdUYWJsZSwgKnBTZWc7CiAgICAgV09SRCAqcE1vZHVsZVRhYmxlOwogICAgIFdPUkQgY291bnQsIGksIG9mZnNldDsKQEAgLTQ0LDE4ICs0NCwxNyBAQAogICAgIGludCBzaXplOwogICAgIGNoYXIqIG1lbTsKIAotICAgIGNoYXIgYnVmZmVyWzEwMF07CisgICAgY2hhciBidWZmZXJbMjU2XTsKICAgICBpbnQgb3JkaW5hbCwgYWRkaXRpdmU7CiAgICAgdW5zaWduZWQgc2hvcnQgKnNwOwogCi0gICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiBGQUxTRTsKICAgICBwU2VnVGFibGUgPSBORV9TRUdfVEFCTEUoIHBNb2R1bGUgKTsKICAgICBwU2VnID0gcFNlZ1RhYmxlICsgc2VnbnVtIC0gMTsKICAgICBwTW9kdWxlVGFibGUgPSBORV9NT0RVTEVfVEFCTEUoIHBNb2R1bGUgKTsKIAogICAgIGlmICghcFNlZy0+ZmlsZXBvcykgcmV0dXJuIFRSVUU7ICAvKiBObyBmaWxlIGltYWdlLCBqdXN0IHJldHVybiAqLwogCQotICAgIGZkID0gTU9EVUxFX09wZW5GaWxlKCBoTW9kdWxlICk7CisgICAgZmQgPSBNT0RVTEVfT3BlbkZpbGUoIHBNb2R1bGUtPnNlbGYgKTsKICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiTG9hZGluZyBzZWdtZW50ICVkLCBzZWxlY3Rvcj0lMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICBzZWdudW0sIHBTZWctPnNlbGVjdG9yICk7CiAgICAgbHNlZWsoIGZkLCBwU2VnLT5maWxlcG9zIDw8IHBNb2R1bGUtPmFsaWdubWVudCwgU0VFS19TRVQgKTsKQEAgLTg4LDcgKzg3LDcgQEAKICAgICAgICAgc3RhY2sxNlRvcC0+aXAgPSAwOwogICAgICAgICBzdGFjazE2VG9wLT5jcyA9IDA7CiAgCW5ld3NlbGVjdG9yID0gQ2FsbGJhY2tzLT5DYWxsTG9hZEFwcFNlZ1Byb2Moc2VsZmxvYWRoZWFkZXItPkxvYWRBcHBTZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgaGYsIHNlZ251bSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1vZHVsZS0+c2VsZiwgaGYsIHNlZ251bSApOwogICAgICAgICBfbGNsb3NlMzIoIGhmICk7CiAgCWlmIChuZXdzZWxlY3RvciAhPSBvbGRzZWxlY3RvcikgewogIAkgIC8qIFNlbGYgbG9hZGVycyBsaWtlIGNyZWF0aW5nIHRoZWlyIG93biBzZWxlY3RvcnM7IApAQCAtMjE4LDE2ICsyMTcsMTQgQEAKICAgICAgICAgICAgIGlmICghYWRkcmVzcykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBORV9NT0RVTEUgKnBUYXJnZXQgPSBNT0RVTEVfR2V0UHRyKCBtb2R1bGUgKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBubyBoYW5kbGVyIGZvciAlKi4qcy4lcywgc2V0dGluZyB0byAwOjBcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAqKChCWVRFICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUpLAorICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IG5vIGhhbmRsZXIgZm9yICUuKnMuJXMsIHNldHRpbmcgdG8gMDowXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUgKyAxLCBmdW5jX25hbWUgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChkZWJ1Z2dpbmdfZml4dXApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgTkVfTU9EVUxFICpwVGFyZ2V0ID0gTU9EVUxFX0dldFB0ciggbW9kdWxlICk7Ci0gICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZGViLCIlZDogJSouKnMuJXM9JTA0eDolMDR4XG4iLCBpICsgMSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlKSwKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRkZWIsIiVkOiAlLipzLiVzPSUwNHg6JTA0eFxuIiwgaSArIDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICooKEJZVEUgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lLCBISVdPUkQoYWRkcmVzcyksIExPV09SRChhZGRyZXNzKSApOwpAQCAtMjM3LDcgKzIzNCw3IEBACiAJICBjYXNlIE5FX1JFTFRZUEVfSU5URVJOQUw6CiAJICAgIGlmICgocmVwLT50YXJnZXQxICYgMHhmZikgPT0gMHhmZikKIAkgICAgewotCQlhZGRyZXNzICA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBoTW9kdWxlLCByZXAtPnRhcmdldDIgKTsKKwkJYWRkcmVzcyAgPSBNT0RVTEVfR2V0RW50cnlQb2ludCggcE1vZHVsZS0+c2VsZiwgcmVwLT50YXJnZXQyICk7CiAJICAgIH0KIAkgICAgZWxzZQogCSAgICB7CkBAIC0yODIsNyArMjc5LDcgQEAKICAgICAgICAgLyogd2UgaWdub3JlIGl0IGZvciBub3cgKi8KIAlpZiAocmVwLT5hZGRyZXNzX3R5cGUgPiBORV9SQUREUl9PRkZTRVQzMikKICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldBUk5JTkc6IG1vZHVsZSAlczogdW5rbm93biByZWxvYyBhZGRyIHR5cGUgPSAweCUwMnguIFBsZWFzZSByZXBvcnQuXG4iLAotICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX0dldE1vZHVsZU5hbWUoaE1vZHVsZSksIHJlcC0+YWRkcmVzc190eXBlICk7CisgICAgICAgICAgICAgICAgICAgICBNT0RVTEVfR2V0TW9kdWxlTmFtZShwTW9kdWxlLT5zZWxmKSwgcmVwLT5hZGRyZXNzX3R5cGUgKTsKIAogCXN3aXRjaCAocmVwLT5hZGRyZXNzX3R5cGUgJiAweDdmKQogCXsKQEAgLTM1OCw2ICszNTUsMTIyIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTkVfTG9hZEFsbFNlZ21lbnRzCisgKi8KK0JPT0wzMiBORV9Mb2FkQWxsU2VnbWVudHMoIE5FX01PRFVMRSAqcE1vZHVsZSApCit7CisgICAgaW50IGk7CisKKyAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfU0VMRkxPQUQpCisgICAgeworICAgICAgICBIRklMRTMyIGhmOworICAgICAgICAvKiBIYW5kbGUgc2VsZiBsb2FkaW5nIG1vZHVsZXMgKi8KKyAgICAgICAgU0VHVEFCTEVFTlRSWSAqIHBTZWdUYWJsZSA9IChTRUdUQUJMRUVOVFJZICopIE5FX1NFR19UQUJMRShwTW9kdWxlKTsKKyAgICAgICAgU0VMRkxPQURIRUFERVIgKnNlbGZsb2FkaGVhZGVyOworICAgICAgICBTVEFDSzE2RlJBTUUgKnN0YWNrMTZUb3A7CisgICAgICAgIEhNT0RVTEUxNiBoc2VsZmxvYWQgPSBHZXRNb2R1bGVIYW5kbGUxNigiV1BST0NTIik7CisgICAgICAgIERXT1JEIG9sZHN0YWNrOworICAgICAgICBXT1JEIHNhdmVkX2Rncm91cCA9IHBTZWdUYWJsZVtwTW9kdWxlLT5kZ3JvdXAgLSAxXS5zZWxlY3RvcjsKKworICAgICAgICBkcHJpbnRmX21vZHVsZShzdGRkZWIsICJNT0RVTEVfTG9hZDogJS4qcyBpcyBhIHNlbGYtbG9hZGluZyBtb2R1bGUhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAqKChCWVRFKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUgKyAxKTsKKyAgICAgICAgaWYgKCFORV9Mb2FkU2VnbWVudCggcE1vZHVsZSwgMSApKSByZXR1cm4gRkFMU0U7CisgICAgICAgIHNlbGZsb2FkaGVhZGVyID0gKFNFTEZMT0FESEVBREVSICopCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUl9TRUdfT0ZGX1RPX0xJTihwU2VnVGFibGUtPnNlbGVjdG9yLCAwKTsKKyAgICAgICAgc2VsZmxvYWRoZWFkZXItPkVudHJ5QWRkclByb2MgPSBNT0RVTEVfR2V0RW50cnlQb2ludChoc2VsZmxvYWQsMjcpOworICAgICAgICBzZWxmbG9hZGhlYWRlci0+TXlBbGxvYyAgPSBNT0RVTEVfR2V0RW50cnlQb2ludChoc2VsZmxvYWQsMjgpOworICAgICAgICBzZWxmbG9hZGhlYWRlci0+U2V0T3duZXIgPSBNT0RVTEVfR2V0RW50cnlQb2ludChHZXRNb2R1bGVIYW5kbGUxNigiS0VSTkVMIiksNDAzKTsKKyAgICAgICAgcE1vZHVsZS0+c2VsZl9sb2FkaW5nX3NlbCA9IEdsb2JhbEhhbmRsZVRvU2VsKEdMT0JBTF9BbGxvYyhHTUVNX1pFUk9JTklULCAweEZGMDAsIHBNb2R1bGUtPnNlbGYsIEZBTFNFLCBGQUxTRSwgRkFMU0UpKTsKKyAgICAgICAgb2xkc3RhY2sgPSBJRjE2MzJfU2F2ZWQxNl9zc19zcDsKKyAgICAgICAgSUYxNjMyX1NhdmVkMTZfc3Nfc3AgPSBQVFJfU0VHX09GRl9UT19TRUdQVFIocE1vZHVsZS0+c2VsZl9sb2FkaW5nX3NlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYwMCAtIHNpemVvZigqc3RhY2sxNlRvcCkgKTsKKyAgICAgICAgc3RhY2sxNlRvcCA9IENVUlJFTlRfU1RBQ0sxNjsKKyAgICAgICAgc3RhY2sxNlRvcC0+c2F2ZWRfc3Nfc3AgPSAwOworICAgICAgICBzdGFjazE2VG9wLT5lYnAgPSAwOworICAgICAgICBzdGFjazE2VG9wLT5kcyA9IHN0YWNrMTZUb3AtPmVzID0gcE1vZHVsZS0+c2VsZl9sb2FkaW5nX3NlbDsKKyAgICAgICAgc3RhY2sxNlRvcC0+ZW50cnlfcG9pbnQgPSAwOworICAgICAgICBzdGFjazE2VG9wLT5lbnRyeV9pcCA9IDA7CisgICAgICAgIHN0YWNrMTZUb3AtPmVudHJ5X2NzID0gMDsKKyAgICAgICAgc3RhY2sxNlRvcC0+YnAgPSAwOworICAgICAgICBzdGFjazE2VG9wLT5pcCA9IDA7CisgICAgICAgIHN0YWNrMTZUb3AtPmNzID0gMDsKKworICAgICAgICBoZiA9IEZJTEVfRHVwVW5peEhhbmRsZSggTU9EVUxFX09wZW5GaWxlKCBwTW9kdWxlLT5zZWxmICkgKTsKKyAgICAgICAgQ2FsbGJhY2tzLT5DYWxsQm9vdEFwcFByb2Moc2VsZmxvYWRoZWFkZXItPkJvb3RBcHAsIHBNb2R1bGUtPnNlbGYsIGhmKTsKKyAgICAgICAgX2xjbG9zZTMyKGhmKTsKKyAgICAgICAgLyogc29tZSBCb290QXBwIHByb2NzIG92ZXJ3cml0ZSB0aGUgc2VsZWN0b3Igb2YgZGdyb3VwICovCisgICAgICAgIHBTZWdUYWJsZVtwTW9kdWxlLT5kZ3JvdXAgLSAxXS5zZWxlY3RvciA9IHNhdmVkX2Rncm91cDsKKyAgICAgICAgSUYxNjMyX1NhdmVkMTZfc3Nfc3AgPSBvbGRzdGFjazsKKyAgICAgICAgZm9yIChpID0gMjsgaSA8PSBwTW9kdWxlLT5zZWdfY291bnQ7IGkrKykKKyAgICAgICAgICAgIGlmICghTkVfTG9hZFNlZ21lbnQoIHBNb2R1bGUsIGkgKSkgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IHBNb2R1bGUtPnNlZ19jb3VudDsgaSsrKQorICAgICAgICAgICAgaWYgKCFORV9Mb2FkU2VnbWVudCggcE1vZHVsZSwgaSApKSByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE5FX0xvYWRETExzCisgKi8KK0JPT0wzMiBORV9Mb2FkRExMcyggTkVfTU9EVUxFICpwTW9kdWxlICkKK3sKKyAgICBpbnQgaTsKKyAgICBXT1JEICpwTW9kUmVmID0gKFdPUkQgKikoKGNoYXIgKilwTW9kdWxlICsgcE1vZHVsZS0+bW9kcmVmX3RhYmxlKTsKKyAgICBXT1JEICpwRExMcyA9IChXT1JEICopR2xvYmFsTG9jazE2KCBwTW9kdWxlLT5kbGxzX3RvX2luaXQgKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwTW9kdWxlLT5tb2RyZWZfY291bnQ7IGkrKywgcE1vZFJlZisrKQorICAgIHsKKyAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKKyAgICAgICAgQllURSAqcHN0ciA9IChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPmltcG9ydF90YWJsZSArICpwTW9kUmVmOworICAgICAgICBtZW1jcHkoIGJ1ZmZlciwgcHN0ciArIDEsICpwc3RyICk7CisgICAgICAgIHN0cmNweSggYnVmZmVyICsgKnBzdHIsICIuZGxsIiApOworICAgICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiTG9hZGluZyAnJXMnXG4iLCBidWZmZXIgKTsKKyAgICAgICAgaWYgKCEoKnBNb2RSZWYgPSBNT0RVTEVfRmluZE1vZHVsZSggYnVmZmVyICkpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiB0aGUgRExMIGlzIG5vdCBsb2FkZWQgeWV0LCBsb2FkIGl0IGFuZCBzdG9yZSAqLworICAgICAgICAgICAgLyogaXRzIGhhbmRsZSBpbiB0aGUgbGlzdCBvZiBETExzIHRvIGluaXRpYWxpemUuICAgKi8KKyAgICAgICAgICAgIEhNT0RVTEUxNiBoRExMOworCisgICAgICAgICAgICBpZiAoKGhETEwgPSBNT0RVTEVfTG9hZCggYnVmZmVyLCAoTFBWT0lEKS0xLCBORV9GRkxBR1NfSU1QTElDSVQgKSkgPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBmaWxlIG5vdCBmb3VuZCAqLworICAgICAgICAgICAgICAgIGNoYXIgKnA7CisKKyAgICAgICAgICAgICAgICAvKiBUcnkgd2l0aCBwcmVwZW5kaW5nIHRoZSBwYXRoIG9mIHRoZSBjdXJyZW50IG1vZHVsZSAqLworICAgICAgICAgICAgICAgIEdldE1vZHVsZUZpbGVOYW1lMTYoIHBNb2R1bGUtPnNlbGYsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKTsKKyAgICAgICAgICAgICAgICBpZiAoIShwID0gc3RycmNociggYnVmZmVyLCAnXFwnICkpKSBwID0gYnVmZmVyOworICAgICAgICAgICAgICAgIG1lbWNweSggcCArIDEsIHBzdHIgKyAxLCAqcHN0ciApOworICAgICAgICAgICAgICAgIHN0cmNweSggcCArIDEgKyAqcHN0ciwgIi5kbGwiICk7CisgICAgICAgICAgICAgICAgaERMTCA9IE1PRFVMRV9Mb2FkKCBidWZmZXIsIChMUFZPSUQpLTEsIE5FX0ZGTEFHU19JTVBMSUNJVCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhETEwgPCAzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBGSVhNRTogY2xlYW51cCB3aGF0IHdhcyBkb25lICovCisKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDb3VsZCBub3QgbG9hZCAnJXMnIHJlcXVpcmVkIGJ5ICclLipzJywgZXJyb3IgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsICooKEJZVEUqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlICsgMSwgaERMTCApOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwTW9kUmVmID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBoRExMICk7CisgICAgICAgICAgICAqcERMTHMrKyA9ICpwTW9kUmVmOworICAgICAgICB9CisgICAgICAgIGVsc2UgIC8qIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBETEwgKi8KKyAgICAgICAgeworICAgICAgICAgICAgTkVfTU9EVUxFICpwT2xkRExMID0gTU9EVUxFX0dldFB0ciggKnBNb2RSZWYgKTsKKyAgICAgICAgICAgIGlmIChwT2xkRExMKSBwT2xkRExMLT5jb3VudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE5FX0ZpeHVwUHJvbG9ncwogICoKICAqIEZpeHVwIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgcHJvbG9ncy4KZGlmZiAtLWdpdCBhL2xvYWRlci9wZV9pbWFnZS5jIGIvbG9hZGVyL3BlX2ltYWdlLmMKaW5kZXggMDdiMTQ3Yy4uMTdiZDIzMCAxMDA2NDQKLS0tIGEvbG9hZGVyL3BlX2ltYWdlLmMKKysrIGIvbG9hZGVyL3BlX2ltYWdlLmMKQEAgLTM0LDkgKzM0LDYgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgotI2lmbmRlZiBXSU5FTElCCi0jaW5jbHVkZSAiZGVidWdnZXIuaCIKLSNlbmRpZgogCiBzdGF0aWMgdm9pZCBQRV9Jbml0RExMKFBFX01PRFJFRiogbW9kcmVmLCBEV09SRCB0eXBlLCBMUFZPSUQgbHBSZXNlcnZlZCk7CiAKQEAgLTQ5LDcgKzQ2LDcgQEAKICAgaW50CQlpLCBqOwogICB1X3Nob3J0CSpvcmRpbmFsOwogICB1X2xvbmcJKmZ1bmN0aW9uLCpmdW5jdGlvbnM7Ci0gIHVfY2hhcgkqKm5hbWUsKmVuYW1lOworICB1X2NoYXIJKipuYW1lOwogCiAgIE1vZHVsZSA9IChjaGFyKilSVkEocGVfZXhwb3J0cy0+TmFtZSk7CiAgIGRwcmludGZfd2luMzIoc3RkZGViLCJcbioqKioqKipFWFBPUlQgREFUQSoqKioqKipcbk1vZHVsZSBuYW1lIGlzICVzLCAlbGQgZnVuY3Rpb25zLCAlbGQgbmFtZXNcbiIsIApAQCAtNjUsNyArNjIsNyBAQAogICBmb3IgKGk9MDtpPHBlX2V4cG9ydHMtPk51bWJlck9mRnVuY3Rpb25zO2krKywgZnVuY3Rpb24rKykKICAgewogICAgICAgaWYgKCEqZnVuY3Rpb24pIGNvbnRpbnVlOyAgLyogTm8gc3VjaCBmdW5jdGlvbiAqLwotICAgICAgZHByaW50Zl93aW4zMiggc3RkZGViLCIlNGQgICUwOGx4IiwgaSArIHBlX2V4cG9ydHMtPkJhc2UsICpmdW5jdGlvbiApOworICAgICAgZHByaW50Zl93aW4zMiggc3RkZGViLCIlNGxkICAlMDhseCIsIGkgKyBwZV9leHBvcnRzLT5CYXNlLCAqZnVuY3Rpb24gKTsKICAgICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYSBuYW1lIGZvciBpdCAqLwogICAgICAgZm9yIChqID0gMDsgaiA8IHBlX2V4cG9ydHMtPk51bWJlck9mTmFtZXM7IGorKykKICAgICAgICAgICBpZiAob3JkaW5hbFtqXSA9PSBpKQpAQCAtNTg0LDE2ICs1ODEsNiBAQAogCQlwZW0tPnBlX3JlbG9jID0gKHZvaWQgKikgUlZBKGRpci5WaXJ0dWFsQWRkcmVzcyk7CiAJfQogCi0jaWZuZGVmIFdJTkVMSUIKLQlpZihwZS0+cGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5Ci0JCVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfREVCVUddLlNpemUpCi0JICB7Ci0JICAgIERFQlVHX1JlZ2lzdGVyRGVidWdJbmZvKHBlLCBsb2FkX2FkZHIsIAotCQkJcGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfREVCVUddLlZpcnR1YWxBZGRyZXNzLAotCQkJcGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfREVCVUddLlNpemUpOwotCSAgfQotI2VuZGlmCi0KIAlpZihwZS0+cGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5CiAJCVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfQ09QWVJJR0hUXS5TaXplKQogCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIkNvcHlyaWdodCBzdHJpbmcgaWdub3JlZFxuIik7CkBAIC02NjcsMjAgKzY1NCwxNyBAQAogCQlwTW9kdWxlID0gTU9EVUxFX0dldFB0cihoTW9kdWxlKTsKIAl9IGVsc2UgewogCi0jaWZuZGVmIFdJTkVMSUIKIAkJLyogdHJ5IHRvIGxvYWQgYnVpbHRpbiwgZW5hYmxlZCBtb2R1bGVzIGZpcnN0ICovCiAJCWlmICgoaE1vZHVsZSA9IEJVSUxUSU5fTG9hZE1vZHVsZSggbmFtZSwgRkFMU0UgKSkpCiAJCQlyZXR1cm4gaE1vZHVsZTsKLSNlbmRpZgorCiAJCS8qIHRyeSB0byBvcGVuIHRoZSBzcGVjaWZpZWQgZmlsZSAqLwogCQlpZiAoSEZJTEVfRVJST1IzMj09KGhGaWxlPU9wZW5GaWxlMzIobmFtZSwmb2ZzLE9GX1JFQUQpKSkgewotI2lmbmRlZiBXSU5FTElCCiAJCQkvKiBOb3cgdHJ5IHRoZSBidWlsdC1pbiBldmVuIGlmIGRpc2FibGVkICovCiAJCQlpZiAoKGhNb2R1bGUgPSBCVUlMVElOX0xvYWRNb2R1bGUoIG5hbWUsIFRSVUUgKSkpIHsKIAkJCQlmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBjb3VsZCBub3QgbG9hZCBXaW5kb3dzIERMTCAnJXMnLCB1c2luZyBidWlsdC1pbiBtb2R1bGUuXG4iLCBuYW1lICk7CiAJCQkJcmV0dXJuIGhNb2R1bGU7CiAJCQl9Ci0jZW5kaWYKIAkJCXJldHVybiAxOwogCQl9CiAJCWlmICgoaE1vZHVsZSA9IE1PRFVMRV9DcmVhdGVEdW1teU1vZHVsZSggJm9mcyApKSA8IDMyKSB7CmRpZmYgLS1naXQgYS9sb2FkZXIvcmVzb3VyY2UuYyBiL2xvYWRlci9yZXNvdXJjZS5jCmluZGV4IGZlZTVjZmEuLjAwMTdmYTcgMTAwNjQ0Ci0tLSBhL2xvYWRlci9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9yZXNvdXJjZS5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCiAjaW5jbHVkZSAidGFzay5oIgotI2luY2x1ZGUgImFjY2VsLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAicmVzb3VyY2UuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgpAQCAtNjMsMTQgKzYyLDE2IEBACiAKICAgICBpZiAoKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKQogICAgIHsKLSNpZm5kZWYgV0lORUxJQgotCWlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikKLQkgICAgZnByaW50ZihzdGRlcnIsIkZpbmRSZXNvdXJjZTE2OiAlcyIsIE5FV2luMzJGYWlsdXJlU3RyaW5nKTsKLQllbHNlCi0JICAgIHJldHVybiBORV9GaW5kUmVzb3VyY2UoIGhNb2R1bGUsIHR5cGUsIG5hbWUgKTsKLSNlbHNlCi0JcmV0dXJuIExJQlJFU19GaW5kUmVzb3VyY2UxNiggaE1vZHVsZSwgbmFtZSwgdHlwZSApOwotI2VuZGlmCisgICAgICAgIGlmICghX193aW5lbGliKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkZpbmRSZXNvdXJjZTE2OiAlcyIsIE5FV2luMzJGYWlsdXJlU3RyaW5nKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gTkVfRmluZFJlc291cmNlKCBoTW9kdWxlLCB0eXBlLCBuYW1lICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSByZXR1cm4gTElCUkVTX0ZpbmRSZXNvdXJjZTE2KCBoTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUENTVFIpUFRSX1NFR19UT19MSU4obmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQ1NUUilQVFJfU0VHX1RPX0xJTih0eXBlKSApOwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KQEAgLTExNCwyOCArMTE1LDI5IEBACiBIUlNSQzMyIFdJTkFQSSBGaW5kUmVzb3VyY2VFeDMyVyggSElOU1RBTkNFMzIgaE1vZHVsZSwgTFBDV1NUUiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgdHlwZSwgV09SRCBsYW5nICkKIHsKLSNpZm5kZWYgV0lORUxJQgotICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKKyAgICBpZiAoIV9fd2luZWxpYikKKyAgICB7CisgICAgICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKIAotICAgIGlmICghaE1vZHVsZSkgaE1vZHVsZSA9IEdldFRhc2tEUygpOwotICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMzIoIGhNb2R1bGUgKTsKLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkZpbmRSZXNvdXJjZTMyVzogbW9kdWxlPSUwOHggdHlwZT0iLCBoTW9kdWxlICk7Ci0gICAgaWYgKEhJV09SRCh0eXBlKSkKLSAgICAJZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsIiVwIix0eXBlKTsKLSAgICBlbHNlCi0JZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsIiMlcCIsdHlwZSk7Ci0gICAgZHByaW50Zl9yZXNvdXJjZSggc3RkZGViLCAiIG5hbWU9IiApOwotICAgIGlmIChISVdPUkQobmFtZSkpCi0gICAgCWRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCIlcCIsbmFtZSk7Ci0gICAgZWxzZQotCWRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCIjJXAiLG5hbWUpOwotICAgIGRwcmludGZfcmVzb3VyY2UoIHN0ZGRlYiwgIlxuIiApOwotICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKLSAgICBpZiAoIShwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikpIHJldHVybiAwOwotICAgIHJldHVybiBQRV9GaW5kUmVzb3VyY2VFeDMyVyhoTW9kdWxlLG5hbWUsdHlwZSxsYW5nKTsKLSNlbHNlCi0gICAgcmV0dXJuIExJQlJFU19GaW5kUmVzb3VyY2UzMiggaE1vZHVsZSwgbmFtZSwgdHlwZSApOwotI2VuZGlmCisgICAgICAgIGlmICghaE1vZHVsZSkgaE1vZHVsZSA9IEdldFRhc2tEUygpOworICAgICAgICBoTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTMyKCBoTW9kdWxlICk7CisgICAgICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCAiRmluZFJlc291cmNlMzJXOiBtb2R1bGU9JTA4eCB0eXBlPSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSApOworICAgICAgICBpZiAoSElXT1JEKHR5cGUpKQorICAgICAgICAgICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsIiVwIix0eXBlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsIiMlcCIsdHlwZSk7CisgICAgICAgIGRwcmludGZfcmVzb3VyY2UoIHN0ZGRlYiwgIiBuYW1lPSIgKTsKKyAgICAgICAgaWYgKEhJV09SRChuYW1lKSkKKyAgICAgICAgICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCIlcCIsbmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCIjJXAiLG5hbWUpOworICAgICAgICBkcHJpbnRmX3Jlc291cmNlKCBzdGRkZWIsICJcbiIgKTsKKyAgICAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOworICAgICAgICBpZiAoIShwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikpIHJldHVybiAwOworICAgICAgICByZXR1cm4gUEVfRmluZFJlc291cmNlRXgzMlcoaE1vZHVsZSxuYW1lLHR5cGUsbGFuZyk7CisgICAgfQorICAgIGVsc2UgcmV0dXJuIExJQlJFU19GaW5kUmVzb3VyY2UzMiggaE1vZHVsZSwgbmFtZSwgdHlwZSApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTYwLDE0ICsxNjIsMTQgQEAKICAgICBpZiAoIWhSc3JjKSByZXR1cm4gMDsKICAgICBpZiAoKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKQogICAgIHsKLSNpZm5kZWYgV0lORUxJQgotCWlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikKLQkgICAgZnByaW50ZihzdGRlcnIsIkxvYWRSZXNvdXJjZTE2OiAlcyIsIE5FV2luMzJGYWlsdXJlU3RyaW5nKTsKLQllbHNlCi0JICAgIHJldHVybiBORV9Mb2FkUmVzb3VyY2UoIGhNb2R1bGUsIGhSc3JjICk7Ci0jZWxzZQotCXJldHVybiBMSUJSRVNfTG9hZFJlc291cmNlKCBoTW9kdWxlLCBoUnNyYyApOwotI2VuZGlmCisgICAgICAgIGlmICghX193aW5lbGliKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkxvYWRSZXNvdXJjZTE2OiAlcyIsIE5FV2luMzJGYWlsdXJlU3RyaW5nKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gTkVfTG9hZFJlc291cmNlKCBoTW9kdWxlLCBoUnNyYyApOworICAgICAgICB9CisgICAgICAgIGVsc2UgcmV0dXJuIExJQlJFU19Mb2FkUmVzb3VyY2UoIGhNb2R1bGUsIGhSc3JjICk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtMTc3LDI1ICsxNzksMjUgQEAKICAqLwogSEdMT0JBTDMyIFdJTkFQSSBMb2FkUmVzb3VyY2UzMiggSElOU1RBTkNFMzIgaE1vZHVsZSwgSFJTUkMzMiBoUnNyYyApCiB7Ci0jaWZuZGVmIFdJTkVMSUIKLSAgICBORV9NT0RVTEUgKnBNb2R1bGU7Ci0KLSAgICBpZiAoIWhNb2R1bGUpIGhNb2R1bGUgPSBHZXRUYXNrRFMoKTsgLyogRklYTUU6IHNlZSBGaW5kUmVzb3VyY2UzMlcgKi8KLSAgICBoTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTMyKCBoTW9kdWxlICk7Ci0gICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJMb2FkUmVzb3VyY2UzMjogbW9kdWxlPSUwNHggcmVzPSUwNHhcbiIsCi0gICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBoUnNyYyApOwotICAgIGlmICghaFJzcmMpIHJldHVybiAwOwotCi0gICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOwotICAgIGlmICghKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKSkKKyAgICBpZiAoIV9fd2luZWxpYikKICAgICB7Ci0gICAgCWZwcmludGYoc3RkZXJyLCJMb2FkUmVzb3VyY2UzMjogJXMiLCBQRVdpbjE2RmFpbHVyZVN0cmluZyApOwotICAgCXJldHVybiAwOyAgLyogRklYTUU/ICovCisgICAgICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKKworICAgICAgICBpZiAoIWhNb2R1bGUpIGhNb2R1bGUgPSBHZXRUYXNrRFMoKTsgLyogRklYTUU6IHNlZSBGaW5kUmVzb3VyY2UzMlcgKi8KKyAgICAgICAgaE1vZHVsZSA9IE1PRFVMRV9IQU5ETEV0b0hNT0RVTEUzMiggaE1vZHVsZSApOworICAgICAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkxvYWRSZXNvdXJjZTMyOiBtb2R1bGU9JTA0eCByZXM9JTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBoUnNyYyApOworICAgICAgICBpZiAoIWhSc3JjKSByZXR1cm4gMDsKKworICAgICAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuIDA7CisgICAgICAgIGlmICghKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKSkKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkxvYWRSZXNvdXJjZTMyOiAlcyIsIFBFV2luMTZGYWlsdXJlU3RyaW5nICk7CisgICAgICAgICAgICByZXR1cm4gMDsgIC8qIEZJWE1FPyAqLworICAgICAgICB9CisgICAgICAgIHJldHVybiBQRV9Mb2FkUmVzb3VyY2UzMihoTW9kdWxlLGhSc3JjKTsKICAgICB9Ci0gICAgcmV0dXJuIFBFX0xvYWRSZXNvdXJjZTMyKGhNb2R1bGUsaFJzcmMpOwotI2Vsc2UKLSAgICByZXR1cm4gTElCUkVTX0xvYWRSZXNvdXJjZSggaE1vZHVsZSwgaFJzcmMgKTsKLSNlbmRpZgorICAgIGVsc2UgcmV0dXJuIExJQlJFU19Mb2FkUmVzb3VyY2UoIGhNb2R1bGUsIGhSc3JjICk7CiB9CiAKIApAQCAtMjA1LDcgKzIwNyw2IEBACiAvKiAxNi1iaXQgdmVyc2lvbiAqLwogU0VHUFRSIFdJTkFQSSBXSU4xNl9Mb2NrUmVzb3VyY2UxNihIR0xPQkFMMTYgaGFuZGxlKQogewotI2lmbmRlZiBXSU5FTElCCiAgICAgSE1PRFVMRTE2IGhNb2R1bGU7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogCkBAIC0yMTksMzEgKzIyMCwyOCBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcmV0dXJuIE5FX0xvY2tSZXNvdXJjZSggaE1vZHVsZSwgaGFuZGxlICk7Ci0jZWxzZQotICAgIHJldHVybiBMSUJSRVNfTG9ja1Jlc291cmNlKCBoYW5kbGUgKTsKLSNlbmRpZgogfQogCi0vKiBXSU5FTElCIDE2LWJpdCB2ZXJzaW9uICovCisvKiBXaW5lbGliIDE2LWJpdCB2ZXJzaW9uICovCiBMUFZPSUQgV0lOQVBJIExvY2tSZXNvdXJjZTE2KCBIR0xPQkFMMTYgaGFuZGxlICkKIHsKLSNpZm5kZWYgV0lORUxJQgotICAgIEhNT0RVTEUxNiBoTW9kdWxlOwotICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKLQotICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCAiTG9ja1Jlc291cmNlOiBoYW5kbGU9JTA0eFxuIiwgaGFuZGxlICk7Ci0gICAgaWYgKCFoYW5kbGUpIHJldHVybiBOVUxMOwotICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoIGhhbmRsZSApOwotICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKLSAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpCisgICAgaWYgKCFfX3dpbmVsaWIpCiAgICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTG9ja1Jlc291cmNlMTY6ICVzIiwgTkVXaW4zMkZhaWx1cmVTdHJpbmcpOwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgSE1PRFVMRTE2IGhNb2R1bGU7CisgICAgICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKKworICAgICAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkxvY2tSZXNvdXJjZTogaGFuZGxlPSUwNHhcbiIsIGhhbmRsZSApOworICAgICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIE5VTEw7CisgICAgICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoIGhhbmRsZSApOworICAgICAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuIDA7CisgICAgICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkxvY2tSZXNvdXJjZTE2OiAlcyIsIE5FV2luMzJGYWlsdXJlU3RyaW5nKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoTFBTVFIpUFRSX1NFR19UT19MSU4oIE5FX0xvY2tSZXNvdXJjZSggaE1vZHVsZSwgaGFuZGxlICkgKTsKICAgICB9Ci0gICAgcmV0dXJuIChMUFNUUilQVFJfU0VHX1RPX0xJTiggTkVfTG9ja1Jlc291cmNlKCBoTW9kdWxlLCBoYW5kbGUgKSApOwotI2Vsc2UKLSAgICByZXR1cm4gTElCUkVTX0xvY2tSZXNvdXJjZSggaGFuZGxlICk7Ci0jZW5kaWYKKyAgICBlbHNlIHJldHVybiBMSUJSRVNfTG9ja1Jlc291cmNlKCBoYW5kbGUgKTsKIH0KIAogCkBAIC0yNjEsMjMgKzI1OSwyMyBAQAogICovCiBCT09MMTYgV0lOQVBJIEZyZWVSZXNvdXJjZTE2KCBIR0xPQkFMMTYgaGFuZGxlICkKIHsKLSNpZm5kZWYgV0lORUxJQgotICAgIEhNT0RVTEUxNiBoTW9kdWxlOwotICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKLQotICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCAiRnJlZVJlc291cmNlMTY6IGhhbmRsZT0lMDR4XG4iLCBoYW5kbGUgKTsKLSAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIEZBTFNFOwotICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoIGhhbmRsZSApOwotICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKLSAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpCisgICAgaWYgKCFfX3dpbmVsaWIpCiAgICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRnJlZVJlc291cmNlMTY6ICVzIiwgTkVXaW4zMkZhaWx1cmVTdHJpbmcpOwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgSE1PRFVMRTE2IGhNb2R1bGU7CisgICAgICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKKworICAgICAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkZyZWVSZXNvdXJjZTE2OiBoYW5kbGU9JTA0eFxuIiwgaGFuZGxlICk7CisgICAgICAgIGlmICghaGFuZGxlKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoIGhhbmRsZSApOworICAgICAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuIDA7CisgICAgICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkZyZWVSZXNvdXJjZTE2OiAlcyIsIE5FV2luMzJGYWlsdXJlU3RyaW5nKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBORV9GcmVlUmVzb3VyY2UoIGhNb2R1bGUsIGhhbmRsZSApOwogICAgIH0KLSAgICByZXR1cm4gTkVfRnJlZVJlc291cmNlKCBoTW9kdWxlLCBoYW5kbGUgKTsKLSNlbHNlCi0gICAgcmV0dXJuIExJQlJFU19GcmVlUmVzb3VyY2UoIGhhbmRsZSApOwotI2VuZGlmCisgICAgZWxzZSByZXR1cm4gTElCUkVTX0ZyZWVSZXNvdXJjZSggaGFuZGxlICk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMDIsMTYgKzMwMCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgaFJzcmMgKTsKICAgICBpZiAoIWhSc3JjKSByZXR1cm4gMDsKICAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuIDA7Ci0jaWZuZGVmIFdJTkVMSUIKLSAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpCisgICAgaWYgKCFfX3dpbmVsaWIpCiAgICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiQWNjZXNzUmVzb3VyY2UxNjogJXMiLCBORVdpbjMyRmFpbHVyZVN0cmluZyk7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJBY2Nlc3NSZXNvdXJjZTE2OiAlcyIsIE5FV2luMzJGYWlsdXJlU3RyaW5nKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBORV9BY2Nlc3NSZXNvdXJjZSggaE1vZHVsZSwgaFJzcmMgKTsKICAgICB9Ci0gICAgcmV0dXJuIE5FX0FjY2Vzc1Jlc291cmNlKCBoTW9kdWxlLCBoUnNyYyApOwotI2Vsc2UKLSAgICByZXR1cm4gTElCUkVTX0FjY2Vzc1Jlc291cmNlKCBoTW9kdWxlLCBoUnNyYyApOwotI2VuZGlmCisgICAgZWxzZSByZXR1cm4gTElCUkVTX0FjY2Vzc1Jlc291cmNlKCBoTW9kdWxlLCBoUnNyYyApOwogfQogCiAKQEAgLTM0MCwxNiArMzM4LDE2IEBACiAgICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJTaXplb2ZSZXNvdXJjZTE2OiBtb2R1bGU9JTA0eCByZXM9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIGhSc3JjICk7CiAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOwotI2lmbmRlZiBXSU5FTElCCi0gICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKQorICAgIGlmICghX193aW5lbGliKQogICAgIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIlNpemVPZlJlc291cmNlMTY6ICVzIiwgTkVXaW4zMkZhaWx1cmVTdHJpbmcpOwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiU2l6ZU9mUmVzb3VyY2UxNjogJXMiLCBORVdpbjMyRmFpbHVyZVN0cmluZyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTkVfU2l6ZW9mUmVzb3VyY2UoIGhNb2R1bGUsIGhSc3JjICk7CiAgICAgfQotICAgIHJldHVybiBORV9TaXplb2ZSZXNvdXJjZSggaE1vZHVsZSwgaFJzcmMgKTsKLSNlbHNlCi0gICAgcmV0dXJuIExJQlJFU19TaXplb2ZSZXNvdXJjZSggaE1vZHVsZSwgaFJzcmMgKTsKLSNlbmRpZgorICAgIGVsc2UgcmV0dXJuIExJQlJFU19TaXplb2ZSZXNvdXJjZSggaE1vZHVsZSwgaFJzcmMgKTsKIH0KIAogCkBAIC0zNjEsMTIgKzM1OSwxMiBAQAogICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMzIoIGhNb2R1bGUgKTsKICAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIlNpemVvZlJlc291cmNlMzI6IG1vZHVsZT0lMDR4IHJlcz0lMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgaFJzcmMgKTsKLSNpZm5kZWYgV0lORUxJQgotICAgIHJldHVybiBQRV9TaXplb2ZSZXNvdXJjZTMyKGhNb2R1bGUsaFJzcmMpOwotI2Vsc2UKLSAgICBmcHJpbnRmKHN0ZGVyciwiU2l6ZW9mUmVzb3VyY2UzMjogbm90IGltcGxlbWVudGVkXG4iKTsKLSAgICByZXR1cm4gMDsKLSNlbmRpZgorICAgIGlmICghX193aW5lbGliKSByZXR1cm4gUEVfU2l6ZW9mUmVzb3VyY2UzMihoTW9kdWxlLGhSc3JjKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiU2l6ZW9mUmVzb3VyY2UzMjogbm90IGltcGxlbWVudGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogfQogCiAKQEAgLTM4MiwxNiArMzgwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBoUnNyYywgc2l6ZSApOwogICAgIGlmICghaFJzcmMpIHJldHVybiAwOwogICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKLSNpZm5kZWYgV0lORUxJQgotICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikKKyAgICBpZiAoIV9fd2luZWxpYikKICAgICB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCJBbGxvY1Jlc291cmNlMTY6ICVzIiwgTkVXaW4zMkZhaWx1cmVTdHJpbmcpOwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiQWxsb2NSZXNvdXJjZTE2OiAlcyIsIE5FV2luMzJGYWlsdXJlU3RyaW5nKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBORV9BbGxvY1Jlc291cmNlKCBoTW9kdWxlLCBoUnNyYywgc2l6ZSApOwogICAgIH0KLSAgICByZXR1cm4gTkVfQWxsb2NSZXNvdXJjZSggaE1vZHVsZSwgaFJzcmMsIHNpemUgKTsKLSNlbHNlCi0gICAgcmV0dXJuIExJQlJFU19BbGxvY1Jlc291cmNlKCBoTW9kdWxlLCBoUnNyYywgc2l6ZSApOwotI2VuZGlmCisgICAgZWxzZSByZXR1cm4gTElCUkVTX0FsbG9jUmVzb3VyY2UoIGhNb2R1bGUsIGhSc3JjLCBzaXplICk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00NzEsOCArNDY5LDM0IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIENvcHlBY2NlbGVyYXRvclRhYmxlMzJBICAgKFVTRVIzMi41OCkKKyAqLworSU5UMzIgV0lOQVBJIENvcHlBY2NlbGVyYXRvclRhYmxlMzJBKEhBQ0NFTDMyIHNyYywgTFBBQ0NFTDMyIGRzdCwgSU5UMzIgZW50cmllcykKK3sKKyAgZnByaW50ZihzdGRlcnIsIkNvcHlBY2NlbGVyYXRvclRhYmxlMzJBOiBub3QgaW1wbGVtZW50ZWQ6ICVkXG4iLCBlbnRyaWVzKTsKKyAgcmV0dXJuIDA7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBDb3B5QWNjZWxlcmF0b3JUYWJsZTMyVyAgIChVU0VSMzIuNTkpCisgKi8KK0lOVDMyIFdJTkFQSSBDb3B5QWNjZWxlcmF0b3JUYWJsZTMyVyhIQUNDRUwzMiBzcmMsIExQQUNDRUwzMiBkc3QsIElOVDMyIGVudHJpZXMpCit7CisgIGZwcmludGYoc3RkZXJyLCJDb3B5QWNjZWxlcmF0b3JUYWJsZTMyVzogbm90IGltcGxlbWVudGVkOiAlZFxuIiwgZW50cmllcyk7CisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgRGVzdHJveUFjY2VsZXJhdG9yVGFibGUgICAoVVNFUjMyLjEzMCkKKyAqLworQk9PTDMyIFdJTkFQSSBEZXN0cm95QWNjZWxlcmF0b3JUYWJsZSggSEFDQ0VMMzIgaGFuZGxlICkKK3sKKyAgZnByaW50ZihzdGRlcnIsIkRlc3Ryb3lBY2NlbGVyYXRvclRhYmxlOiBub3QgaW1wbGVtZW50ZWRcbiIpOworICByZXR1cm4gVFJVRTsKK30KKyAgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJCUxvYWRTdHJpbmcxNgogICovCiBJTlQxNiBXSU5BUEkgTG9hZFN0cmluZzE2KCBISU5TVEFOQ0UxNiBpbnN0YW5jZSwgVUlOVDE2IHJlc291cmNlX2lkLApkaWZmIC0tZ2l0IGEvbG9hZGVyL3Rhc2suYyBiL2xvYWRlci90YXNrLmMKaW5kZXggYjBjNDRjYS4uNGM1ZDUxZiAxMDA2NDQKLS0tIGEvbG9hZGVyL3Rhc2suYworKysgYi9sb2FkZXIvdGFzay5jCkBAIC02NSw5ICs2NSw3IEBACiAgICAgaWYgKCEoaERPU0Vudmlyb25tZW50ID0gVEFTS19DcmVhdGVET1NFbnZpcm9ubWVudCgpKSkKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIERPUyBFbnZpcm9ubWVudFxuIiApOwogICAgIFRBU0tfU3lzdGVtVEhEQi50ZWJfc2VsID0gU0VMRUNUT1JfQWxsb2NCbG9jayggJlRBU0tfU3lzdGVtVEhEQiwgMHgxMDAwLCBTRUdNRU5UX0RBVEEsIFRSVUUsIEZBTFNFICk7Ci0jaWZkZWYgX19pMzg2X18KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92dyAldzAsJSVmcyI6OiJyIihUQVNLX1N5c3RlbVRIREIudGViX3NlbCkpOwotI2VuZGlmCisgICAgU0VUX0ZTKCBUQVNLX1N5c3RlbVRIREIudGViX3NlbCApOwogICAgIHJldHVybiAoaERPU0Vudmlyb25tZW50ICE9IDApOwogfQogCkBAIC0zMzQsNyArMzMyLDYgQEAKICAqIDMyLWJpdCBlbnRyeSBwb2ludCBmb3IgYSBuZXcgdGFzay4gVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IKICAqIHNldHRpbmcgdXAgdGhlIHJlZ2lzdGVycyBhbmQganVtcGluZyB0byB0aGUgMTYtYml0IGVudHJ5IHBvaW50LgogICovCi0jaWZuZGVmIFdJTkVMSUIKIHN0YXRpYyB2b2lkIFRBU0tfQ2FsbFRvU3RhcnQodm9pZCkKIHsKICAgICBpbnQgZXhpdF9jb2RlID0gMTsKQEAgLTM1NCw5ICszNTEsNyBAQAogCiAgICAgICAgIEluaXRUYXNrKCBOVUxMICk7CiAgICAgICAgIEluaXRBcHAoIHBUYXNrLT5oTW9kdWxlICk7Ci0jaWZkZWYgX19pMzg2X18KLSAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdncgJXcwLCUlZnMiOjoiciIgKHBDdXJyZW50VGhyZWFkLT50ZWJfc2VsKSk7Ci0jZW5kaWYKKyAgICAgICAgU0VUX0ZTKCBwQ3VycmVudFRocmVhZC0+dGViX3NlbCApOwogICAgICAgICBQRV9Jbml0aWFsaXplRExMcyggcEN1cnJlbnRQcm9jZXNzLCBETExfUFJPQ0VTU19BVFRBQ0gsIChMUFZPSUQpLTEgKTsKICAgICAgICAgZHByaW50Zl9yZWxheSggc3RkZGViLCAiQ2FsbFRvMzIoZW50cnlwcm9jPSVwKVxuIiwgZW50cnkgKTsKICAgICAgICAgZXhpdF9jb2RlID0gZW50cnkoKTsKQEAgLTM5OCw3ICszOTMsNiBAQAogICAgICAgICBUQVNLX0tpbGxDdXJyZW50VGFzayggMSApOwogICAgIH0KIH0KLSNlbmRpZgogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDE1LDEzICs0MDksMTAgQEAKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAgICAgU0VHVEFCTEVFTlRSWSAqcFNlZ1RhYmxlOwogICAgIExQU1RSIG5hbWU7CisgICAgV09SRCBzcDsKICAgICBjaGFyICpzdGFjazMyVG9wOwogICAgIFNUQUNLMTZGUkFNRSAqZnJhbWUxNjsKICAgICBTVEFDSzMyRlJBTUUgKmZyYW1lMzI7Ci0jaWZuZGVmIFdJTkVMSUIKLSAgICBleHRlcm4gRFdPUkQgQ0FMTFRPMTZfUmV0QWRkcl9yZWdzOwotICAgIGV4dGVybiB2b2lkIENBTExUTzE2X1Jlc3RvcmUoKTsKLSNlbmRpZgogICAgIAogICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKICAgICBwU2VnVGFibGUgPSBORV9TRUdfVEFCTEUoIHBNb2R1bGUgKTsKQEAgLTQ4OSwxMCArNDgwLDggQEAKIAogICAgIHBUYXNrLT5wZGIuaW50MjAgPSAweDIwY2Q7CiAgICAgcFRhc2stPnBkYi5kaXNwYXRjaGVyWzBdID0gMHg5YTsgIC8qIGxqbXAgKi8KLSNpZm5kZWYgV0lORUxJQgotICAgICooRkFSUFJPQzE2ICopJnBUYXNrLT5wZGIuZGlzcGF0Y2hlclsxXSA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KAotICAgICAgICAgICAgR2V0TW9kdWxlSGFuZGxlMTYoIktFUk5FTCIpLCAxMDIgKTsgIC8qIEtFUk5FTC4xMDIgaXMgRE9TM0NhbGwoKSAqLwotI2VuZGlmCisgICAgUFVUX0RXT1JEKCZwVGFzay0+cGRiLmRpc3BhdGNoZXJbMV0sIChEV09SRClNT0RVTEVfR2V0RW50cnlQb2ludCgKKyAgICAgICAgICAgR2V0TW9kdWxlSGFuZGxlMTYoIktFUk5FTCIpLCAxMDIgKSk7ICAvKiBLRVJORUwuMTAyIGlzIERPUzNDYWxsKCkgKi8KICAgICBwVGFzay0+cGRiLnNhdmVkaW50MjIgPSBJTlRfR2V0SGFuZGxlciggMHgyMiApOwogICAgIHBUYXNrLT5wZGIuc2F2ZWRpbnQyMyA9IElOVF9HZXRIYW5kbGVyKCAweDIzICk7CiAgICAgcFRhc2stPnBkYi5zYXZlZGludDI0ID0gSU5UX0dldEhhbmRsZXIoIDB4MjQgKTsKQEAgLTUzOCwxMSArNTI3LDkgQEAKIAkJcEN1cnJlbnRQcm9jZXNzLT5leGVfbW9kcmVmLT5wZV9tb2R1bGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuQWRkcmVzc09mRW50cnlQb2ludCk7CiAgICAgICovCiAgICAgICAgIHBUYXNrLT50aGRiID0gVEhSRUFEX0NyZWF0ZSggcGRiMzIsIDAsIDAgKTsKLSNpZm5kZWYgV0lORUxJQgogICAgICAgICAvKiBGSVhNRTogc2hvdWxkIG5vdCBiZSBkb25lIGhlcmUgKi8KICAgICAgICAgcEN1cnJlbnRUaHJlYWQgPSBwVGFzay0+dGhkYjsKICAgICAgICAgUEVfSW5pdFRscyggcGRiMzIgKTsKLSNlbmRpZgogICAgIH0KICAgICBlbHNlCiAgICAgICAgIHBUYXNrLT50aGRiID0gVEhSRUFEX0NyZWF0ZSggcGRiMzIsIDAsIE5VTEwgKTsKQEAgLTU1OCwzMiArNTQ1LDI2IEBACiAgICAgZnJhbWUzMi0+ZWR4ID0gMDsKICAgICBmcmFtZTMyLT5lY3ggPSAwOwogICAgIGZyYW1lMzItPmVieCA9IDA7Ci0gICAgZnJhbWUzMi0+ZWJwID0gMDsKLSNpZm5kZWYgV0lORUxJQgotICAgIGZyYW1lMzItPnJlc3RvcmVfYWRkciA9IChEV09SRClDQUxMVE8xNl9SZXN0b3JlOwogICAgIGZyYW1lMzItPnJldGFkZHIgPSAoRFdPUkQpVEFTS19DYWxsVG9TdGFydDsKLSAgICBmcmFtZTMyLT5jb2Rlc2VsZWN0b3IgPSBXSU5FX0NPREVfU0VMRUNUT1I7Ci0jZW5kaWYKKyAgICAvKiBUaGUgcmVtYWluaW5nIGZpZWxkcyB3aWxsIGJlIGluaXRpYWxpemVkIGluIFRBU0tfUmVzY2hlZHVsZSAqLwogCiAgICAgLyogQ3JlYXRlIHRoZSAxNi1iaXQgc3RhY2sgZnJhbWUgKi8KIAotICAgIHBUYXNrLT5zc19zcCA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgKChwTW9kdWxlLT5zcCAhPSAwKSA/IHBNb2R1bGUtPnNwIDoKLSAgICAgICAgICAgICAgICBwU2VnVGFibGVbcE1vZHVsZS0+c3MtMV0ubWluc2l6ZSArIHBNb2R1bGUtPnN0YWNrX3NpemUpICYgfjEgKTsKLSAgICBwVGFzay0+c3Nfc3AgLT0gc2l6ZW9mKFNUQUNLMTZGUkFNRSkgLSBzaXplb2YoRFdPUkQpIC8qIGZvciBzYXZlZCAlZXNwICovOworICAgIGlmICghKHNwID0gcE1vZHVsZS0+c3ApKQorICAgICAgICBzcCA9IHBTZWdUYWJsZVtwTW9kdWxlLT5zcy0xXS5taW5zaXplICsgcE1vZHVsZS0+c3RhY2tfc2l6ZTsKKyAgICBzcCAmPSB+MTsKKyAgICBwVGFzay0+c3Nfc3AgPSBQVFJfU0VHX09GRl9UT19TRUdQVFIoIGhJbnN0YW5jZSwgc3AgKTsKKyAgICBwVGFzay0+c3Nfc3AgLT0gc2l6ZW9mKFNUQUNLMTZGUkFNRSkgKyBzaXplb2YoRFdPUkQpIC8qIGZvciBzYXZlZCAlZXNwICovOwogICAgIGZyYW1lMTYgPSAoU1RBQ0sxNkZSQU1FICopUFRSX1NFR19UT19MSU4oIHBUYXNrLT5zc19zcCApOwogICAgIGZyYW1lMTYtPnNhdmVkX3NzX3NwID0gMDsKLSAgICBmcmFtZTE2LT5lYnAgPSAwOworICAgIGZyYW1lMTYtPmVicCA9IHNwICsgKGludCkmKChTVEFDSzE2RlJBTUUgKikwKS0+YnA7CisgICAgZnJhbWUxNi0+YnAgPSBMT1dPUkQoZnJhbWUxNi0+ZWJwKTsKICAgICBmcmFtZTE2LT5kcyA9IGZyYW1lMTYtPmVzID0gcFRhc2stPmhJbnN0YW5jZTsKICAgICBmcmFtZTE2LT5lbnRyeV9wb2ludCA9IDA7Ci0gICAgZnJhbWUxNi0+ZW50cnlfaXAgPSAwOwogICAgIGZyYW1lMTYtPmVudHJ5X2NzID0gMDsKLSAgICBmcmFtZTE2LT5icCA9IDA7CisgICAgLyogVGhlIHJlbWFpbmluZyBmaWVsZHMgd2lsbCBiZSBpbml0aWFsaXplZCBpbiBUQVNLX1Jlc2NoZWR1bGUgKi8KKwogICAgICooU1RBQ0szMkZSQU1FICoqKShmcmFtZTE2ICsgMSkgPSBmcmFtZTMyOyAvKiBTdG9yZSB0aGUgMzItYml0ICVlc3AgKi8KLSNpZm5kZWYgV0lORUxJQgotICAgIGZyYW1lMTYtPmlwID0gTE9XT1JEKCBDQUxMVE8xNl9SZXRBZGRyX3JlZ3MgKTsKLSAgICBmcmFtZTE2LT5jcyA9IEhJV09SRCggQ0FMTFRPMTZfUmV0QWRkcl9yZWdzICk7Ci0jZW5kaWYgIC8qIFdJTkVMSUIgKi8KIAogICAgICAgLyogSWYgdGhlcmUncyBubyAxNi1iaXQgc3RhY2sgeWV0LCB1c2UgYSBwYXJ0IG9mIHRoZSBuZXcgdGFzayBzdGFjayAqLwogICAgICAgLyogVGhpcyBpcyBvbmx5IG5lZWRlZCB0byBoYXZlIGEgc3RhY2sgdG8gc3dpdGNoIGZyb20gb24gdGhlIGZpcnN0ICAqLwpAQCAtNzE3LDYgKzY5OCw3IEBACiB7CiAgICAgVERCICpwT2xkVGFzayA9IE5VTEwsICpwTmV3VGFzazsKICAgICBIVEFTSzE2IGhUYXNrID0gMDsKKyAgICBTVEFDSzE2RlJBTUUgKm5ld2ZyYW1lMTY7CiAKICNpZmRlZiBDT05GSUdfSVBDCiAgICAgZGRlX3Jlc2NoZWR1bGUoKTsKQEAgLTc4OCw2ICs3NzAsMjMgQEAKICAgICBUQVNLX0xpbmtUYXNrKCBoVGFzayApOwogICAgIHBOZXdUYXNrLT5wcmlvcml0eS0tOwogCisgICAgLyogRmluaXNoIGluaXRpYWxpemluZyB0aGUgbmV3IHRhc2sgc3RhY2sgaWYgbmVjZXNzYXJ5ICovCisKKyAgICBuZXdmcmFtZTE2ID0gKFNUQUNLMTZGUkFNRSAqKVBUUl9TRUdfVE9fTElOKCBwTmV3VGFzay0+c3Nfc3AgKTsKKyAgICBpZiAoIW5ld2ZyYW1lMTYtPmVudHJ5X2NzKQorICAgIHsKKyAgICAgICAgU1RBQ0sxNkZSQU1FICpvbGRmcmFtZTE2ID0gQ1VSUkVOVF9TVEFDSzE2OworICAgICAgICBTVEFDSzMyRlJBTUUgKm9sZGZyYW1lMzIgPSAqKFNUQUNLMzJGUkFNRSAqKikob2xkZnJhbWUxNiArIDEpOworICAgICAgICBTVEFDSzMyRlJBTUUgKm5ld2ZyYW1lMzIgPSAqKFNUQUNLMzJGUkFNRSAqKikobmV3ZnJhbWUxNiArIDEpOworICAgICAgICBuZXdmcmFtZTE2LT5lbnRyeV9pcCAgICAgPSBvbGRmcmFtZTE2LT5lbnRyeV9pcDsKKyAgICAgICAgbmV3ZnJhbWUxNi0+ZW50cnlfY3MgICAgID0gb2xkZnJhbWUxNi0+ZW50cnlfY3M7CisgICAgICAgIG5ld2ZyYW1lMTYtPmlwICAgICAgICAgICA9IG9sZGZyYW1lMTYtPmlwOworICAgICAgICBuZXdmcmFtZTE2LT5jcyAgICAgICAgICAgPSBvbGRmcmFtZTE2LT5jczsKKyAgICAgICAgbmV3ZnJhbWUzMi0+ZWJwICAgICAgICAgID0gb2xkZnJhbWUzMi0+ZWJwOworICAgICAgICBuZXdmcmFtZTMyLT5yZXN0b3JlX2FkZHIgPSBvbGRmcmFtZTMyLT5yZXN0b3JlX2FkZHI7CisgICAgICAgIG5ld2ZyYW1lMzItPmNvZGVzZWxlY3RvciA9IG9sZGZyYW1lMzItPmNvZGVzZWxlY3RvcjsKKyAgICB9CisgICAgCiAgICAgLyogU3dpdGNoIHRvIHRoZSBuZXcgc3RhY2sgKi8KIAogICAgIGhDdXJyZW50VGFzayA9IGhUYXNrOwpkaWZmIC0tZ2l0IGEvbWVtb3J5L01ha2VmaWxlLmluIGIvbWVtb3J5L01ha2VmaWxlLmluCmluZGV4IDAyMTRmOTEuLjAxMjM1YTIgMTAwNjQ0Ci0tLSBhL21lbW9yeS9NYWtlZmlsZS5pbgorKysgYi9tZW1vcnkvTWFrZWZpbGUuaW4KQEAgLTEsNCArMSw0IEBACi1ERUZTICAgICAgPSAtRF9fV0lORV9fCitERUZTICAgICAgPSBARExMRkxBR1NAIC1EX19XSU5FX18KIFRPUFNSQ0RJUiA9IEB0b3Bfc3JjZGlyQAogVE9QT0JKRElSID0gLi4KIFNSQ0RJUiAgICA9IEBzcmNkaXJACmRpZmYgLS1naXQgYS9tZW1vcnkvc2VsZWN0b3IuYyBiL21lbW9yeS9zZWxlY3Rvci5jCmluZGV4IDI5NjYwOTUuLjVjNDc3NzUgMTAwNjQ0Ci0tLSBhL21lbW9yeS9zZWxlY3Rvci5jCisrKyBiL21lbW9yeS9zZWxlY3Rvci5jCkBAIC0xNDQsMTYgKzE0NCwxNCBAQAogICAgICAgICAvKiBDaGVjayBpZiB3ZSBhcmUgZnJlZWluZyBjdXJyZW50ICVmcyBvciAlZ3Mgc2VsZWN0b3IgKi8KIAogICAgICAgICBXT1JEIGZzLCBnczsKLQotICAgICAgICBfX2FzbV9fKCJtb3Z3ICUlZnMsJXcwIjoiPXIiIChmcykpOworICAgICAgICBHRVRfRlMoZnMpOwogICAgICAgICBpZiAoKGZzID49IHNlbCkgJiYgKGZzIDwgbmV4dHNlbCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlNFTEVDVE9SX0ZyZWVCbG9jazogZnJlZWluZyAlJWZzIHNlbGVjdG9yICglMDR4KSwgbm90IGdvb2QuXG4iLCBmcyApOwotICAgICAgICAgICAgX19hc21fXygibW92dyAldzAsJSVmcyI6OiJyIiAoMCkpOworICAgICAgICAgICAgU0VUX0ZTKCAwICk7CiAgICAgICAgIH0KLSAgICAgICAgX19hc21fXygibW92dyAlJWdzLCV3MCI6Ij1yIiAoZ3MpKTsKLSAgICAgICAgaWYgKChncyA+PSBzZWwpICYmIChncyA8IG5leHRzZWwpKQotICAgICAgICAgICAgX19hc21fXygibW92dyAldzAsJSVncyI6OiJyIiAoMCkpOworICAgICAgICBHRVRfR1MoZ3MpOworICAgICAgICBpZiAoKGdzID49IHNlbCkgJiYgKGdzIDwgbmV4dHNlbCkpIFNFVF9HUyggMCApOwogICAgIH0KICNlbmRpZiAgLyogX19pMzg2X18gKi8KIApkaWZmIC0tZ2l0IGEvbWVtb3J5L3N0cmluZy5jIGIvbWVtb3J5L3N0cmluZy5jCmluZGV4IDg4YjcyYzQuLjk2OWFlZWUgMTAwNjQ0Ci0tLSBhL21lbW9yeS9zdHJpbmcuYworKysgYi9tZW1vcnkvc3RyaW5nLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWdzdHIuaCIKIAogc3RhdGljIGNvbnN0IEJZVEUgU1RSSU5HX09lbTJBbnNpWzI1Nl0gPQogIlwwMDBcMDAxXDAwMlwwMDNcMDA0XDAwNVwwMDZcMDA3XDAxMFwwMTFcMDEyXDAxM1wwMTRcMDE1XDAxNlwyNDQiCkBAIC03Nyw4ICs3OCw4IEBACiAgKi8KIExQU1RSIFdJTkFQSSBsc3RyY2F0MzJBKCBMUFNUUiBkc3QsIExQQ1NUUiBzcmMgKQogewotICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwic3RyY2F0OiBBcHBlbmQgJyVzJyB0byAnJXMnXG4iLAotCQkgKHNyYyk/c3JjOiJOVUxMIiwoZHN0KT9kc3Q6Ik5VTEwiKTsKKyAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNhdDogQXBwZW5kICVzIHRvICVzXG4iLAorCQkgICBkZWJ1Z3N0cl9hIChzcmMpLCBkZWJ1Z3N0cl9hIChkc3QpKTsKICAgICBzdHJjYXQoIGRzdCwgc3JjICk7CiAgICAgcmV0dXJuIGRzdDsKIH0KQEAgLTkwLDYgKzkxLDggQEAKIExQV1NUUiBXSU5BUEkgbHN0cmNhdDMyVyggTFBXU1RSIGRzdCwgTFBDV1NUUiBzcmMgKQogewogICAgIHJlZ2lzdGVyIExQV1NUUiBwID0gZHN0OworICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwic3RyY2F0OiBBcHBlbmQgTCVzIHRvIEwlc1xuIiwKKwkJICAgZGVidWdzdHJfdyAoc3JjKSwgZGVidWdzdHJfdyAoZHN0KSk7CiAgICAgd2hpbGUgKCpwKSBwKys7CiAgICAgd2hpbGUgKCgqcCsrID0gKnNyYysrKSk7CiAgICAgcmV0dXJuIGRzdDsKQEAgLTExMiw4ICsxMTUsOCBAQAogTFBTVFIgV0lOQVBJIGxzdHJjYXRuMzJBKCBMUFNUUiBkc3QsIExQQ1NUUiBzcmMsIElOVDMyIG4gKQogewogICAgIHJlZ2lzdGVyIExQU1RSIHAgPSBkc3Q7Ci0gICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJjYXRuIGFkZCAlZCBjaGFycyBmcm9tICclcycgdG8gJyVzJ1xuIiwKLQkJIG4sKHNyYyk/c3JjOiJOVUxMIiwoZHN0KT9kc3Q6Ik5VTEwiKTsKKyAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNhdG4gYWRkICVkIGNoYXJzIGZyb20gJXMgdG8gJXNcbiIsCisJCSAgIG4sIGRlYnVnc3RyX2FuIChzcmMsIG4pLCBkZWJ1Z3N0cl9hIChkc3QpKTsKICAgICB3aGlsZSAoKnApIHArKzsKICAgICBpZiAoKG4gLT0gKElOVDMyKShwIC0gZHN0KSkgPD0gMCkgcmV0dXJuIGRzdDsKICAgICBsc3RyY3B5bjMyQSggcCwgc3JjLCBuICk7CkBAIC0xMjcsNiArMTMwLDggQEAKIExQV1NUUiBXSU5BUEkgbHN0cmNhdG4zMlcoIExQV1NUUiBkc3QsIExQQ1dTVFIgc3JjLCBJTlQzMiBuICkKIHsKICAgICByZWdpc3RlciBMUFdTVFIgcCA9IGRzdDsKKyAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNhdG4gYWRkICVkIGNoYXJzIGZyb20gTCVzIHRvIEwlc1xuIiwKKwkJICAgbiwgZGVidWdzdHJfd24gKHNyYywgbiksIGRlYnVnc3RyX3cgKGRzdCkpOwogICAgIHdoaWxlICgqcCkgcCsrOwogICAgIGlmICgobiAtPSAoSU5UMzIpKHAgLSBkc3QpKSA8PSAwKSByZXR1cm4gZHN0OwogICAgIGxzdHJjcHluMzJXKCBwLCBzcmMsIG4gKTsKQEAgLTE0OCwxNCArMTUzLDEzIEBACiAgKi8KIElOVDMyIFdJTkFQSSBsc3RyY21wMzJBKCBMUENTVFIgc3RyMSwgTFBDU1RSIHN0cjIgKQogeworICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwic3RyY21wOiAlcyBhbmQgJXNcbiIsCisJCSAgIGRlYnVnc3RyX2EgKHN0cjEpLCBkZWJ1Z3N0cl9hIChzdHIyKSk7CiAgICAgLyogV2luOTUgS0VSTkVMMzIuRExMIGRvZXMgaXQgdGhhdCB3YXkuIEhhbmRzIG9mZiEgKi8KICAgICBpZiAoIXN0cjEgfHwgIXN0cjIpIHsKICAgICAJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKIAlyZXR1cm4gMDsKICAgICB9Ci0KLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNtcDogJyVzJyBhbmQgJyVzJ1xuIiwKLQkJIChzdHIxKT9zdHIxOiJOVUxMIiwoc3RyMik/c3RyMjoiTlVMTCIpOwogICAgIHJldHVybiAoSU5UMzIpc3RyY21wKCBzdHIxLCBzdHIyICk7CiB9CiAKQEAgLTE2NSw2ICsxNjksOCBAQAogICovCiBJTlQzMiBXSU5BUEkgbHN0cmNtcDMyVyggTFBDV1NUUiBzdHIxLCBMUENXU1RSIHN0cjIgKQogeworICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwic3RyY21wOiBMJXMgYW5kIEwlc1xuIiwKKwkJICAgZGVidWdzdHJfdyAoc3RyMSksIGRlYnVnc3RyX3cgKHN0cjIpKTsKICAgICBpZiAoIXN0cjEgfHwgIXN0cjIpIHsKICAgICAJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKIAlyZXR1cm4gMDsKQEAgLTE5MCwxMiArMTk2LDEyIEBACiB7CiAgICAgSU5UMzIgcmVzOwogCisgICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJjbXBpICVzIGFuZCAlc1xuIiwKKwkJICAgZGVidWdzdHJfYSAoc3RyMSksIGRlYnVnc3RyX2EgKHN0cjIpKTsKICAgICBpZiAoIXN0cjEgfHwgIXN0cjIpIHsKICAgICAJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKIAlyZXR1cm4gMDsKICAgICB9Ci0gICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJjbXBpICclcycgYW5kICclcydcbiIsCi0JCSAoc3RyMSk/c3RyMToiTlVMTCIsKHN0cjIpP3N0cjI6Ik5VTEwiKTsKICAgICB3aGlsZSAoKnN0cjEpCiAgICAgewogICAgICAgICBpZiAoKHJlcyA9IHRvdXBwZXIoKnN0cjEpIC0gdG91cHBlcigqc3RyMikpICE9IDApIHJldHVybiByZXM7CkBAIC0yMTMsNiArMjE5LDExIEBACiB7CiAgICAgSU5UMzIgcmVzOwogCisjaWYgMAorICAgIC8qIFRvbyBtdWNoISAgKEZyb20gcmVnaXN0cnkgbG9hZGluZy4pICAqLworICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwic3RyY21waSBMJXMgYW5kIEwlc1xuIiwKKwkJICAgZGVidWdzdHJfdyAoc3RyMSksIGRlYnVnc3RyX3cgKHN0cjIpKTsKKyNlbmRpZgogICAgIGlmICghc3RyMSB8fCAhc3RyMikgewogICAgIAlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogCXJldHVybiAwOwpAQCAtMjQzLDggKzI1NCw3IEBACiAgKi8KIExQU1RSIFdJTkFQSSBsc3RyY3B5MzJBKCBMUFNUUiBkc3QsIExQQ1NUUiBzcmMgKQogewotICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwic3RyY3B5ICclcydcbiIsCi0JCSAoc3JjKT9zcmM6Ik5VTEwiKTsKKyAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNweSAlc1xuIiwgZGVidWdzdHJfYSAoc3JjKSk7CiAgICAgaWYgKCFzcmMgfHwgIWRzdCkgcmV0dXJuIE5VTEw7CiAgICAgc3RyY3B5KCBkc3QsIHNyYyApOwogICAgIHJldHVybiBkc3Q7CkBAIC0yNTcsNiArMjY3LDcgQEAKIExQV1NUUiBXSU5BUEkgbHN0cmNweTMyVyggTFBXU1RSIGRzdCwgTFBDV1NUUiBzcmMgKQogewogICAgIHJlZ2lzdGVyIExQV1NUUiBwID0gZHN0OworICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwic3RyY3B5IEwlc1xuIiwgZGVidWdzdHJfdyAoc3JjKSk7CiAgICAgd2hpbGUgKCgqcCsrID0gKnNyYysrKSk7CiAgICAgcmV0dXJuIGRzdDsKIH0KQEAgLTI3OCw4ICsyODksOCBAQAogTFBTVFIgV0lOQVBJIGxzdHJjcHluMzJBKCBMUFNUUiBkc3QsIExQQ1NUUiBzcmMsIElOVDMyIG4gKQogewogICAgIExQU1RSIHAgPSBkc3Q7Ci0gICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJjcHluICclcycgZm9yICVkIGNoYXJzXG4iLAotCQkgKHNyYyk/c3JjOiJOVUxMIixuKTsKKyAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNweW4gJXMgZm9yICVkIGNoYXJzXG4iLAorCQkgICBkZWJ1Z3N0cl9hbiAoc3JjLG4pLCBuKTsKICAgICB3aGlsZSAoKG4tLSA+IDEpICYmICpzcmMpICpwKysgPSAqc3JjKys7CiAgICAgaWYgKG4gPj0gMCkgKnAgPSAwOwogICAgIHJldHVybiBkc3Q7CkBAIC0yOTIsNiArMzAzLDggQEAKIExQV1NUUiBXSU5BUEkgbHN0cmNweW4zMlcoIExQV1NUUiBkc3QsIExQQ1dTVFIgc3JjLCBJTlQzMiBuICkKIHsKICAgICBMUFdTVFIgcCA9IGRzdDsKKyAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNweW4gTCVzIGZvciAlZCBjaGFyc1xuIiwKKwkJICAgZGVidWdzdHJfd24gKHNyYyxuKSwgbik7CiAgICAgd2hpbGUgKChuLS0gPiAxKSAmJiAqc3JjKSAqcCsrID0gKnNyYysrOwogICAgIGlmIChuID49IDApICpwID0gMDsKICAgICByZXR1cm4gZHN0OwpAQCAtMzE2LDcgKzMyOSw3IEBACiAgICAgICogaW4gbHN0cmxlbigpIC4uLiB3ZSBjaGVjayBvbmx5IGZvciBOVUxMIHBvaW50ZXIgcmVmZXJlbmNlLgogICAgICAqIC0gTWFyY3VzIE1laXNzbmVyCiAgICAgICovCi0gICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJsZW4gJyVzJ1xuIiwgKHN0cik/c3RyOiJOVUxMIik7CisgICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJsZW4gJXNcbiIsIGRlYnVnc3RyX2EgKHN0cikpOwogICAgIGlmICghc3RyKSByZXR1cm4gMDsKICAgICByZXR1cm4gKElOVDMyKXN0cmxlbihzdHIpOwogfQpAQCAtMzI4LDYgKzM0MSw3IEBACiBJTlQzMiBXSU5BUEkgbHN0cmxlbjMyVyggTFBDV1NUUiBzdHIgKQogewogICAgIElOVDMyIGxlbiA9IDA7CisgICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJsZW4gTCVzXG4iLCBkZWJ1Z3N0cl93IChzdHIpKTsKICAgICBpZiAoIXN0cikgcmV0dXJuIDA7CiAgICAgd2hpbGUgKCpzdHIrKykgbGVuKys7CiAgICAgcmV0dXJuIGxlbjsKQEAgLTMzOSw4ICszNTMsOCBAQAogICovCiBJTlQzMiBXSU5BUEkgbHN0cm5jbXAzMkEoIExQQ1NUUiBzdHIxLCBMUENTVFIgc3RyMiwgSU5UMzIgbiApCiB7Ci0gICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJuY21wICclcycgYW5kICclcycgZm9yICVkIGNoYXJzXG4iLAotCQkgKHN0cjEpP3N0cjE6Ik5VTEwiLChzdHIyKT9zdHIyOiJOVUxMIixuKTsKKyAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cm5jbXAgJXMgYW5kICVzIGZvciAlZCBjaGFyc1xuIiwKKwkJICAgZGVidWdzdHJfYW4gKHN0cjEsIG4pLCBkZWJ1Z3N0cl9hbiAoc3RyMiwgbiksIG4pOwogICAgIHJldHVybiAoSU5UMzIpc3RybmNtcCggc3RyMSwgc3RyMiwgbiApOwogfQogCkBAIC0zNTAsNiArMzY0LDggQEAKICAqLwogSU5UMzIgV0lOQVBJIGxzdHJuY21wMzJXKCBMUENXU1RSIHN0cjEsIExQQ1dTVFIgc3RyMiwgSU5UMzIgbiApCiB7CisgICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJuY21wIEwlcyBhbmQgTCVzIGZvciAlZCBjaGFyc1xuIiwKKwkJICAgZGVidWdzdHJfd24gKHN0cjEsIG4pLCBkZWJ1Z3N0cl93biAoc3RyMiwgbiksIG4pOwogICAgIGlmICghbikgcmV0dXJuIDA7CiAgICAgd2hpbGUgKCgtLW4gPiAwKSAmJiAqc3RyMSAmJiAoKnN0cjEgPT0gKnN0cjIpKSB7IHN0cjErKzsgc3RyMisrOyB9CiAgICAgcmV0dXJuIChJTlQzMikoKnN0cjEgLSAqc3RyMik7CkBAIC0zNjMsOCArMzc5LDggQEAKIHsKICAgICBJTlQzMiByZXM7CiAKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cm5jbXBpICclcycgYW5kICclcycgZm9yICVkIGNoYXJzXG4iLAotCQkgKHN0cjEpP3N0cjE6Ik5VTEwiLChzdHIyKT9zdHIyOiJOVUxMIixuKTsKKyAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cm5jbXBpICVzIGFuZCAlcyBmb3IgJWQgY2hhcnNcbiIsCisJCSAgIGRlYnVnc3RyX2FuIChzdHIxLCBuKSwgZGVidWdzdHJfYW4gKHN0cjIsIG4pLCBuKTsKICAgICBpZiAoIW4pIHJldHVybiAwOwogICAgIHdoaWxlICgoLS1uID4gMCkgJiYgKnN0cjEpCiAgICAgICBpZiAoIChyZXMgPSB0b3VwcGVyKCpzdHIxKyspIC0gdG91cHBlcigqc3RyMisrKSkgKSByZXR1cm4gcmVzOwpAQCAtMzgwLDYgKzM5Niw4IEBACiB7CiAgICAgSU5UMzIgcmVzOwogCisgICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJuY21waSBMJXMgYW5kIEwlcyBmb3IgJWQgY2hhcnNcbiIsCisJCSAgIGRlYnVnc3RyX3duIChzdHIxLCBuKSwgZGVidWdzdHJfd24gKHN0cjIsIG4pLCBuKTsKICAgICBpZiAoIW4pIHJldHVybiAwOwogICAgIHdoaWxlICgoLS1uID4gMCkgJiYgKnN0cjEpCiAgICAgewpAQCAtNTE3LDEwICs1MzUsMTEgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBDaGFyVG9PZW0zMkEoIExQQ1NUUiBzLCBMUFNUUiBkICkKIHsKKyAgICBMUFNUUiBvbGRkID0gZDsKICAgICBpZiAoIXMgfHwgIWQpIHJldHVybiBUUlVFOwotICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwiQ2hhclRvT2VtICclcydcbiIsIChzKT9zOiJOVUxMIik7CisgICAgZHByaW50Zl9zdHJpbmcgKHN0ZGRlYiwiQ2hhclRvT2VtICVzXG4iLCBkZWJ1Z3N0cl9hIChzKSk7CiAgICAgd2hpbGUgKCgqZCsrID0gQU5TSV9UT19PRU0oKnMrKykpKTsKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsIiB0byAnJXMnXG4iLCAoZCk/ZDoiTlVMTCIpOworICAgIGRwcmludGZfc3RyaW5nIChzdGRkZWIsIiAgICAgICB0byAlc1xuIiwgZGVidWdzdHJfYSAob2xkZCkpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC01NTAsNyArNTY5LDExIEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgQ2hhclRvT2VtMzJXKCBMUENXU1RSIHMsIExQU1RSIGQgKQogeworICAgIExQU1RSIG9sZGQgPSBkOworICAgIGlmICghcyB8fCAhZCkgcmV0dXJuIFRSVUU7CisgICAgZHByaW50Zl9zdHJpbmcgKHN0ZGRlYiwiQ2hhclRvT2VtIEwlc1xuIiwgZGVidWdzdHJfdyAocykpOwogICAgIHdoaWxlICgoKmQrKyA9IEFOU0lfVE9fT0VNKCpzKyspKSk7CisgICAgZHByaW50Zl9zdHJpbmcgKHN0ZGRlYiwiICAgICAgIHRvICVzXG4iLCBkZWJ1Z3N0cl9hIChvbGRkKSk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTU2MSw5ICs1ODQsOSBAQAogQk9PTDMyIFdJTkFQSSBPZW1Ub0NoYXIzMkEoIExQQ1NUUiBzLCBMUFNUUiBkICkKIHsKICAgICBMUFNUUiBvbGRkID0gZDsKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsIk9lbVRvQ2hhciAnJXMnXG4iLCAocyk/czoiTlVMTCIpOworICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwiT2VtVG9DaGFyICVzXG4iLCBkZWJ1Z3N0cl9hIChzKSk7CiAgICAgd2hpbGUgKCgqZCsrID0gT0VNX1RPX0FOU0koKnMrKykpKTsKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsIiB0byAnJXMnXG4iLCBvbGRkKTsKKyAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsIiAgICAgICB0byAlc1xuIiwgZGVidWdzdHJfYSAob2xkZCkpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC01NzMsNyArNTk2LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBPZW1Ub0NoYXJCdWZmMzJBKCBMUENTVFIgcywgTFBTVFIgZCwgRFdPUkQgbGVuICkKIHsKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsIk9lbVRvQ2hhckJ1ZmYgJyVzJyBmb3IgJWxkIGNoYXJzXG4iLCAocyk/czoiTlVMTCIsbGVuKTsKKyAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsIk9lbVRvQ2hhckJ1ZmYgJXNcbiIsIGRlYnVnc3RyX2FuIChzLCBsZW4pKTsKICAgICB3aGlsZSAobGVuLS0pICpkKysgPSBPRU1fVE9fQU5TSSgqcysrKTsKICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTU4NCw2ICs2MDcsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIE9lbVRvQ2hhckJ1ZmYzMlcoIExQQ1NUUiBzLCBMUFdTVFIgZCwgRFdPUkQgbGVuICkKIHsKKyAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsIk9lbVRvQ2hhckJ1ZmYgJXNcbiIsIGRlYnVnc3RyX2FuIChzLCBsZW4pKTsKICAgICB3aGlsZSAobGVuLS0pICpkKysgPSAoV0NIQVIpT0VNX1RPX0FOU0koKnMrKyk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9taXNjL01ha2VmaWxlLmluIGIvbWlzYy9NYWtlZmlsZS5pbgppbmRleCAxMDM4YjkzLi45YTViNzUyIDEwMDY0NAotLS0gYS9taXNjL01ha2VmaWxlLmluCisrKyBiL21pc2MvTWFrZWZpbGUuaW4KQEAgLTEsNCArMSw0IEBACi1ERUZTICAgICAgPSAtRF9fV0lORV9fCitERUZTICAgICAgPSBARExMRkxBR1NAIC1EX19XSU5FX18KIFRPUFNSQ0RJUiA9IEB0b3Bfc3JjZGlyQAogVE9QT0JKRElSID0gLi4KIFNSQ0RJUiAgICA9IEBzcmNkaXJACkBAIC0xNCw2ICsxNCw3IEBACiAJY3J0ZGxsLmMgXAogCWNwdS5jIFwKIAlkZGVtbC5jIFwKKwlkZWJ1Z3N0ci5jIFwKIAllcnJvci5jIFwKIAlsc3RyLmMgXAogCWx6ZXhwYW5kLmMgXApAQCAtMzcsNiArMzgsNyBAQAogCXRvb2xoZWxwLmMgXAogCXR3ZWFrLmMgXAogCXZlci5jIFwKKwl2ZXJzaW9uLmMgXAogCXczMnN5cy5jIFwKIAl3aW5zb2NrLmMgXAogCXdpbnNvY2tfZG5zLmMgXApkaWZmIC0tZ2l0IGEvbWlzYy9jYWxsYmFjay5jIGIvbWlzYy9jYWxsYmFjay5jCmluZGV4IGQ4ZTkwODEuLmMzNzlhOTAgMTAwNjQ0Ci0tLSBhL21pc2MvY2FsbGJhY2suYworKysgYi9taXNjL2NhbGxiYWNrLmMKQEAgLTEzMiw2ICsxMzIsNyBAQAogewogICAgIENBTExCQUNLX0NhbGxSZWdpc3RlclByb2MsICAgICAvKiBDYWxsUmVnaXN0ZXJQcm9jICovCiAgICAgVEFTS19SZXNjaGVkdWxlLCAgICAgICAgICAgICAgIC8qIENhbGxUYXNrUmVzY2hlZHVsZVByb2MgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbEZyb20xNlduZFByb2MgKi8KICAgICBDQUxMQkFDS19DYWxsV25kUHJvYywgICAgICAgICAgLyogQ2FsbFduZFByb2MgKi8KICAgICBDQUxMQkFDS19DYWxsRHJpdmVyUHJvYywgICAgICAgLyogQ2FsbERyaXZlclByb2MgKi8KICAgICBDQUxMQkFDS19DYWxsRHJpdmVyQ2FsbGJhY2ssICAgLyogQ2FsbERyaXZlckNhbGxiYWNrICovCmRpZmYgLS1naXQgYS9taXNjL2RkZW1sLmMgYi9taXNjL2RkZW1sLmMKaW5kZXggODIzMjY1ZS4uYjQzMDQ3NSAxMDA2NDQKLS0tIGEvbWlzYy9kZGVtbC5jCisrKyBiL21pc2MvZGRlbWwuYwpAQCAtMiw2ICsyLDcgQEAKICAqIERERU1MIGxpYnJhcnkKICAqCiAgKiBDb3B5cmlnaHQgMTk5NyBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqIENvcHlyaWdodCAxOTk3IExlbiBXaGl0ZQogICovCiAKIC8qIE9ubHkgZW1wdHkgc3R1YnMgZm9yIG5vdyAqLwpAQCAtNjMsNiArNjQsMzMgQEAKICAgICByZXR1cm4gVFJVRTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIERkZUNvbm5lY3RMaXN0IChEREVNTC40KQorICovCitIQ09OVkxJU1QgV0lOQVBJIERkZUNvbm5lY3RMaXN0KCBEV09SRCBpZEluc3QsIEhTWiBoc3pTZXJ2aWNlLCBIU1ogaHN6VG9waWMsCisgICAgICAgIEhDT05WTElTVCBoQ29udkxpc3QsIExQQ09OVkNPTlRFWFQxNiBwQ0MgKQoreworICAgIGZwcmludGYoIHN0ZG5pbXAsICJEZGVDb25uZWN0TGlzdDogZW1wdHkgc3R1YlxuIiApOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgRGRlUXVlcnlOZXh0U2VydmVyIChEREVNTC41KQorICovCitIQ09OViBXSU5BUEkgRGRlUXVlcnlOZXh0U2VydmVyKCBIQ09OVkxJU1QgaENvbnZMaXN0LCBIQ09OViBoQ29udlByZXYgKQoreworICAgIGZwcmludGYoIHN0ZG5pbXAsICJEZGVRdWVyeU5leHRTZXJ2ZXI6IGVtcHR5IHN0dWJcbiIgKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIERkZURpc2Nvbm5lY3RMaXN0IChEREVNTC42KQorICovCitCT09MMTYgV0lOQVBJIERkZURpc2Nvbm5lY3RMaXN0KCBIQ09OVkxJU1QgaENvbnZMaXN0ICkKK3sKKyAgICBmcHJpbnRmKCBzdGRuaW1wLCAiRGRlRGlzY29ubmVjdExpc3Q6IGVtcHR5IHN0dWJcbiIgKTsKKyAgICByZXR1cm4gMDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgIERkZUNvbm5lY3QxNiAgIChEREVNTC43KQpAQCAtOTQsNiArMTIyLDIzIEBACiAgICAgcmV0dXJuIChCT09MMTYpRGRlRGlzY29ubmVjdDMyKCBoQ29udiApOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgRGRlU2V0VXNlckhhbmRsZSAoRERFTUwuMTApCisgKi8KK0JPT0wxNiBXSU5BUEkgRGRlU2V0VXNlckhhbmRsZSggSENPTlYgaENvbnYsIERXT1JEIGlkLCBEV09SRCBoVXNlciApCit7CisgICAgZnByaW50Ziggc3RkbmltcCwgIkRkZVNldFVzZXJIYW5kbGU6IGVtcHR5IHN0dWJcbiIgKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIERkZUNyZWF0ZURhdGFIYW5kbGUgKERERU1MLjE0KQorICovCitIRERFREFUQSBXSU5BUEkgRGRlQ3JlYXRlRGF0YUhhbmRsZSggRFdPUkQgaWRJbnN0LCBMUEJZVEUgcFNyYywgRFdPUkQgY2IsIERXT1JEIGNiT2ZmLCBIU1ogaHN6SXRlbSwgVUlOVDE2IHdGbXQsIFVJTlQxNiBhZkNtZCApCit7CisgICAgZnByaW50Ziggc3RkbmltcCwgIkRkZUNyZWF0ZURhdGFIYW5kbGU6IGVtcHR5IHN0dWJcbiIgKTsKKyAgICByZXR1cm4gMDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgIERkZURpc2Nvbm5lY3QzMiAgIChVU0VSMzIuOTcpCkBAIC0yMjYsNiArMjcxLDcxIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICBEZGVBYmFuZG9uVHJhbnNhY3Rpb24gKERERU1MLjEyKQorICovCitCT09MMTYgV0lOQVBJIERkZUFiYW5kb25UcmFuc2FjdGlvbiggRFdPUkQgaWRJbnN0LCBIQ09OViBoQ29udiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgaWRUcmFuc2FjdGlvbiApCit7CisgICAgZnByaW50Ziggc3RkbmltcCwgIkRkZUFiYW5kb25UcmFuc2FjdGlvbjogZW1wdHkgc3R1YlxuIiApOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgRGRlUG9zdEFkdmlzZSAoRERFTUwuMTMpCisgKi8KK0JPT0wxNiBXSU5BUEkgRGRlUG9zdEFkdmlzZSggRFdPUkQgaWRJbnN0LCBIU1ogaHN6VG9waWMsIEhTWiBoc3pJdGVtICkKK3sKKyAgICBmcHJpbnRmKCBzdGRuaW1wLCAiRGRlUG9zdEFkdmlzZTogZW1wdHkgc3R1YlxuIiApOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgRGRlQWRkRGF0YSAoRERFTUwuMTUpCisgKi8KK0hEREVEQVRBIFdJTkFQSSBEZGVBZGREYXRhKCBIRERFREFUQSBoRGF0YSwgTFBCWVRFIHBTcmMsIERXT1JEIGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGNiT2ZmICkKK3sKKyAgICBmcHJpbnRmKCBzdGRuaW1wLCAiRGRlQWRkRGF0YTogZW1wdHkgc3R1YlxuIiApOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgRGRlR2V0RGF0YSAoRERFTUwuMTYpCisgKi8KK0RXT1JEIFdJTkFQSSBEZGVHZXREYXRhKCBIRERFREFUQSBoRGF0YSwgTFBCWVRFIHBEc3QsIERXT1JEIGNiTWF4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBjYk9mZiApCit7CisgICAgZnByaW50Ziggc3RkbmltcCwgIkRkZUdldERhdGE6IGVtcHR5IHN0dWJcbiIgKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIERkZUFjY2Vzc0RhdGEgKERERU1MLjE3KQorICovCitMUEJZVEUgV0lOQVBJIERkZUFjY2Vzc0RhdGEoIEhEREVEQVRBIGhEYXRhLCBMUERXT1JEIHBjYkRhdGFTaXplICkKK3sKKyAgICAgZnByaW50Ziggc3RkbmltcCwgIkRkZUFjY2Vzc0RhdGE6IGVtcHR5IHN0dWJcbiIgKTsKKyAgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICBEZGVVbmFjY2Vzc0RhdGEgKERERU1MLjE4KQorICovCitCT09MMTYgV0lOQVBJIERkZVVuYWNjZXNzRGF0YSggSERERURBVEEgaERhdGEgKQoreworICAgICBmcHJpbnRmKCBzdGRuaW1wLCAiRGRlVW5hY2Nlc3NEYXRhOiBlbXB0eSBzdHViXG4iICk7CisgICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgRGRlRW5hYmxlQ2FsbGJhY2sgKERERU1MLjI2KQorICovCitCT09MMTYgV0lOQVBJIERkZUVuYWJsZUNhbGxiYWNrKCBEV09SRCBpZEluc3QsIEhDT05WIGhDb252LCBVSU5UMTYgd0NtZCApCit7CisgICAgIGZwcmludGYoIHN0ZG5pbXAsICJEZGVFbmFibGVDYWxsYmFjazogZW1wdHkgc3R1YlxuIiApOworICAgICByZXR1cm4gMDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgIERkZU5hbWVTZXJ2aWNlMTYgIChEREVNTC4yNykKQEAgLTI2NiwzICszNzYsMTQgQEAKICAgICByZXR1cm4gMDsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIERkZUNtcFN0cmluZ0hhbmRsZXMgKERERU1MLjM2KQorICovCitpbnQgV0lOQVBJIERkZUNtcFN0cmluZ0hhbmRsZXMoIEhTWiBoc3oxLCBIU1ogaHN6MiApCit7CisgICAgIGZwcmludGYoIHN0ZG5pbXAsICJEZGVDbXBTdHJpbmdIYW5kbGVzOiBlbXB0eSBzdHViXG4iICk7CisgICAgIHJldHVybiAwOworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWlzYy9kZWJ1Z3N0ci5jIGIvbWlzYy9kZWJ1Z3N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjQ2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjL2RlYnVnc3RyLmMKQEAgLTAsMCArMSwxMjcgQEAKKyNpbmNsdWRlICJkZWJ1Z3N0ci5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFNBVkVfU1RSSU5HX0NPVU5UIDUwCitzdGF0aWMgdm9pZCAqc3RyaW5nc1tTQVZFX1NUUklOR19DT1VOVF07CitzdGF0aWMgaW50IG5leHRzdHJpbmc7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgKgorZ2ltbWUxIChpbnQgbikKK3sKKyAgdm9pZCAqcmVzOworICBpZiAoc3RyaW5nc1tuZXh0c3RyaW5nXSkgZnJlZSAoc3RyaW5nc1tuZXh0c3RyaW5nXSk7CisgIHJlcyA9IHN0cmluZ3NbbmV4dHN0cmluZ10gPSB4bWFsbG9jIChuKTsKKyAgaWYgKCsrbmV4dHN0cmluZyA9PSBTQVZFX1NUUklOR19DT1VOVCkgbmV4dHN0cmluZyA9IDA7CisgIHJldHVybiByZXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworTFBTVFIKK2RlYnVnc3RyX2FuIChMUENTVFIgc3JjLCBpbnQgbikKK3sKKyAgTFBTVFIgZHN0LCByZXM7CisKKyAgaWYgKCFzcmMpIHJldHVybiAiKG51bGwpIjsKKyAgaWYgKG4gPCAwKSBuID0gMDsKKyAgZHN0ID0gcmVzID0gZ2ltbWUxIChuICogNCArIDEwKTsKKyAgKmRzdCsrID0gJyInOworICB3aGlsZSAobi0tID4gMCAmJiAqc3JjKQorICAgIHsKKyAgICAgIEJZVEUgYyA9ICpzcmMrKzsKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnXG4nOiAqZHN0KysgPSAnXFwnOyAqZHN0KysgPSAnbic7IGJyZWFrOworCWNhc2UgJ1xyJzogKmRzdCsrID0gJ1xcJzsgKmRzdCsrID0gJ3InOyBicmVhazsKKwljYXNlICdcdCc6ICpkc3QrKyA9ICdcXCc7ICpkc3QrKyA9ICd0JzsgYnJlYWs7CisJY2FzZSAnIic6ICpkc3QrKyA9ICdcXCc7ICpkc3QrKyA9ICciJzsgYnJlYWs7CisJY2FzZSAnXFwnOiAqZHN0KysgPSAnXFwnOyAqZHN0KysgPSAnXFwnOyBicmVhazsKKwlkZWZhdWx0OgorCSAgaWYgKGMgPj0gJyAnICYmIGMgPD0gMTI2KQorCSAgICAqZHN0KysgPSBjOworCSAgZWxzZQorCSAgICB7CisJICAgICAgKmRzdCsrID0gJ1xcJzsKKwkgICAgICAqZHN0KysgPSAnMCcgKyAoKGMgPj4gNikgJiA3KTsKKwkgICAgICAqZHN0KysgPSAnMCcgKyAoKGMgPj4gMykgJiA3KTsKKwkgICAgICAqZHN0KysgPSAnMCcgKyAoKGMgPj4gMCkgJiA3KTsKKwkgICAgfQorCX0KKyAgICB9CisgIGlmICgqc3JjKQorICAgIHsKKyAgICAgICpkc3QrKyA9ICcuJzsKKyAgICAgICpkc3QrKyA9ICcuJzsKKyAgICAgICpkc3QrKyA9ICcuJzsKKyAgICB9CisgICpkc3QrKyA9ICciJzsKKyAgKmRzdCA9IDA7CisgIHJldHVybiByZXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworTFBTVFIKK2RlYnVnc3RyX2EgKExQQ1NUUiBzKQoreworICByZXR1cm4gZGVidWdzdHJfYW4gKHMsIDgwKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitMUFNUUgorZGVidWdzdHJfd24gKExQQ1dTVFIgc3JjLCBpbnQgbikKK3sKKyAgTFBTVFIgZHN0LCByZXM7CisKKyAgaWYgKCFzcmMpIHJldHVybiAiKG51bGwpIjsKKyAgaWYgKG4gPCAwKSBuID0gMDsKKyAgZHN0ID0gcmVzID0gZ2ltbWUxIChuICogNCArIDEwKTsKKyAgKmRzdCsrID0gJyInOworICB3aGlsZSAobi0tID4gMCAmJiAqc3JjKQorICAgIHsKKyAgICAgIFdPUkQgYyA9ICpzcmMrKzsKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnXG4nOiAqZHN0KysgPSAnXFwnOyAqZHN0KysgPSAnbic7IGJyZWFrOworCWNhc2UgJ1xyJzogKmRzdCsrID0gJ1xcJzsgKmRzdCsrID0gJ3InOyBicmVhazsKKwljYXNlICdcdCc6ICpkc3QrKyA9ICdcXCc7ICpkc3QrKyA9ICd0JzsgYnJlYWs7CisJY2FzZSAnIic6ICpkc3QrKyA9ICdcXCc7ICpkc3QrKyA9ICciJzsgYnJlYWs7CisJY2FzZSAnXFwnOiAqZHN0KysgPSAnXFwnOyAqZHN0KysgPSAnXFwnOyBicmVhazsKKwlkZWZhdWx0OgorCSAgaWYgKGMgPj0gJyAnICYmIGMgPD0gMTI2KQorCSAgICAqZHN0KysgPSBjOworCSAgZWxzZQorCSAgICB7CisJICAgICAgKmRzdCsrID0gJ1xcJzsKKwkgICAgICAqZHN0KysgPSAnMCcgKyAoKGMgPj4gNikgJiA3KTsKKwkgICAgICAqZHN0KysgPSAnMCcgKyAoKGMgPj4gMykgJiA3KTsKKwkgICAgICAqZHN0KysgPSAnMCcgKyAoKGMgPj4gMCkgJiA3KTsKKwkgICAgfQorCX0KKyAgICB9CisgIGlmICgqc3JjKQorICAgIHsKKyAgICAgICpkc3QrKyA9ICcuJzsKKyAgICAgICpkc3QrKyA9ICcuJzsKKyAgICAgICpkc3QrKyA9ICcuJzsKKyAgICB9CisgICpkc3QrKyA9ICciJzsKKyAgKmRzdCA9IDA7CisgIHJldHVybiByZXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworTFBTVFIKK2RlYnVnc3RyX3cgKExQQ1dTVFIgcykKK3sKKyAgcmV0dXJuIGRlYnVnc3RyX3duIChzLCA4MCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL21pc2MvbWFpbi5jIGIvbWlzYy9tYWluLmMKaW5kZXggNjdjMDM3Yy4uMTQwNDkwNSAxMDA2NDQKLS0tIGEvbWlzYy9tYWluLmMKKysrIGIvbWlzYy9tYWluLmMKQEAgLTIwLDEzOCArMjAsMjEgQEAKICNpbmNsdWRlIDxYMTEvY3Vyc29yZm9udC5oPgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJtZXNzYWdlLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAibXNkb3MuaCIKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiY29sb3IuaCIKICNpbmNsdWRlICJ3aW5zb2NrLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgImRlc2t0b3AuaCIKKyNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAic2hlbGwuaCIKICNpbmNsdWRlICJ3aW5iYXNlLmgiCiAjZGVmaW5lIERFQlVHX0RFRklORV9WQVJJQUJMRVMKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKIAotY29uc3QgY2hhciBwZW9wbGVbXSA9ICJXaW5lIGlzIGF2YWlsYWJsZSB0aGFua3MgdG8gdGhlIHdvcmsgb2YgIgotIkJvYiBBbXN0YWR0LCAiCi0iRGFnIEFzaGVpbSwgIgotIk1hcnRpbiBBeW90dGUsICIKLSJQZXRlciBCYWp1c3osICIKLSJHZW9yZyBCZXllcmxlLCAiCi0iUm9zcyBCaXJvLCAiCi0iVXdlIEJvbm5lcywgIgotIkVyaWsgQm9zLCAiCi0iRm9ucyBCb3RtYW4sICIKLSJKb2huIEJyZXphaywgIgotIkFuZHJldyBCdWxoYWssICIKLSJKb2huIEJ1cnRvbiwgIgotIk5pZWxzIGRlIENhcnBlbnRpZXIsICIKLSJKaW1lbiBDaGluZywgIgotIkRhdmlkIEEuIEN1dGhiZXJ0LCAiCi0iSHV3IEQuIE0uIERhdmllcywgIgotIlJvbWFuIERvbGVqc2ksICIKLSJGcmFucyB2YW4gRG9yc3NlbGFlciwgIgotIkNocmlzIEZhaGVydHksICIKLSJQYXVsIEZhbHN0YWQsICIKLSJEYXZpZCBGYXVyZSwgIgotIkNsYXVzIEZpc2NoZXIsICIKLSJPbGFmIEZsZWJiZSwgIgotIkNoYWQgRnJhbGVpZ2gsICIKLSJQZXRlciBHYWxiYXZ5LCAiCi0iUmFtb24gR2FyY2lhLCAiCi0iTWF0dGhldyBHaGlvLCAiCi0iSm9keSBHb2xkYmVyZywgIgotIkhhbnMgZGUgR3JhYWZmLCAiCi0iQ2hhcmxlcyBNLiBIYW5udW0sICIKLSJBZHJpYW4gSGFydmV5LCAiCi0iSm9obiBIYXJ2ZXksICIKLSJDYW1lcm9uIEhlaWRlLCAiCi0iSm9jaGVuIEhvZW5pY2tlLCAiCi0iT25ubyBIb3ZlcnMsICIKLSJKZWZmcmV5IEhzdSwgIgotIk1pZ3VlbCBkZSBJY2F6YSwgIgotIkp1a2thIElpdm9uZW4sICIKLSJMZWUgSmFla2lsLCAiCi0iQWxleGFuZHJlIEp1bGxpYXJkLCAiCi0iQmFuZyBKdW4tWW91bmcsICIKLSJQYXZlbCBLYW5rb3Zza3ksICIKLSJKb2NoZW4gS2FycmVyLCAiCi0iQW5kcmVhcyBLaXJzY2hiYXVtLCAiCi0iQWxicmVjaHQgS2xlaW5lLCAiCi0iSm9uIEtvbnJhdGgsICIKLSJBbGV4IEtvcm9ia2EsICIKLSJHcmVnIEtyZWlkZXIsICIKLSJBbmFuZCBLdW1yaWEsICIKLSJTY290dCBBLiBMYWlyZCwgIgotIkFuZHJldyBMZXd5Y2t5LCAiCi0iTWFydGluIHZvbiBMb2V3aXMsICIKLSJNaWNoaWVsIHZhbiBMb29uLCAiCi0iS2VubmV0aCBNYWNEb25hbGQsICIKLSJQZXRlciBNYWNEb25hbGQsICIKLSJXaWxsaWFtIE1hZ3JvLCAiCi0iSnVlcmdlbiBNYXJxdWFyZHQsICIKLSJSaWNhcmRvIE1hc3Nhcm8sICIKLSJNYXJjdXMgTWVpc3NuZXIsICIKLSJHcmFoYW0gTWVuaGVubml0dCwgIgotIkRhdmlkIE1ldGNhbGZlLCAiCi0iQnJ1Y2UgTWlsbmVyLCAiCi0iU3RlZmZlbiBNb2VsbGVyLCAiCi0iQW5kcmVhcyBNb2hyLCAiCi0iUGhpbGlwcGUgRGUgTXV5dGVyLCAiCi0iSXRhaSBOYWhzaG9uLCAiCi0iSGVucmlrIE9sc2VuLCAiCi0iTWljaGFlbCBQYXRyYSwgIgotIkRpbWl0cmllIE8uIFBhdW4sICIKLSJKaW0gUGV0ZXJzb24sICIKLSJSb2JlcnQgUG91bGlvdCwgIgotIktlaXRoIFJleW5vbGRzLCAiCi0iU2xhdmVuIFJlemljLCAiCi0iSm9obiBSaWNoYXJkc29uLCAiCi0iUmljayBSaWNoYXJkc29uLCAiCi0iRG91ZyBSaWRnd2F5LCAiCi0iQmVybmhhcmQgUm9zZW5rcmFlbnplciwgIgotIkpvaGFubmVzIFJ1c2NoZWluc2tpLCAiCi0iVGhvbWFzIFNhbmRmb3JkLCAiCi0iQ29uc3RhbnRpbmUgU2FwdW50emFraXMsICIKLSJQYWJsbyBTYXJhdHhhZ2EsICIKLSJEYW5pZWwgU2NoZXBsZXIsICIKLSJQZXRlciBTY2hsYWlsZSwgIgotIlVscmljaCBTY2htaWQsICIKLSJCZXJuZCBTY2htaWR0LCAiCi0iSW5nbyBTY2huZWlkZXIsICIKLSJWaWN0b3IgU2NobmVpZGVyLCAiCi0iWW5ndmkgU2lndXJqb25zc29uLCAiCi0iU3RlcGhlbiBTaW1tb25zLCAiCi0iUmljayBTbGFka2V5LCAiCi0iV2lsbGlhbSBTbWl0aCwgIgotIkRvbWluaWsgU3RyYXNzZXIsICIKLSJWYWRpbSBTdHJpemhldnNreSwgIgotIkVyaWsgU3ZlbmRzZW4sICIKLSJUcmlzdGFuIFRhcnJhbnQsICIKLSJBbmRyZXcgVGF5bG9yLCAiCi0iRHVuY2FuIEMgVGhvbXNvbiwgIgotIkdvcmFuIFRoeW5pLCAiCi0iSmltbXkgVGlydGF3YW5nc2EsICIKLSJKb24gVG9tYnMsICIKLSJMaW51cyBUb3J2YWxkcywgIgotIkdyZWdvcnkgVHJ1YmV0c2tveSwgIgotIlBldHJpIFR1b21vbGEsICIKLSJNaWNoYWVsIFZla3NsZXIsICIKLSJTdmVuIFZlcmRvb2xhZWdlLCAiCi0iUm9uYW4gV2FpZGUsICIKLSJFcmljIFdhcm5rZSwgIgotIk1hbmZyZWQgV2VpY2hlbCwgIgotIk1vcnRlbiBXZWxpbmRlciwgIgotIkxhd3NvbiBXaGl0bmV5LCAiCi0iSmFuIFdpbGxhbW93aXVzLCAiCi0iQ2FybCBXaWxsaWFtcywgIgotIkthcmwgR3VlbnRlciBXdWVuc2NoLCAiCi0iRXJpYyBZb3VuZ2RhbGUsICIKLSJKYW1lcyBZb3VuZ21hbiwgIgotIk1pa29sYWogWmFsZXdza2ksICIKLSJhbmQgSm9obiBaZXJvLiI7CiAKIGNvbnN0IFdJTkVfTEFOR1VBR0VfREVGIExhbmd1YWdlc1tdID0KIHsKQEAgLTE4MywxOSArNjYsMTMgQEAKIFdpbmRvdyByb290V2luZG93OwogaW50IHNjcmVlbldpZHRoID0gMCwgc2NyZWVuSGVpZ2h0ID0gMDsgIC8qIERlc2t0b3Agd2luZG93IGRpbWVuc2lvbnMgKi8KIGludCBzY3JlZW5EZXB0aCA9IDA7ICAvKiBTY3JlZW4gZGVwdGggdG8gdXNlICovCi1pbnQgZGVza3RvcFggPSAwLCBkZXNrdG9wWSA9IDA7ICAvKiBEZXNrdG9wIHdpbmRvdyBwb3NpdGlvbiAoaWYgYW55KSAqLwotCi0vKiBEZWZhdWx0IHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgLXdpbnZlciB3aW4zMSAqLwotc3RhdGljIExPTkcgZ2V0VmVyc2lvbjE2ID0gTUFLRUxPTkcoIFdJTlZFUlNJT04sIDB4MDYxNiApOyAvKiBET1MgNi4yMiAqLwotc3RhdGljIExPTkcgZ2V0VmVyc2lvbjMyID0gTUFLRUxPTkcoIFdJTlZFUlNJT04sIDB4ODAwMCApOwotc3RhdGljIE9TVkVSU0lPTklORk8zMkEgZ2V0VmVyc2lvbkV4ID0geyBzaXplb2YoT1NWRVJTSU9OSU5GTzMyQSksIDMsIDEwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJfUExBVEZPUk1fV0lOMzJzLCAiV2luMzJzIDEuMyIgfTsKIAogc3RydWN0IG9wdGlvbnMgT3B0aW9ucyA9CiB7ICAvKiBkZWZhdWx0IG9wdGlvbnMgKi8KICAgICBOVUxMLCAgICAgICAgICAgLyogZGVza3RvcEdlb21ldHJ5ICovCiAgICAgTlVMTCwgICAgICAgICAgIC8qIHByb2dyYW1OYW1lICovCiAgICAgTlVMTCwgICAgICAgICAgIC8qIGFyZ3YwICovCisgICAgTlVMTCwgICAgICAgICAgIC8qIGRsbEZsYWdzICovCiAgICAgRkFMU0UsICAgICAgICAgIC8qIHVzZVByaXZhdGVNYXAgKi8KICAgICBGQUxTRSwgICAgICAgICAgLyogdXNlRml4ZWRNYXAgKi8KICAgICBGQUxTRSwgICAgICAgICAgLyogc3luY2hyb25vdXMgKi8KQEAgLTI2MiwyMCArMTM5LDE5IEBACiAgICIgICAgLXBlcmZlY3QgICAgICAgIEZhdm9yIGNvcnJlY3RuZXNzIG92ZXIgc3BlZWQgZm9yIGdyYXBoaWNhbCBvcGVyYXRpb25zXG4iIFwKICAgIiAgICAtcHJpdmF0ZW1hcCAgICAgVXNlIGEgcHJpdmF0ZSBjb2xvciBtYXBcbiIgXAogICAiICAgIC1zeW5jaHJvbm91cyAgICBUdXJuIG9uIHN5bmNocm9ub3VzIGRpc3BsYXkgbW9kZVxuIiBcCi0gICIgICAgLXdpbnZlciAgICAgICAgIFZlcnNpb24gdG8gaW1pdGF0ZSAob25lIG9mIHdpbjMxLHdpbjk1LG50MzUxKVxuIgorICAiICAgIC12ZXJzaW9uICAgICAgICBEaXNwbGF5IHRoZSBXaW5lIHZlcnNpb25cbiIgXAorICAiICAgIC13aW52ZXIgICAgICAgICBWZXJzaW9uIHRvIGltaXRhdGUgKG9uZSBvZiB3aW4zMSx3aW45NSxudDM1MSxudDQwKVxuIgogCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTUFJTl9Vc2FnZQogICovCi0jaWZuZGVmIFdJTkVMSUIzMgogdm9pZCBNQUlOX1VzYWdlKCBjaGFyICpuYW1lICkKIHsKICAgICBmcHJpbnRmKCBzdGRlcnIsIFVTQUdFLCBuYW1lICk7CiAgICAgZXhpdCgxKTsKIH0KLSNlbmRpZgogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzc1LDcgKzI1MSw2IEBACiAKICNlbmRpZgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1BSU5fUGFyc2VMYW5ndWFnZU9wdGlvbgogICoKQEAgLTQxOSw0OCArMjk0LDYgQEAKICAgICB9CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTUFJTl9QYXJzZVZlcnNpb24KLSAqLwotc3RhdGljIHZvaWQgTUFJTl9QYXJzZVZlcnNpb24oIGNoYXIgKmFyZyApCi17Ci0gICAgLyogSWYgeW91IGFkZCBhbnkgb3RoZXIgb3B0aW9ucywgCi0gICAgICAgdmVyaWZ5IHRoZSB2YWx1ZXMgeW91IHJldHVybiBvbiB0aGUgcmVhbCB0aGluZyAqLwotICAgIGlmKHN0cmNtcChhcmcsIndpbjMxIik9PTApIAotICAgIHsKLSAgICAgICAgZ2V0VmVyc2lvbjE2ID0gMHgwNjE2MEEwMzsKLSAgICAgICAgLyogRklYTUU6IE15IFdpbjMycyBpbnN0YWxsYXRpb24gZmFpbGVkIHRvIGV4ZWN1dGUgdGhlCi0gICAgICAgICAgIE1TVkMgNCB0ZXN0IHByb2dyYW0uIFNvIGNoZWNrIHRoZXNlIHZhbHVlcyAqLwotICAgICAgICBnZXRWZXJzaW9uMzIgPSAweDgwMDAwQTAzOwotICAgICAgICBnZXRWZXJzaW9uRXguZHdNYWpvclZlcnNpb249MzsKLSAgICAgICAgZ2V0VmVyc2lvbkV4LmR3TWlub3JWZXJzaW9uPTEwOwotICAgICAgICBnZXRWZXJzaW9uRXguZHdCdWlsZE51bWJlcj0wOwotICAgICAgICBnZXRWZXJzaW9uRXguZHdQbGF0Zm9ybUlkPVZFUl9QTEFURk9STV9XSU4zMnM7Ci0gICAgICAgIHN0cmNweShnZXRWZXJzaW9uRXguc3pDU0RWZXJzaW9uLCJXaW4zMnMgMS4zIik7Ci0gICAgfQotICAgIGVsc2UgaWYoc3RyY21wKGFyZywgIndpbjk1Iik9PTApCi0gICAgewotICAgICAgICBnZXRWZXJzaW9uMTYgPSAweDA3MDA1RjAzOwotICAgICAgICBnZXRWZXJzaW9uMzIgPSAweEMwMDAwMDA0OwotICAgICAgICBnZXRWZXJzaW9uRXguZHdNYWpvclZlcnNpb249NDsKLSAgICAgICAgZ2V0VmVyc2lvbkV4LmR3TWlub3JWZXJzaW9uPTA7Ci0gICAgICAgIGdldFZlcnNpb25FeC5kd0J1aWxkTnVtYmVyPTB4NDAwMDNCNjsKLSAgICAgICAgZ2V0VmVyc2lvbkV4LmR3UGxhdGZvcm1JZD1WRVJfUExBVEZPUk1fV0lOMzJfV0lORE9XUzsKLSAgICAgICAgc3RyY3B5KGdldFZlcnNpb25FeC5zekNTRFZlcnNpb24sIiIpOwotICAgIH0KLSAgICBlbHNlIGlmKHN0cmNtcChhcmcsICJudDM1MSIpPT0wKQotICAgIHsKLSAgICAgICAgZ2V0VmVyc2lvbjE2ID0gMHgwNTAwMEEwMzsKLSAgICAgICAgZ2V0VmVyc2lvbjMyID0gMHgwNDIxMzMwMzsKLSAgICAgICAgZ2V0VmVyc2lvbkV4LmR3TWFqb3JWZXJzaW9uPTM7Ci0gICAgICAgIGdldFZlcnNpb25FeC5kd01pbm9yVmVyc2lvbj01MTsKLSAgICAgICAgZ2V0VmVyc2lvbkV4LmR3QnVpbGROdW1iZXI9MHg0MjE7Ci0gICAgICAgIGdldFZlcnNpb25FeC5kd1BsYXRmb3JtSWQ9VkVSX1BMQVRGT1JNX1dJTjMyX05UOwotICAgICAgICBzdHJjcHkoZ2V0VmVyc2lvbkV4LnN6Q1NEVmVyc2lvbiwiU2VydmljZSBQYWNrIDIiKTsKLSAgICB9Ci0gICAgZWxzZSBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gd2ludmVyIHN5c3RlbSBjb2RlIC0gaWdub3JlZFxuIik7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1BSU5fUGFyc2VPcHRpb25zCiAgKgpAQCAtNDc4LDE5ICszMTEsMTUgQEAKICAgICBPcHRpb25zLmFyZ3YwID0gYXJndlswXTsKIAogICAgICAgLyogR2V0IGRpc3BsYXkgbmFtZSBmcm9tIGNvbW1hbmQgbGluZSAqLwotICAgIGZvciAoaSA9IDE7IGkgPCAqYXJnYyAtIDE7IGkrKykKLSAgICAgICAgaWYgKCFzdHJjbXAoIGFyZ3ZbaV0sICItZGlzcGxheSIgKSkKLQl7Ci0JICAgIGRpc3BsYXlfbmFtZSA9IGFyZ3ZbaSsxXTsKLQkgICAgYnJlYWs7CisgICAgZm9yIChpID0gMTsgaSA8ICphcmdjOyBpKyspCisgICAgeworICAgICAgICBpZiAoIXN0cmNtcCggYXJndltpXSwgIi1kaXNwbGF5IiApKSBkaXNwbGF5X25hbWUgPSBhcmd2W2krMV07CisgICAgICAgIGlmICghc3RyY21wKCBhcmd2W2ldLCAiLXYiICkgfHwgIXN0cmNtcCggYXJndltpXSwgIi12ZXJzaW9uIiApKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoICIlc1xuIiwgV0lORV9SRUxFQVNFX0lORk8gKTsKKyAgICAgICAgICAgIGV4aXQoMCk7CiAgICAgICAgIH0KLQotI2lmZGVmIFdJTkVMSUIKLSAgICAvKiBOZWVkIHRvIGFzc2VtYmxlIGNvbW1hbmQgbGluZSBhbmQgcGFzcyBpdCB0byBXaW5NYWluICovCi0jZWxzZQotICAgIGlmICgqYXJnYyA8IDIgfHwgbHN0cmNtcGkzMkEoYXJndlsxXSwgIi1oIikgPT0gMCkgCi0gICAgCU1BSU5fVXNhZ2UoIGFyZ3ZbMF0gKTsKLSNlbmRpZgorICAgIH0KIAogICAgICAgLyogT3BlbiBkaXNwbGF5ICovCiAKQEAgLTU3NCwyNCArNDAzLDIwIEBACiAjZW5kaWYKICAgICAgIH0KIAotICAgICAgaWYoTUFJTl9HZXRSZXNvdXJjZSggZGIsICIuZGxsIiwgJnZhbHVlKSkKKyAgICAgIGlmIChNQUlOX0dldFJlc291cmNlKCBkYiwgIi5kbGwiLCAmdmFsdWUpKQogICAgICAgewotI2lmbmRlZiBXSU5FTElCCi0gICAgICAgICAgaWYgKCFCVUlMVElOX1BhcnNlRExMT3B0aW9ucyggKGNoYXIqKXZhbHVlLmFkZHIgKSkKKyAgICAgICAgICAvKiBIYWNrOiBzdG9yZSBvcHRpb24gdmFsdWUgaW4gT3B0aW9ucyB0byBiZSByZXRyaWV2ZWQgKi8KKyAgICAgICAgICAvKiBsYXRlciBvbiBpbnNpZGUgdGhlIGVtdWxhdG9yIGNvZGUuICovCisgICAgICAgICAgaWYgKCFfX3dpbmVsaWIpIE9wdGlvbnMuZGxsRmxhZ3MgPSB4c3RyZHVwKChjaGFyICopdmFsdWUuYWRkcik7CisgICAgICAgICAgZWxzZQogICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiBTeW50YXg6IC1kbGwgK3h4eCwuLi4gb3IgLWRsbCAteHh4LC4uLlxuIixhcmd2WzBdKTsKLSAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkV4YW1wbGU6IC1kbGwgLW9sZTIgICAgRG8gbm90IHVzZSBlbXVsYXRlZCBPTEUyLkRMTFxuIik7Ci0gICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJBdmFpbGFibGUgRExMczpcbiIpOwotICAgICAgICAgICAgICBCVUlMVElOX1ByaW50RExMcygpOworICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICItZGxsIG5vdCBzdXBwb3J0ZWQgaW4gV2luZWxpYlxuIiApOwogICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgZnByaW50ZihzdGRlcnIsIi1kbGwgbm90IHN1cHBvcnRlZCBpbiBsaWJ3aW5lXG4iKTsKLSNlbmRpZgogICAgICAgfQogCi0gICAgICBpZihNQUlOX0dldFJlc291cmNlKCBkYiwgIi53aW52ZXIiLCAmdmFsdWUpKQotICAgICAgICAgIE1BSU5fUGFyc2VWZXJzaW9uKCAoY2hhciopdmFsdWUuYWRkciApOworICAgICAgaWYgKE1BSU5fR2V0UmVzb3VyY2UoIGRiLCAiLndpbnZlciIsICZ2YWx1ZSkpCisgICAgICAgICAgVkVSU0lPTl9QYXJzZVZlcnNpb24oIChjaGFyKil2YWx1ZS5hZGRyICk7CiB9CiAKIApAQCAtNjAwLDcgKzQyNSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIE1BSU5fQ3JlYXRlRGVza3RvcCggaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSApCiB7Ci0gICAgaW50IGZsYWdzOworICAgIGludCB4LCB5LCBmbGFnczsKICAgICB1bnNpZ25lZCBpbnQgd2lkdGggPSA2NDAsIGhlaWdodCA9IDQ4MDsgIC8qIERlZmF1bHQgc2l6ZSA9IDY0MHg0ODAgKi8KICAgICBjaGFyICpuYW1lID0gIldpbmUgZGVza3RvcCI7CiAgICAgWFNpemVIaW50cyAqc2l6ZV9oaW50czsKQEAgLTYxMCw4ICs0MzUsNyBAQAogICAgIFhUZXh0UHJvcGVydHkgd2luZG93X25hbWU7CiAgICAgQXRvbSBYQV9XTV9ERUxFVEVfV0lORE9XOwogCi0gICAgZmxhZ3MgPSBYUGFyc2VHZW9tZXRyeSggT3B0aW9ucy5kZXNrdG9wR2VvbWV0cnksCi0JCQkgICAgJmRlc2t0b3BYLCAmZGVza3RvcFksICZ3aWR0aCwgJmhlaWdodCApOworICAgIGZsYWdzID0gWFBhcnNlR2VvbWV0cnkoIE9wdGlvbnMuZGVza3RvcEdlb21ldHJ5LCAmeCwgJnksICZ3aWR0aCwgJmhlaWdodCApOwogICAgIHNjcmVlbldpZHRoICA9IHdpZHRoOwogICAgIHNjcmVlbkhlaWdodCA9IGhlaWdodDsKIApAQCAtNjE5LDEyICs0NDMsMTEgQEAKIAogICAgIHdpbl9hdHRyLmV2ZW50X21hc2sgPSBFeHBvc3VyZU1hc2sgfCBLZXlQcmVzc01hc2sgfCBLZXlSZWxlYXNlTWFzayB8CiAJICAgICAgICAgICAgICAgICBQb2ludGVyTW90aW9uTWFzayB8IEJ1dHRvblByZXNzTWFzayB8Ci0JCQkgQnV0dG9uUmVsZWFzZU1hc2sgfCBFbnRlcldpbmRvd01hc2sgfCAKLQkJCSBTdHJ1Y3R1cmVOb3RpZnlNYXNrOworCQkJIEJ1dHRvblJlbGVhc2VNYXNrIHwgRW50ZXJXaW5kb3dNYXNrOwogICAgIHdpbl9hdHRyLmN1cnNvciA9IFhDcmVhdGVGb250Q3Vyc29yKCBkaXNwbGF5LCBYQ190b3BfbGVmdF9hcnJvdyApOwogCiAgICAgcm9vdFdpbmRvdyA9IFhDcmVhdGVXaW5kb3coIGRpc3BsYXksIERlZmF1bHRSb290V2luZG93KGRpc3BsYXkpLAotCQkJICAgICAgICBkZXNrdG9wWCwgZGVza3RvcFksIHdpZHRoLCBoZWlnaHQsIDAsCisJCQkgICAgICAgIHgsIHksIHdpZHRoLCBoZWlnaHQsIDAsCiAJCQkgICAgICAgIENvcHlGcm9tUGFyZW50LCBJbnB1dE91dHB1dCwgQ29weUZyb21QYXJlbnQsCiAJCQkgICAgICAgIENXRXZlbnRNYXNrIHwgQ1dDdXJzb3IsICZ3aW5fYXR0ciApOwogCkBAIC04MDcsOTkgKzYzMCw2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgIEdldFZlcnNpb24xNiAgIChLRVJORUwuMykKLSAqLwotTE9ORyBXSU5BUEkgR2V0VmVyc2lvbjE2KHZvaWQpCi17Ci0gICAgcmV0dXJuIGdldFZlcnNpb24xNjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgR2V0VmVyc2lvbjMyICAgKEtFUk5FTDMyLjQyNykKLSAqLwotTE9ORyBXSU5BUEkgR2V0VmVyc2lvbjMyKHZvaWQpCi17Ci0gICAgcmV0dXJuIGdldFZlcnNpb24zMjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgR2V0VmVyc2lvbkV4QQotICovCi1CT09MMzIgV0lOQVBJIEdldFZlcnNpb25FeDMyQShPU1ZFUlNJT05JTkZPMzJBICp2KQotewotICAgIGlmKHYtPmR3T1NWZXJzaW9uSW5mb1NpemUhPXNpemVvZihPU1ZFUlNJT05JTkZPMzJBKSkKLSAgICB7Ci0gICAgICAgIGZwcmludGYoc3RkZGViLCJ3cm9uZyBPU1ZFUlNJT05JTkZPIHNpemUgZnJvbSBhcHAiKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICB2LT5kd01ham9yVmVyc2lvbiA9IGdldFZlcnNpb25FeC5kd01ham9yVmVyc2lvbjsKLSAgICB2LT5kd01pbm9yVmVyc2lvbiA9IGdldFZlcnNpb25FeC5kd01pbm9yVmVyc2lvbjsKLSAgICB2LT5kd0J1aWxkTnVtYmVyID0gZ2V0VmVyc2lvbkV4LmR3QnVpbGROdW1iZXI7Ci0gICAgdi0+ZHdQbGF0Zm9ybUlkID0gZ2V0VmVyc2lvbkV4LmR3UGxhdGZvcm1JZDsKLSAgICBzdHJjcHkodi0+c3pDU0RWZXJzaW9uLCBnZXRWZXJzaW9uRXguc3pDU0RWZXJzaW9uKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBHZXRWZXJzaW9uRXhXCi0gKi8KLUJPT0wzMiBXSU5BUEkgR2V0VmVyc2lvbkV4MzJXKE9TVkVSU0lPTklORk8zMlcgKnYpCi17Ci0JT1NWRVJTSU9OSU5GTzMyQSB2MTsKLQlpZih2LT5kd09TVmVyc2lvbkluZm9TaXplIT1zaXplb2YoT1NWRVJTSU9OSU5GTzMyVykpCi0JewotCQlmcHJpbnRmKHN0ZGRlYiwid3JvbmcgT1NWRVJTSU9OSU5GTyBzaXplIGZyb20gYXBwIik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JdjEuZHdPU1ZlcnNpb25JbmZvU2l6ZT1zaXplb2YodjEpOwotCUdldFZlcnNpb25FeDMyQSgmdjEpOwotCXYtPmR3TWFqb3JWZXJzaW9uID0gdjEuZHdNYWpvclZlcnNpb247Ci0Jdi0+ZHdNaW5vclZlcnNpb24gPSB2MS5kd01pbm9yVmVyc2lvbjsKLQl2LT5kd0J1aWxkTnVtYmVyID0gdjEuZHdCdWlsZE51bWJlcjsKLQl2LT5kd1BsYXRmb3JtSWQgPSB2MS5kd1BsYXRmb3JtSWQ7Ci0gICAgICAgIGxzdHJjcHlBdG9XKCB2LT5zekNTRFZlcnNpb24sIHYxLnN6Q1NEVmVyc2lvbiApOwotCXJldHVybiBUUlVFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCUdldFdpbkZsYWdzIChLRVJORUwuMTMyKQotICovCi1EV09SRCBXSU5BUEkgR2V0V2luRmxhZ3Modm9pZCkKLXsKLSAgc3RhdGljIGNvbnN0IGxvbmcgY3B1ZmxhZ3NbNV0gPQotICAgIHsgV0ZfQ1BVMDg2LCBXRl9DUFUxODYsIFdGX0NQVTI4NiwgV0ZfQ1BVMzg2LCBXRl9DUFU0ODYgfTsKLSAgU1lTVEVNX0lORk8Jc2k7Ci0gIGxvbmcgcmVzdWx0ID0gMCxjcHVmbGFnOwotCi0gIEdldFN5c3RlbUluZm8oJnNpKTsKLQotICAvKiBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55IFBlbnRpdW0gZmxhZy4gICovCi0gIGNwdWZsYWcgPSBjcHVmbGFnc1tNSU4gKHNpLndQcm9jZXNzb3JMZXZlbCwgNCldOwotCi0gIHN3aXRjaChPcHRpb25zLm1vZGUpIHsKLSAgY2FzZSBNT0RFX1NUQU5EQVJEOgotICAgIHJlc3VsdCA9IChXRl9TVEFOREFSRCB8IGNwdWZsYWcgfCBXRl9QTU9ERSB8IFdGXzgweDg3KTsKLSAgICBicmVhazsKLQotICBjYXNlIE1PREVfRU5IQU5DRUQ6Ci0gICAgcmVzdWx0ID0gKFdGX0VOSEFOQ0VEIHwgY3B1ZmxhZyB8IFdGX1BNT0RFIHwgV0ZfODB4ODcgfCBXRl9QQUdJTkcpOwotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIG1vZGUgc2V0PyBUaGlzIHNob3VsZG4ndCBoYXBwZW4uIENoZWNrIEdldFdpbkZsYWdzKCkhXG4iKTsKLSAgICBicmVhazsKLSAgfQotICBpZiAoc2kud1Byb2Nlc3NvckxldmVsPj00KQotICAgICAgcmVzdWx0IHw9IFdGX0hBU0NQVUlEOwotICBpZiggZ2V0VmVyc2lvbkV4LmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQgKQotICAgICAgcmVzdWx0IHw9IFdGX1dJTjMyV09XOyAvKiB1bmRvY3VtZW50ZWQgV0ZfV0lOTlQgKi8KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKglHZXRUaW1lclJlc29sdXRpb24gKFVTRVIuMTQpCiAgKi8KIExPTkcgV0lOQVBJIEdldFRpbWVyUmVzb2x1dGlvbih2b2lkKQpAQCAtMTMwMiwyNyArMTAzMiwzIEBACiB7CiAJcHJpbnRmKCJGaWxlQ0RSKCU4eClcbiIsIChpbnQpIHgpOwogfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoJR2V0V2luRGVidWdJbmZvIChLRVJORUwuMzU1KQotKi8KLUJPT0wxNiBXSU5BUEkgR2V0V2luRGVidWdJbmZvKFdJTkRFQlVHSU5GTyAqbHB3ZGksIFVJTlQxNiBmbGFncykKLXsKLQlwcmludGYoIkdldFdpbkRlYnVnSW5mbyglOGx4LCVkKSBzdHViIHJldHVybmluZyAwXG4iLCAodW5zaWduZWQgbG9uZylscHdkaSwgZmxhZ3MpOwotCS8qIDAgbWVhbnMgbm90IGluIGRlYnVnZ2luZyBtb2RlL3ZlcnNpb24gKi8KLQkvKiBDYW4gdGhpcyB0eXBlIG9mIGRlYnVnZ2luZyBiZSB1c2VkIGluIHdpbmUgPyAqLwotCS8qIENvbnN0YW50czogV0RJX09QVElPTlMgV0RJX0ZJTFRFUiBXRElfQUxMT0NCUkVBSyAqLwotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoJR2V0V2luRGVidWdJbmZvIChLRVJORUwuMzU1KQotKi8KLUJPT0wxNiBXSU5BUEkgU2V0V2luRGVidWdJbmZvKFdJTkRFQlVHSU5GTyAqbHB3ZGkpCi17Ci0JcHJpbnRmKCJTZXRXaW5EZWJ1Z0luZm8oJThseCkgc3R1YiByZXR1cm5pbmcgMFxuIiwgKHVuc2lnbmVkIGxvbmcpbHB3ZGkpOwotCS8qIDAgbWVhbnMgbm90IGluIGRlYnVnZ2luZyBtb2RlL3ZlcnNpb24gKi8KLQkvKiBDYW4gdGhpcyB0eXBlIG9mIGRlYnVnZ2luZyBiZSB1c2VkIGluIHdpbmUgPyAqLwotCS8qIENvbnN0YW50czogV0RJX09QVElPTlMgV0RJX0ZJTFRFUiBXRElfQUxMT0NCUkVBSyAqLwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbWlzYy9vbGUybmxzLmMgYi9taXNjL29sZTJubHMuYwppbmRleCA1MjY0YzQ2Li42ZjE4MTAwIDEwMDY0NAotLS0gYS9taXNjL29sZTJubHMuYworKysgYi9taXNjL29sZTJubHMuYwpAQCAtMjExMiw3ICsyMTEyLDcgQEAKIElOVDMyIFdJTkFQSSBHZXREYXRlRm9ybWF0MzJBKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLExQU1lTVEVNVElNRSB4dGltZSwKIAkJCSAgICAgIExQQ1NUUiBmb3JtYXQsIExQU1RSIGRhdGUsSU5UMzIgZGF0ZWxlbgogKSB7Ci0JZnByaW50ZihzdGRlcnIsIkdldERhdGVGb3JtYXQoMHglMDR4LDB4JTA4bHgsJXAsJXMsJXAsJWQpLCBzdHViXG4iLAorCWZwcmludGYoc3RkZXJyLCJHZXREYXRlRm9ybWF0KDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZCksIHN0dWJcbiIsCiAJCWxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsZGF0ZSxkYXRlbGVuCiAJKTsKIAlsc3RyY3B5bjMyQShkYXRlLCIxLjQuMTk5NyIsZGF0ZWxlbik7CkBAIC0yMTIyLDcgKzIxMjIsNyBAQAogSU5UMzIgV0lOQVBJIEdldFRpbWVGb3JtYXQzMkEoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsTFBTWVNURU1USU1FIHh0aW1lLAogCQkJICAgICAgTFBDU1RSIGZvcm1hdCwgTFBTVFIgdGltZXN0cixJTlQzMiB0aW1lbGVuCiApIHsKLQlmcHJpbnRmKHN0ZGVyciwiR2V0RGF0ZUZvcm1hdCgweCUwNHgsMHglMDhseCwlcCwlcywlcCwlZCksIHN0dWJcbiIsCisJZnByaW50ZihzdGRlcnIsIkdldERhdGVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKSwgc3R1YlxuIiwKIAkJbG9jYWxlLGZsYWdzLHh0aW1lLGZvcm1hdCx0aW1lc3RyLHRpbWVsZW4KIAkpOwogCWxzdHJjcHluMzJBKHRpbWVzdHIsIjAwOjAwOjQyIix0aW1lbGVuKTsKZGlmZiAtLWdpdCBhL21pc2MvcmVnaXN0cnkuYyBiL21pc2MvcmVnaXN0cnkuYwppbmRleCBhMmM0N2IwLi4zY2RkZDY5IDEwMDY0NAotLS0gYS9taXNjL3JlZ2lzdHJ5LmMKKysrIGIvbWlzYy9yZWdpc3RyeS5jCkBAIC0xMDU0LDE3ICsxMDU0LDI3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgX3c5NWtleSoKIF93OTVka2Vsb29rdXAodW5zaWduZWQgbG9uZyBka2VhZGRyLGludCBuLHN0cnVjdCBfdzk1bnIyZGEgKm5yMmRhLHN0cnVjdCBfdzk1a2V5ICprZXlzKSB7Ci0JaW50CWksb2ZmOworCWludAlpOworICAgICAgICBpbnQgICAgIGxlZnQsIHJpZ2h0OwogCiAJaWYgKGRrZWFkZHIgPT0gMHhGRkZGRkZGRikKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKGRrZWFkZHI8MHgyMCkKIAkJcmV0dXJuIE5VTEw7CiAJZGtlYWRkcj1fdzk1X2Fkal9kYShka2VhZGRyKzB4MWMpOwotCW9mZiA9IChka2VhZGRyLTB4M2MpLzB4MWM7Ci0JZm9yIChpPTA7aTxuO2krKykKLQkJaWYgKG5yMmRhWyhpK29mZiklbl0uZGtlYWRkciA9PSBka2VhZGRyKQotCQkJcmV0dXJuIGtleXMrbnIyZGFbKGkrb2ZmKSVuXS5ucjsKKyAgICAgICAgbGVmdD0wOworICAgICAgICByaWdodD1uLTE7CisgICAgICAgIHdoaWxlKGxlZnQ8PXJpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgIGk9KGxlZnQrcmlnaHQpLzI7CisgICAgICAgICAgIAorICAgICAgICAgICBpZihucjJkYVtpXS5ka2VhZGRyID09IGRrZWFkZHIpCisgICAgICAgICAgICAgIHJldHVybiBrZXlzK25yMmRhW2ldLm5yOworICAgICAgICAgICBlbHNlIGlmKG5yMmRhW2ldLmRrZWFkZHIgPCBka2VhZGRyKQorICAgICAgICAgICAgICBsZWZ0PWkrMTsKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICByaWdodD1pLTE7CisgICAgICAgIH0KIAkvKiAweDNDIGhhcHBlbnMgb2Z0ZW4sIGp1c3QgcmVwb3J0IHVudXN1YWwgdmFsdWVzICovCiAJaWYgKGRrZWFkZHIhPTB4M2MpCiAJCWRwcmludGZfcmVnKHN0ZGRlYiwic2VhcmNoIGhhc24ndCBmb3VuZCBka2VhZGRyICVseD9cbiIsZGtlYWRkcik7CkBAIC0yNzU5LDIzICsyNzY5LDMwIEBACiAJCWhrZXksVzJDKGxwc3pTdWJLZXksMCkKIAkpOwogCWxwTmV4dEtleQk9IGxvb2t1cF9oa2V5KGhrZXkpOwotCWlmICghbHBOZXh0S2V5KQorCWlmICghbHBOZXh0S2V5KSB7CisJCWRwcmludGZfcmVnIChzdGRkZWIsICIgIEJhZGtleVsxXS5cbiIpOwogCQlyZXR1cm4gU0hFTExfRVJST1JfQkFES0VZOworCX0KIAkvKiB3ZSBuZWVkIHRvIGtub3cgdGhlIHByZXZpb3VzIGtleSBpbiB0aGUgaGllci4gKi8KLQlpZiAoIWxwc3pTdWJLZXkgfHwgISpscHN6U3ViS2V5KQorCWlmICghbHBzelN1YktleSB8fCAhKmxwc3pTdWJLZXkpIHsKKwkJZHByaW50Zl9yZWcgKHN0ZGRlYiwgIiAgQmFka2V5WzJdLlxuIik7CiAJCXJldHVybiBTSEVMTF9FUlJPUl9CQURLRVk7CisJfQogCXNwbGl0X2tleXBhdGgobHBzelN1YktleSwmd3BzLCZ3cGMpOwogCWkgCT0gMDsKIAlscHhrZXkJPSBscE5leHRLZXk7CiAJd2hpbGUgKGk8d3BjLTEpIHsKIAkJbHB4a2V5PWxwTmV4dEtleS0+bmV4dHN1YjsKIAkJd2hpbGUgKGxweGtleSkgeworCQkJZHByaW50Zl9yZWcgKHN0ZGRlYiwgIiAgU2Nhbm5pbmcgWyVzXVxuIiwKKwkJCQkgICAgIFcyQyAobHB4a2V5LT5rZXluYW1lLCAwKSk7CiAJCQlpZiAoIWxzdHJjbXBpMzJXKHdwc1tpXSxscHhrZXktPmtleW5hbWUpKQogCQkJCWJyZWFrOwogCQkJbHB4a2V5PWxweGtleS0+bmV4dDsKIAkJfQogCQlpZiAoIWxweGtleSkgewogCQkJRlJFRV9LRVlfUEFUSDsKKwkJCWRwcmludGZfcmVnIChzdGRkZWIsICIgIE5vdCBmb3VuZC5cbiIpOwogCQkJLyogbm90IGZvdW5kIGlzIHN1Y2Nlc3MgKi8KIAkJCXJldHVybiBTSEVMTF9FUlJPUl9TVUNDRVNTOwogCQl9CkBAIC0yNzg1LDE1ICsyODAyLDI0IEBACiAJbHB4a2V5CT0gbHBOZXh0S2V5LT5uZXh0c3ViOwogCWxwbHBQcmV2S2V5ID0gJihscE5leHRLZXktPm5leHRzdWIpOwogCXdoaWxlIChscHhrZXkpIHsKKwkJZHByaW50Zl9yZWcgKHN0ZGRlYiwgIiAgU2Nhbm5pbmcgWyVzXVxuIiwKKwkJCSAgICAgVzJDIChscHhrZXktPmtleW5hbWUsIDApKTsKIAkJaWYgKCFsc3RyY21waTMyVyh3cHNbaV0sbHB4a2V5LT5rZXluYW1lKSkKIAkJCWJyZWFrOwogCQlscGxwUHJldktleQk9ICYobHB4a2V5LT5uZXh0KTsKIAkJbHB4a2V5CQk9IGxweGtleS0+bmV4dDsKIAl9Ci0JaWYgKCFscHhrZXkpCisJaWYgKCFscHhrZXkpIHsKKwkJRlJFRV9LRVlfUEFUSDsKKwkJZHByaW50Zl9yZWcgKHN0ZGRlYiwgIiAgTm90IGZvdW5kLlxuIik7CisJCXJldHVybiBTSEVMTF9FUlJPUl9CQURLRVk7CiAJCXJldHVybiBTSEVMTF9FUlJPUl9TVUNDRVNTOwotCWlmIChscHhrZXktPm5leHRzdWIpCisJfQorCWlmIChscHhrZXktPm5leHRzdWIpIHsKKwkJRlJFRV9LRVlfUEFUSDsKKwkJZHByaW50Zl9yZWcgKHN0ZGRlYiwgIiAgTm90IGVtcHR5LlxuIik7CiAJCXJldHVybiBTSEVMTF9FUlJPUl9DQU5UV1JJVEU7CisJfQogCSpscGxwUHJldktleQk9IGxweGtleS0+bmV4dDsKIAlmcmVlKGxweGtleS0+a2V5bmFtZSk7CiAJaWYgKGxweGtleS0+Y2xhc3MpCkBAIC0yODAyLDYgKzI4MjgsNyBAQAogCQlmcmVlKGxweGtleS0+dmFsdWVzKTsKIAlmcmVlKGxweGtleSk7CiAJRlJFRV9LRVlfUEFUSDsKKwlkcHJpbnRmX3JlZyAoc3RkZGViLCAiICBEb25lLlxuIik7CiAJcmV0dXJuCVNIRUxMX0VSUk9SX1NVQ0NFU1M7CiB9CiAKZGlmZiAtLWdpdCBhL21pc2Mvc2hlbGwuYyBiL21pc2Mvc2hlbGwuYwppbmRleCAwZGU2MDkzLi5hODI0YWIwIDEwMDY0NAotLS0gYS9taXNjL3NoZWxsLmMKKysrIGIvbWlzYy9zaGVsbC5jCkBAIC0xNSwxMSArMTUsMTM1IEBACiAjaW5jbHVkZSAicmVzb3VyY2UuaCIKICNpbmNsdWRlICJkbGdzLmgiCiAjaW5jbHVkZSAid2luLmgiCisjaW5jbHVkZSAiZ3JhcGhpY3MuaCIKICNpbmNsdWRlICJjdXJzb3JpY29uLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgIndpbnJlZy5oIgogCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IFNIRUxMX1Blb3BsZVtdID0KK3sKKyAgICAiQm9iIEFtc3RhZHQiLAorICAgICJEYWcgQXNoZWltIiwKKyAgICAiTWFydGluIEF5b3R0ZSIsCisgICAgIlBldGVyIEJhanVzeiIsCisgICAgIkdlb3JnIEJleWVybGUiLAorICAgICJSb3NzIEJpcm8iLAorICAgICJVd2UgQm9ubmVzIiwKKyAgICAiRXJpayBCb3MiLAorICAgICJGb25zIEJvdG1hbiIsCisgICAgIkpvaG4gQnJlemFrIiwKKyAgICAiQW5kcmV3IEJ1bGhhayIsCisgICAgIkpvaG4gQnVydG9uIiwKKyAgICAiTmllbHMgZGUgQ2FycGVudGllciIsCisgICAgIkppbWVuIENoaW5nIiwKKyAgICAiRGF2aWQgQS4gQ3V0aGJlcnQiLAorICAgICJIdXcgRC4gTS4gRGF2aWVzIiwKKyAgICAiUm9tYW4gRG9sZWpzaSIsCisgICAgIkZyYW5zIHZhbiBEb3Jzc2VsYWVyIiwKKyAgICAiQ2hyaXMgRmFoZXJ0eSIsCisgICAgIlBhdWwgRmFsc3RhZCIsCisgICAgIkRhdmlkIEZhdXJlIiwKKyAgICAiQ2xhdXMgRmlzY2hlciIsCisgICAgIk9sYWYgRmxlYmJlIiwKKyAgICAiQ2hhZCBGcmFsZWlnaCIsCisgICAgIlBldGVyIEdhbGJhdnkiLAorICAgICJSYW1vbiBHYXJjaWEiLAorICAgICJNYXR0aGV3IEdoaW8iLAorICAgICJKb2R5IEdvbGRiZXJnIiwKKyAgICAiSGFucyBkZSBHcmFhZmYiLAorICAgICJDaGFybGVzIE0uIEhhbm51bSIsCisgICAgIkFkcmlhbiBIYXJ2ZXkiLAorICAgICJKb2huIEhhcnZleSIsCisgICAgIkNhbWVyb24gSGVpZGUiLAorICAgICJKb2NoZW4gSG9lbmlja2UiLAorICAgICJPbm5vIEhvdmVycyIsCisgICAgIkplZmZyZXkgSHN1IiwKKyAgICAiTWlndWVsIGRlIEljYXphIiwKKyAgICAiSnVra2EgSWl2b25lbiIsCisgICAgIkxlZSBKYWVraWwiLAorICAgICJBbGV4YW5kcmUgSnVsbGlhcmQiLAorICAgICJCYW5nIEp1bi1Zb3VuZyIsCisgICAgIlBhdmVsIEthbmtvdnNreSIsCisgICAgIkpvY2hlbiBLYXJyZXIiLAorICAgICJBbmRyZWFzIEtpcnNjaGJhdW0iLAorICAgICJBbGJyZWNodCBLbGVpbmUiLAorICAgICJKb24gS29ucmF0aCIsCisgICAgIkFsZXggS29yb2JrYSIsCisgICAgIkdyZWcgS3JlaWRlciIsCisgICAgIkFuYW5kIEt1bXJpYSIsCisgICAgIlNjb3R0IEEuIExhaXJkIiwKKyAgICAiQW5kcmV3IExld3lja3kiLAorICAgICJNYXJ0aW4gdm9uIExvZXdpcyIsCisgICAgIk1pY2hpZWwgdmFuIExvb24iLAorICAgICJLZW5uZXRoIE1hY0RvbmFsZCIsCisgICAgIlBldGVyIE1hY0RvbmFsZCIsCisgICAgIldpbGxpYW0gTWFncm8iLAorICAgICJKdWVyZ2VuIE1hcnF1YXJkdCIsCisgICAgIlJpY2FyZG8gTWFzc2FybyIsCisgICAgIk1hcmN1cyBNZWlzc25lciIsCisgICAgIkdyYWhhbSBNZW5oZW5uaXR0IiwKKyAgICAiRGF2aWQgTWV0Y2FsZmUiLAorICAgICJCcnVjZSBNaWxuZXIiLAorICAgICJTdGVmZmVuIE1vZWxsZXIiLAorICAgICJBbmRyZWFzIE1vaHIiLAorICAgICJQaGlsaXBwZSBEZSBNdXl0ZXIiLAorICAgICJJdGFpIE5haHNob24iLAorICAgICJIZW5yaWsgT2xzZW4iLAorICAgICJNaWNoYWVsIFBhdHJhIiwKKyAgICAiRGltaXRyaWUgTy4gUGF1biIsCisgICAgIkppbSBQZXRlcnNvbiIsCisgICAgIlJvYmVydCBQb3VsaW90IiwKKyAgICAiS2VpdGggUmV5bm9sZHMiLAorICAgICJTbGF2ZW4gUmV6aWMiLAorICAgICJKb2huIFJpY2hhcmRzb24iLAorICAgICJSaWNrIFJpY2hhcmRzb24iLAorICAgICJEb3VnIFJpZGd3YXkiLAorICAgICJCZXJuaGFyZCBSb3NlbmtyYWVuemVyIiwKKyAgICAiSm9oYW5uZXMgUnVzY2hlaW5za2kiLAorICAgICJUaG9tYXMgU2FuZGZvcmQiLAorICAgICJDb25zdGFudGluZSBTYXB1bnR6YWtpcyIsCisgICAgIlBhYmxvIFNhcmF0eGFnYSIsCisgICAgIkRhbmllbCBTY2hlcGxlciIsCisgICAgIlBldGVyIFNjaGxhaWxlIiwKKyAgICAiVWxyaWNoIFNjaG1pZCIsCisgICAgIkJlcm5kIFNjaG1pZHQiLAorICAgICJJbmdvIFNjaG5laWRlciIsCisgICAgIlZpY3RvciBTY2huZWlkZXIiLAorICAgICJZbmd2aSBTaWd1cmpvbnNzb24iLAorICAgICJTdGVwaGVuIFNpbW1vbnMiLAorICAgICJSaWNrIFNsYWRrZXkiLAorICAgICJXaWxsaWFtIFNtaXRoIiwKKyAgICAiRG9taW5payBTdHJhc3NlciIsCisgICAgIlZhZGltIFN0cml6aGV2c2t5IiwKKyAgICAiRXJpayBTdmVuZHNlbiIsCisgICAgIlRyaXN0YW4gVGFycmFudCIsCisgICAgIkFuZHJldyBUYXlsb3IiLAorICAgICJEdW5jYW4gQyBUaG9tc29uIiwKKyAgICAiR29yYW4gVGh5bmkiLAorICAgICJKaW1teSBUaXJ0YXdhbmdzYSIsCisgICAgIkpvbiBUb21icyIsCisgICAgIkxpbnVzIFRvcnZhbGRzIiwKKyAgICAiR3JlZ29yeSBUcnViZXRza295IiwKKyAgICAiUGV0cmkgVHVvbW9sYSIsCisgICAgIk1pY2hhZWwgVmVrc2xlciIsCisgICAgIlN2ZW4gVmVyZG9vbGFlZ2UiLAorICAgICJSb25hbiBXYWlkZSIsCisgICAgIkVyaWMgV2FybmtlIiwKKyAgICAiTWFuZnJlZCBXZWljaGVsIiwKKyAgICAiTW9ydGVuIFdlbGluZGVyIiwKKyAgICAiTGF3c29uIFdoaXRuZXkiLAorICAgICJKYW4gV2lsbGFtb3dpdXMiLAorICAgICJDYXJsIFdpbGxpYW1zIiwKKyAgICAiS2FybCBHdWVudGVyIFd1ZW5zY2giLAorICAgICJFcmljIFlvdW5nZGFsZSIsCisgICAgIkphbWVzIFlvdW5nbWFuIiwKKyAgICAiTWlrb2xhaiBaYWxld3NraSIsCisgICAgIkpvaG4gWmVybyIsCisgICAgTlVMTAorfTsKKworCiAvKiAuSUNPIGZpbGUgSUNPTkRJUiBkZWZpbml0aW9ucyAqLwogCiAjcHJhZ21hIHBhY2soMSkKQEAgLTM5NSw2ICs1MTksMjcgQEAKICAgICBISUNPTjMyIGhJY29uOwogfSBBQk9VVF9JTkZPOwogCisjZGVmaW5lCQlJRENfU1RBVElDX1RFWFQJCTEwMAorI2RlZmluZQkJSURDX0xJU1RCT1gJCTk5CisjZGVmaW5lCQlJRENfV0lORV9URVhUCQk5OAorCisjZGVmaW5lCQlEUk9QX0ZJRUxEX1RPUAkJKC0xNSkKKyNkZWZpbmUJCURST1BfRklFTERfSEVJR0hUCTE1CisKK2V4dGVybiBISUNPTjMyIGhJY29uVGl0bGVGb250OworCitzdGF0aWMgQk9PTDMyIF9fZ2V0X2Ryb3BsaW5lKCBIV05EMzIgaFduZCwgTFBSRUNUMzIgbHByZWN0ICkKK3sKKyAgICBIV05EMzIgaFduZEN0bCA9IEdldERsZ0l0ZW0zMihoV25kLCBJRENfV0lORV9URVhUKTsKKyAgICBpZiggaFduZEN0bCApCisgICAgeworCUdldFdpbmRvd1JlY3QzMiggaFduZEN0bCwgbHByZWN0ICk7CisJTWFwV2luZG93UG9pbnRzMzIoIDAsIGhXbmQsIChMUFBPSU5UMzIpbHByZWN0LCAyICk7CisJbHByZWN0LT5ib3R0b20gPSAobHByZWN0LT50b3AgKz0gRFJPUF9GSUVMRF9UT1ApOworCXJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBBYm91dERsZ1Byb2MzMiAgKG5vdCBhbiBleHBvcnRlZCBBUEkgZnVuY3Rpb24pCkBAIC00MDIsNiArNTQ3LDcgQEAKIExSRVNVTFQgV0lOQVBJIEFib3V0RGxnUHJvYzMyKCBIV05EMzIgaFduZCwgVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKQogeworICAgIEhXTkQzMiBoV25kQ3RsOwogICAgIGNoYXIgVGVtcGxhdGVbNTEyXSwgQXBwVGl0bGVbNTEyXTsKIAogICAgIHN3aXRjaChtc2cpCkBAIC00MTEsMTUgKzU1NywxMjMgQEAKICAgICAgICAgICAgIEFCT1VUX0lORk8gKmluZm8gPSAoQUJPVVRfSU5GTyAqKWxQYXJhbTsKICAgICAgICAgICAgIGlmIChpbmZvKQogICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0ICpwc3RyID0gU0hFTExfUGVvcGxlOwogICAgICAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZTMyQShoV25kLCBzdGMxLCBTVE1fU0VUSUNPTjMyLGluZm8tPmhJY29uLCAwKTsKICAgICAgICAgICAgICAgICBHZXRXaW5kb3dUZXh0MzJBKCBoV25kLCBUZW1wbGF0ZSwgc2l6ZW9mKFRlbXBsYXRlKSApOwogICAgICAgICAgICAgICAgIHNwcmludGYoIEFwcFRpdGxlLCBUZW1wbGF0ZSwgaW5mby0+c3pBcHAgKTsKICAgICAgICAgICAgICAgICBTZXRXaW5kb3dUZXh0MzJBKCBoV25kLCBBcHBUaXRsZSApOwotICAgICAgICAgICAgICAgIFNldFdpbmRvd1RleHQzMkEoIEdldERsZ0l0ZW0zMihoV25kLDEwMCksIGluZm8tPnN6T3RoZXJTdHVmZiApOworICAgICAgICAgICAgICAgIFNldFdpbmRvd1RleHQzMkEoIEdldERsZ0l0ZW0zMihoV25kLCBJRENfU1RBVElDX1RFWFQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnN6T3RoZXJTdHVmZiApOworICAgICAgICAgICAgICAgIGhXbmRDdGwgPSBHZXREbGdJdGVtMzIoaFduZCwgSURDX0xJU1RCT1gpOworICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBXTV9TRVRSRURSQVcsIDAsIDAgKTsKKyAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgV01fU0VURk9OVCwgaEljb25UaXRsZUZvbnQsIDAgKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKnBzdHIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgTEJfQUREU1RSSU5HMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMzIpLTEsIChMUEFSQU0pKnBzdHIgKTsKKyAgICAgICAgICAgICAgICAgICAgcHN0cisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgV01fU0VUUkVEUkFXLCAxLCAwICk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDE7CiAKKyAgICBjYXNlIFdNX1BBSU5UOgorCXsKKwkgICAgUkVDVDMyIHJlY3Q7CisJICAgIFBBSU5UU1RSVUNUMzIgcHM7CisJICAgIEhEQzMyIGhEQyA9IEJlZ2luUGFpbnQzMiggaFduZCwgJnBzICk7CisKKwkgICAgaWYoIF9fZ2V0X2Ryb3BsaW5lKCBoV25kLCAmcmVjdCApICkKKwkJR1JBUEhfRHJhd0xpbmVzKCBoREMsIChMUFBPSU5UMzIpJnJlY3QsIDEsIEdldFN0b2NrT2JqZWN0MzIoIEJMQUNLX1BFTiApICk7CisJICAgIEVuZFBhaW50MzIoIGhXbmQsICZwcyApOworCX0KKwlicmVhazsKKworICAgIGNhc2UgV01fTEJUUkFDS1BPSU5UOgorCisJaFduZEN0bCA9IEdldERsZ0l0ZW0zMihoV25kLCBJRENfTElTVEJPWCk7CisJaWYoIChJTlQxNilHZXRLZXlTdGF0ZTE2KCBWS19DT05UUk9MICkgPCAwICkKKwl7CisJICAgIGlmKCBEcmFnRGV0ZWN0MzIoIGhXbmRDdGwsICooKExQUE9JTlQzMikmbFBhcmFtKSApICkKKwkgICAgeworCQlJTlQzMiBpZHggPSBTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgTEJfR0VUQ1VSU0VMMzIsIDAsIDAgKTsKKwkJaWYoIGlkeCAhPSAtMSApCisJCXsKKwkJICAgIElOVDMyIGxlbmd0aCA9IFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBMQl9HRVRURVhUTEVOMzIsIChXUEFSQU0zMilpZHgsIDAgKTsKKwkJICAgIEhHTE9CQUwxNiBoTWVtT2JqID0gR2xvYmFsQWxsb2MxNiggR01FTV9NT1ZFQUJMRSwgbGVuZ3RoICsgMSApOworCQkgICAgY2hhciogcHN0ciA9IChjaGFyKilHbG9iYWxMb2NrMTYoIGhNZW1PYmogKTsKKworCQkgICAgaWYoIHBzdHIgKQorCQkgICAgeworCQkJSENVUlNPUjE2IGhDdXJzb3IgPSBMb2FkQ3Vyc29yMTYoIDAsIE1BS0VJTlRSRVNPVVJDRShPQ1JfRFJBR09CSkVDVCkgKTsKKwkJCVNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBMQl9HRVRURVhUMzIsIChXUEFSQU0zMilpZHgsIChMUEFSQU0pcHN0ciApOworCQkJU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIExCX0RFTEVURVNUUklORzMyLCAoV1BBUkFNMzIpaWR4LCAwICk7CisJCQlVcGRhdGVXaW5kb3czMiggaFduZEN0bCApOworCQkJaWYoICFEcmFnT2JqZWN0MTYoKEhXTkQxNiloV25kLCAoSFdORDE2KWhXbmQsIERSQUdPQkpfREFUQSwgMCwgKFdPUkQpaE1lbU9iaiwgaEN1cnNvcikgKQorCQkJICAgIFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBMQl9BRERTVFJJTkczMiwgKFdQQVJBTTMyKS0xLCAoTFBBUkFNKXBzdHIgKTsKKwkJICAgIH0KKwkJICAgIGlmKCBoTWVtT2JqICkgR2xvYmFsRnJlZTE2KCBoTWVtT2JqICk7CisJCX0KKwkgICAgfQorCX0KKwlicmVhazsKKworICAgIGNhc2UgV01fUVVFUllEUk9QT0JKRUNUOgorCWlmKCB3UGFyYW0gPT0gMCApCisJeworCSAgICBMUERSQUdJTkZPIGxwRHJhZ0luZm8gPSAoTFBEUkFHSU5GTylQVFJfU0VHX1RPX0xJTigoU0VHUFRSKWxQYXJhbSk7CisJICAgIGlmKCBscERyYWdJbmZvICYmIGxwRHJhZ0luZm8tPndGbGFncyA9PSBEUkFHT0JKX0RBVEEgKQorCSAgICB7CisJCVJFQ1QzMiByZWN0OworCQlpZiggX19nZXRfZHJvcGxpbmUoIGhXbmQsICZyZWN0ICkgKQorCQl7CisJCSAgICBQT0lOVDMyIHB0ID0geyBscERyYWdJbmZvLT5wdC54LCBscERyYWdJbmZvLT5wdC55IH07CisJCSAgICByZWN0LmJvdHRvbSArPSBEUk9QX0ZJRUxEX0hFSUdIVDsKKwkJICAgIGlmKCBQdEluUmVjdDMyKCAmcmVjdCwgcHQgKSApCisJCSAgICB7CisJCQlTZXRXaW5kb3dMb25nMzJBKCBoV25kLCBEV0xfTVNHUkVTVUxULCAxICk7CisJCQlyZXR1cm4gVFJVRTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCWJyZWFrOworCisgICAgY2FzZSBXTV9EUk9QT0JKRUNUOgorCWlmKCB3UGFyYW0gPT0gaFduZCApCisJeworCSAgICBMUERSQUdJTkZPIGxwRHJhZ0luZm8gPSAoTFBEUkFHSU5GTylQVFJfU0VHX1RPX0xJTigoU0VHUFRSKWxQYXJhbSk7CisJICAgIGlmKCBscERyYWdJbmZvICYmIGxwRHJhZ0luZm8tPndGbGFncyA9PSBEUkFHT0JKX0RBVEEgJiYgbHBEcmFnSW5mby0+aExpc3QgKQorCSAgICB7CisJCWNoYXIqIHBzdHIgPSAoY2hhciopR2xvYmFsTG9jazE2KCAoSEdMT0JBTDE2KShscERyYWdJbmZvLT5oTGlzdCkgKTsKKwkJaWYoIHBzdHIgKQorCQl7CisJCSAgICBzdGF0aWMgY2hhciBfX2FwcGVuZGl4X3N0cltdID0gIiB3aXRoIjsKKworCQkgICAgaFduZEN0bCA9IEdldERsZ0l0ZW0zMiggaFduZCwgSURDX1dJTkVfVEVYVCApOworCQkgICAgU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIFdNX0dFVFRFWFQsIDUxMiwgKExQQVJBTSlUZW1wbGF0ZSApOworCQkgICAgaWYoICFsc3RybmNtcDMyQSggVGVtcGxhdGUsICJXSU5FIiwgNCApICkKKwkJCVNldFdpbmRvd1RleHQzMkEoIEdldERsZ0l0ZW0zMihoV25kLCBJRENfU1RBVElDX1RFWFQpLCBUZW1wbGF0ZSApOworCQkgICAgZWxzZQorCQkgICAgeworCQkJY2hhciogcGNoID0gVGVtcGxhdGUgKyBzdHJsZW4oVGVtcGxhdGUpIC0gc3RybGVuKF9fYXBwZW5kaXhfc3RyKTsKKwkJCSpwY2ggPSAnXDAnOworCQkJU2VuZE1lc3NhZ2UzMkEoIEdldERsZ0l0ZW0zMihoV25kLCBJRENfTElTVEJPWCksIExCX0FERFNUUklORzMyLCAKKwkJCQkJKFdQQVJBTTMyKS0xLCAoTFBBUkFNKVRlbXBsYXRlICk7CisJCSAgICB9CisKKwkJICAgIGxzdHJjcHkzMkEoIFRlbXBsYXRlLCBwc3RyICk7CisJCSAgICBsc3RyY2F0MzJBKCBUZW1wbGF0ZSwgX19hcHBlbmRpeF9zdHIgKTsKKwkJICAgIFNldFdpbmRvd1RleHQzMkEoIGhXbmRDdGwsIFRlbXBsYXRlICk7CisKKwkJICAgIFNldFdpbmRvd0xvbmczMkEoIGhXbmQsIERXTF9NU0dSRVNVTFQsIDEgKTsKKwkJICAgIHJldHVybiBUUlVFOworCQl9CisJICAgIH0KKwl9CisJYnJlYWs7CisKICAgICBjYXNlIFdNX0NPTU1BTkQ6CiAgICAgICAgIGlmICh3UGFyYW0gPT0gSURPSykKICAgICAgICAgewpAQCAtMTA2NywzICsxMzIxLDI4IEBACiB7CiAgICAgZnByaW50Ziggc3RkbmltcCwgIkZyZWVJY29uTGlzdDogZW1wdHkgc3R1YlxuIiApOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkgU0hFTEwzMl9EbGxHZXRDbGFzc09iamVjdCAgIFtTSEVMTDMyLjE0XQorICoKKyAqIGh0dHA6Ly9wcmVtaXVtLm1pY3Jvc29mdC5jb20vbXNkbi9saWJyYXJ5L3Nka2RvYy9hcGkyXzQ4Zm8uaHRtCisgKi8KKworLyogVGhpcyBpcyB0aGUgd3JvbmcgcGxhY2UsIGJ1dCB3aGVyZSBpcyB0aGUgcmlnaHQgb25lPyAgKi8KK3R5cGVkZWYgVUlOVDMyIFJFRkNMU0lEMzI7Cit0eXBlZGVmIFVJTlQzMiBSRUZJSUQzMjsKK3R5cGVkZWYgVUlOVDMyIEhSRVNVTFQzMjsKKyNkZWZpbmUgRV9PVVRPRk1FTU9SWSAweDgwMDcwMDBFTAorCitIUkVTVUxUMzIgV0lOQVBJIFNIRUxMMzJfRGxsR2V0Q2xhc3NPYmplY3QgKFJFRkNMU0lEMzIgY2xzaWQsCisJCQkJCSAgICBSRUZJSUQzMiByaWlkLAorCQkJCQkgICAgTFBWT0lEICpwcHYpCit7CisgIEhSRVNVTFQzMiBocmVzID0gRV9PVVRPRk1FTU9SWTsgCisgICpwcHYgPSBOVUxMOyAKKworICBmcHJpbnRmIChzdGRuaW1wLCAiU0hFTEwzMl9EbGxHZXRDbGFzc09iamVjdCAoMHgleCwweCV4LCVwKSAtLSBTVFVCXG4iLAorCSAgIGNsc2lkLCByaWlkLCBwcHYpOworCisgIHJldHVybiBocmVzOworfQpkaWZmIC0tZ2l0IGEvbWlzYy92ZXIuYyBiL21pc2MvdmVyLmMKaW5kZXggZTgxYTUzOS4uNDIyZTZjMyAxMDA2NDQKLS0tIGEvbWlzYy92ZXIuYworKysgYi9taXNjL3Zlci5jCkBAIC0xNjYsOCArMTY2LDcgQEAKIH0KIAogCi1pbnQKLXJlYWRfeHhfaGVhZGVyKEhGSUxFMzIgbHpmZCkgeworc3RhdGljIGludCByZWFkX3h4X2hlYWRlcihIRklMRTMyIGx6ZmQpIHsKIAlJTUFHRV9ET1NfSEVBREVSCW16aDsKIAljaGFyCQkJbWFnaWNbMl07CiAKQEAgLTE4OSw4ICsxODgsNyBAQAogfQogCiAKLWludAotZmluZF9uZV9yZXNvdXJjZSgKK3N0YXRpYyBpbnQgZmluZF9uZV9yZXNvdXJjZSgKIAlIRklMRTMyIGx6ZmQsU0VHUFRSIHR5cGVpZCxTRUdQVFIgcmVzaWQsCiAJQllURSAqKnJlc2RhdGEsaW50ICpyZXNsZW4sRFdPUkQgKm9mZgogKSB7CkBAIC0zMTksNyArMzE3LDcgQEAKIC8qIExvYWRzIHRoZSBzcGVjaWZpZWQgUEUgcmVzb3VyY2UuCiAgKiBGSVhNRTogc2hvdWxkbid0IGxvYWQgdGhlIHdob2xlIGltYWdlCiAgKi8KLWludAorc3RhdGljIGludAogZmluZF9wZV9yZXNvdXJjZSgKIAlIRklMRTMyIGx6ZmQsTFBXU1RSIHR5cGVpZCxMUFdTVFIgcmVzaWQsCiAJQllURSAqKnJlc2RhdGEsaW50ICpyZXNsZW4sRFdPUkQgKm9mZgpAQCAtNDcxLDcgKzQ2OSw3IEBACiAJCQlyZXM9IGZpbmRfbmVfcmVzb3VyY2UobHpmZCxyZXN0eXBlLHJlc2lkLCZyZXNkYXRhLCZyZXNsZW4sJm9mZik7CiAJCQlicmVhazsKIAkJY2FzZSBJTUFHRV9OVF9TSUdOQVRVUkU6Ci0JCQlyZXM9IGZpbmRfcGVfcmVzb3VyY2UobHpmZCxyZXN0eXBlLHJlc2lkLCZyZXNkYXRhLCZyZXNsZW4sJm9mZik7CisJCQlyZXM9IGZpbmRfcGVfcmVzb3VyY2UobHpmZCwoTFBXU1RSKXJlc3R5cGUsKExQV1NUUilyZXNpZCwmcmVzZGF0YSwmcmVzbGVuLCZvZmYpOwogCQkJYnJlYWs7CiAJCX0KIAkJTFpDbG9zZTMyKGx6ZmQpOwpAQCAtOTM4LDEwICs5MzYsMTQgQEAKICAgICB9CiB9CiAKKy8qIFZlckluc3RhbGxGaWxlMzJBCisgKi8KKwogRFdPUkQgV0lOQVBJIFZlckluc3RhbGxGaWxlMzJBKAogCVVJTlQzMiBmbGFncyxMUENTVFIgc3JjZmlsZW5hbWUsTFBDU1RSIGRlc3RmaWxlbmFtZSxMUENTVFIgc3JjZGlyLAogIAlMUENTVFIgZGVzdGRpcixMUENTVFIgY3VyZGlyLExQU1RSIHRtcGZpbGUsVUlOVDMyICp0bXBmaWxlbGVuICkKIHsKKyAgICBMUENTVFIgcGRlc3Q7CiAgICAgY2hhcglkZXN0Zm5bMjYwXSx0bXBmblsyNjBdLHNyY2ZuWzI2MF07CiAgICAgSEZJTEUzMgloZnNyYyxoZmRzdDsKICAgICBEV09SRAlhdHRyLHJldCx4cmV0LHRtcGxhc3Q7CkBAIC05NTMsMTIgKzk1NSwxNCBAQAogICAgICk7CiAgICAgeHJldCA9IDA7CiAgICAgc3ByaW50ZihzcmNmbiwiJXNcXCVzIixzcmNkaXIsc3JjZmlsZW5hbWUpOwotICAgIHNwcmludGYoZGVzdGZuLCIlc1xcJXMiLGRlc3RkaXIsZGVzdGZpbGVuYW1lKTsKKyAgICBpZiAoIWRlc3RkaXIgfHwgISpkZXN0ZGlyKSBwZGVzdCA9IHNyY2RpcjsKKyAgICBlbHNlIHBkZXN0ID0gZGVzdGRpcjsKKyAgICBzcHJpbnRmKGRlc3RmbiwiJXNcXCVzIixwZGVzdCxkZXN0ZmlsZW5hbWUpOwogICAgIGhmc3JjPUxaT3BlbkZpbGUzMkEoc3JjZm4sJm9mcyxPRl9SRUFEKTsKICAgICBpZiAoaGZzcmM9PUhGSUxFX0VSUk9SMzIpCiAgICAgCXJldHVybiBWSUZfQ0FOTk9UUkVBRFNSQzsKLSAgICBzcHJpbnRmKHRtcGZuLCIlc1xcJXMiLGRlc3RkaXIsZGVzdGZpbGVuYW1lKTsKLSAgICB0bXBsYXN0PXN0cmxlbihkZXN0ZGlyKSsxOworICAgIHNwcmludGYodG1wZm4sIiVzXFwlcyIscGRlc3QsZGVzdGZpbGVuYW1lKTsKKyAgICB0bXBsYXN0PXN0cmxlbihwZGVzdCkrMTsKICAgICBhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXMzMkEodG1wZm4pOwogICAgIGlmIChhdHRyIT0tMSkgewogCWlmIChhdHRyICYgRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkpIHsKQEAgLTk3MCw4ICs5NzQsOCBAQAogICAgIGF0dHIgPSAtMTsKICAgICBpZiAoZmxhZ3MgJiBWSUZGX0ZPUkNFSU5TVEFMTCkgewogICAgIAlpZiAodG1wZmlsZVswXSkgewotCSAgICBzcHJpbnRmKHRtcGZuLCIlc1xcJXMiLGRlc3RkaXIsdG1wZmlsZSk7Ci0JICAgIHRtcGxhc3QgPSBzdHJsZW4oZGVzdGRpcikrMTsKKwkgICAgc3ByaW50Zih0bXBmbiwiJXNcXCVzIixwZGVzdCx0bXBmaWxlKTsKKwkgICAgdG1wbGFzdCA9IHN0cmxlbihwZGVzdCkrMTsKIAkgICAgYXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzMzJBKHRtcGZuKTsKIAkgICAgLyogaWYgaXQgZXhpc3RzLCBpdCBoYXMgYmVlbiBjb3BpZWQgYnkgdGhlIGNhbGwgYmVmb3JlLgogCSAgICAgKiB3ZSBqdW1wIG92ZXIgdGhlIGNvcHkgcGFydC4uLiAKQEAgLTk4MSw3ICs5ODUsNyBAQAogICAgIGlmIChhdHRyID09IC0xKSB7CiAgICAgCWNoYXIJKnM7CiAKLQlHZXRUZW1wRmlsZU5hbWUzMkEoZGVzdGRpciwidmVyIiwwLHRtcGZuKTsgLyogc2hvdWxkIG5vdCBmYWlsIC4uLiAqLworCUdldFRlbXBGaWxlTmFtZTMyQShwZGVzdCwidmVyIiwwLHRtcGZuKTsgLyogc2hvdWxkIG5vdCBmYWlsIC4uLiAqLwogCXM9c3RycmNocih0bXBmbiwnXFwnKTsKIAlpZiAocykKIAkgICAgdG1wbGFzdCA9IHMtdG1wZm47CkBAIC0xMDc4LDcgKzEwODIsNyBAQAogCWlmICgoIShmbGFncyAmIFZJRkZfRE9OVERFTEVURU9MRCkpCSYmIAogCSAgICBjdXJkaXIJCQkJJiYgCiAJICAgICpjdXJkaXIJCQkJJiYKLQkgICAgbHN0cmNtcGkzMkEoY3VyZGlyLGRlc3RkaXIpCisJICAgIGxzdHJjbXBpMzJBKGN1cmRpcixwZGVzdCkKIAkpIHsKIAkgICAgY2hhciBjdXJmblsyNjBdOwogCmRpZmYgLS1naXQgYS9taXNjL3ZlcnNpb24uYyBiL21pc2MvdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMGQ3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjL3ZlcnNpb24uYwpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIFdpbmRvd3MgdmVyc2lvbiBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NyBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqIENvcHlyaWdodCAxOTk3IE1hcmN1cyBNZWlzc25lcgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW5iYXNlLmgiCisjaW5jbHVkZSAicHJvY2Vzcy5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKKwordHlwZWRlZiBlbnVtCit7CisgICAgV0lOMzEsIC8qIFdpbmRvd3MgMy4xICovCisgICAgV0lOOTUsIC8qIFdpbmRvd3MgOTUgKi8KKyAgICBOVDM1MSwgLyogV2luZG93cyBOVCAzLjUxICovCisgICAgTlQ0MCwgIC8qIFdpbmRvd3MgTlQgNC4wICovCisgICAgTkJfVkVSU0lPTlMKK30gVkVSU0lPTjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMT05HICAgICAgICAgICAgIGdldFZlcnNpb24xNjsgCisgICAgTE9ORyAgICAgICAgICAgICBnZXRWZXJzaW9uMzI7CisgICAgT1NWRVJTSU9OSU5GTzMyQSBnZXRWZXJzaW9uRXg7Cit9IFZFUlNJT05fREFUQTsKKworCisvKiBGSVhNRTogY29tcGFyZSB2YWx1ZXMgYmVsb3cgd2l0aCBvcmlnaW5hbCBhbmQgZml4ICovCitzdGF0aWMgY29uc3QgVkVSU0lPTl9EQVRBIFZlcnNpb25EYXRhW05CX1ZFUlNJT05TXSA9Cit7CisgICAgLyogV0lOMzEgKi8KKyAgICB7CisJTUFLRUxPTkcoIDB4MGEwMywgMHgwNjE2ICksIC8qIERPUyA2LjIyICovCisJTUFLRUxPTkcoIDB4MGEwMywgMHg4MDAwICksCisJeworICAgICAgICAgICAgc2l6ZW9mKE9TVkVSU0lPTklORk8zMkEpLCAzLCAxMCwgMCwKKyAgICAgICAgICAgIFZFUl9QTEFURk9STV9XSU4zMnMsICJXaW4zMnMgMS4zIiAKKwl9CisgICAgfSwKKyAgICAvKiBXSU45NSAqLworICAgIHsKKyAgICAgICAgMHgwNzAwNUYwMywKKyAgICAgICAgMHhDMDAwMDAwNCwKKwl7CisgICAgICAgICAgICBzaXplb2YoT1NWRVJTSU9OSU5GTzMyQSksIDQsIDAsIDB4NDAwMDNCNiwKKyAgICAgICAgICAgIFZFUl9QTEFURk9STV9XSU4zMl9XSU5ET1dTLCAiV2luOTUiCisJfQorICAgIH0sCisgICAgLyogTlQzNTEgKi8KKyAgICB7CisgICAgICAgIDB4MDUwMDBBMDMsCisgICAgICAgIDB4MDQyMTMzMDMsCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVvZihPU1ZFUlNJT05JTkZPMzJBKSwgMywgNTEsIDB4NDIxLAorICAgICAgICAgICAgVkVSX1BMQVRGT1JNX1dJTjMyX05ULCAiU2VydmljZSBQYWNrIDIiCisJfQorICAgIH0sCisgICAgLyogTlQ0MCAqLworICAgIHsKKyAgICAgICAgMHgwNTAwMEEwMywKKyAgICAgICAgMHgwNTY1MDAwNCwKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZW9mKE9TVkVSU0lPTklORk8zMkEpLCA0LCAwLCAweDU2NSwKKyAgICAgICAgICAgIFZFUl9QTEFURk9STV9XSU4zMl9OVCwgIlNlcnZpY2UgUGFjayAzIgorICAgICAgICB9CisgICAgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKlZlcnNpb25OYW1lc1tOQl9WRVJTSU9OU10gPQoreworICAgICJ3aW4zMSIsCisgICAgIndpbjk1IiwKKyAgICAibnQzNTEiLAorICAgICJudDQwIgorfTsKKworLyogdGhlIGN1cnJlbnQgdmVyc2lvbiBoYXMgbm90IGJlZW4gYXV0b2RldGVjdGVkIGJ1dCBmb3JjZWQgdmlhIGNtZGxpbmUgKi8KK3N0YXRpYyBCT09MMzIgdmVyc2lvbkZvcmNlZCA9IEZBTFNFOworc3RhdGljIFZFUlNJT04gZGVmYXVsdFZlcnNpb24gPSBXSU4zMTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBWRVJTSU9OX1BhcnNlVmVyc2lvbgorICovCit2b2lkIFZFUlNJT05fUGFyc2VWZXJzaW9uKCBjaGFyICphcmcgKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBOQl9WRVJTSU9OUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoIFZlcnNpb25OYW1lc1tpXSwgYXJnICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlZmF1bHRWZXJzaW9uID0gKFZFUlNJT04paTsKKyAgICAgICAgICAgIHZlcnNpb25Gb3JjZWQgPSBUUlVFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGZwcmludGYoIHN0ZGVyciwgIkludmFsaWQgd2ludmVyIHZhbHVlICclcycgc3BlY2lmaWVkLlxuIiwgYXJnICk7CisgICAgZnByaW50Ziggc3RkZXJyLCAiVmFsaWQgdmVyc2lvbnMgYXJlOiIgKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTkJfVkVSU0lPTlM7IGkrKykKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiICclcyclYyIsIFZlcnNpb25OYW1lc1tpXSwKKyAgICAgICAgICAgICAgICAgKGkgPT0gTkJfVkVSU0lPTlMgLSAxKSA/ICdcbicgOiAnLCcgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBWRVJTSU9OX2dldF92ZXJzaW9uCisgKi8KK3N0YXRpYyBWRVJTSU9OIFZFUlNJT05fR2V0VmVyc2lvbih2b2lkKQoreworICAgIExQSU1BR0VfTlRfSEVBREVSUyBwZWhlYWRlcjsJCisKKyAgICBpZiAodmVyc2lvbkZvcmNlZCkgLyogdXNlciBoYXMgb3ZlcnJpZGRlbiBhbnkgc2Vuc2libGUgY2hlY2tzICovCisgICAgICAgIHJldHVybiBkZWZhdWx0VmVyc2lvbjsKKyAgICBpZiAoIXBDdXJyZW50UHJvY2VzcykgLyogYXQgc3RhcnR1cHRpbWUgcHJvYmFibHkgKi8KKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWZXJzaW9uOworICAgIGlmICghcEN1cnJlbnRQcm9jZXNzLT5leGVfbW9kcmVmKQorICAgICAgICByZXR1cm4gV0lOMzE7IC8qIEZJWE1FOiBobW0sIGxvb2sgYXQgRERCLnZlcnNpb24gPyAqLworICAgIHBlaGVhZGVyID0gcEN1cnJlbnRQcm9jZXNzLT5leGVfbW9kcmVmLT5wZV9tb2R1bGUtPnBlX2hlYWRlcjsKKyAgICBpZiAocGVoZWFkZXItPk9wdGlvbmFsSGVhZGVyLk1ham9yU3Vic3lzdGVtVmVyc2lvbiA9PSA0KQorICAgICAgICAvKiBGSVhNRTogTlQ0IGhhcyB0aGUgc2FtZSBtYWpvcnZlcnNpb247IGFkZCBhIGNoZWNrIGhlcmUgZm9yIGl0LiAqLworICAgICAgICByZXR1cm4gV0lOOTU7CisgICAgaWYgKHBlaGVhZGVyLT5PcHRpb25hbEhlYWRlci5NYWpvclN1YnN5c3RlbVZlcnNpb24gPT0gMykKKyAgICB7CisgICAgICAgIC8qIFdpbjMuMTAgKi8KKyAgICAgICAgaWYgKHBlaGVhZGVyLT5PcHRpb25hbEhlYWRlci5NaW5vclN1YnN5c3RlbVZlcnNpb24gPD0gMTEpIHJldHVybiBXSU4zMTsKKyAgICAgICAgLyogTlQgMy41MSAqLworICAgICAgICBpZiAocGVoZWFkZXItPk9wdGlvbmFsSGVhZGVyLk1pbm9yU3Vic3lzdGVtVmVyc2lvbiA9PSA1MSkgcmV0dXJuIE5UMzUxOworICAgIH0KKyAgICBmcHJpbnRmKHN0ZGVyciwiVkVSU0lPTl9HZXRWZXJzaW9uOiB1bmtub3duIHN1YnN5c3RlbSB2ZXJzaW9uOiAlMDR4LiUwNHgsIHBsZWFzZSByZXBvcnQuXG4iLAorICAgICAgICAgICAgcGVoZWFkZXItPk9wdGlvbmFsSGVhZGVyLk1ham9yU3Vic3lzdGVtVmVyc2lvbiwKKyAgICAgICAgICAgIHBlaGVhZGVyLT5PcHRpb25hbEhlYWRlci5NaW5vclN1YnN5c3RlbVZlcnNpb24gKTsKKyAgICByZXR1cm4gZGVmYXVsdFZlcnNpb247Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIEdldFZlcnNpb24xNiAgIChLRVJORUwuMykKKyAqLworTE9ORyBXSU5BUEkgR2V0VmVyc2lvbjE2KHZvaWQpCit7CisgICAgVkVSU0lPTiB2ZXIgPSBWRVJTSU9OX0dldFZlcnNpb24oKTsKKyAgICByZXR1cm4gVmVyc2lvbkRhdGFbdmVyXS5nZXRWZXJzaW9uMTY7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIEdldFZlcnNpb24zMiAgIChLRVJORUwzMi40MjcpCisgKi8KK0xPTkcgV0lOQVBJIEdldFZlcnNpb24zMih2b2lkKQoreworICAgIFZFUlNJT04gdmVyID0gVkVSU0lPTl9HZXRWZXJzaW9uKCk7CisgICAgcmV0dXJuIFZlcnNpb25EYXRhW3Zlcl0uZ2V0VmVyc2lvbjMyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBHZXRWZXJzaW9uRXgzMkEgICAoS0VSTkVMMzIuNDI4KQorICovCitCT09MMzIgV0lOQVBJIEdldFZlcnNpb25FeDMyQShPU1ZFUlNJT05JTkZPMzJBICp2KQoreworICAgIFZFUlNJT04gdmVyID0gVkVSU0lPTl9HZXRWZXJzaW9uKCk7CisgICAgaWYgKHYtPmR3T1NWZXJzaW9uSW5mb1NpemUgIT0gc2l6ZW9mKE9TVkVSU0lPTklORk8zMkEpKQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIndyb25nIE9TVkVSU0lPTklORk8gc2l6ZSBmcm9tIGFwcCIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHYtPmR3TWFqb3JWZXJzaW9uID0gVmVyc2lvbkRhdGFbdmVyXS5nZXRWZXJzaW9uRXguZHdNYWpvclZlcnNpb247CisgICAgdi0+ZHdNaW5vclZlcnNpb24gPSBWZXJzaW9uRGF0YVt2ZXJdLmdldFZlcnNpb25FeC5kd01pbm9yVmVyc2lvbjsKKyAgICB2LT5kd0J1aWxkTnVtYmVyICA9IFZlcnNpb25EYXRhW3Zlcl0uZ2V0VmVyc2lvbkV4LmR3QnVpbGROdW1iZXI7CisgICAgdi0+ZHdQbGF0Zm9ybUlkICAgPSBWZXJzaW9uRGF0YVt2ZXJdLmdldFZlcnNpb25FeC5kd1BsYXRmb3JtSWQ7CisgICAgc3RyY3B5KCB2LT5zekNTRFZlcnNpb24sIFZlcnNpb25EYXRhW3Zlcl0uZ2V0VmVyc2lvbkV4LnN6Q1NEVmVyc2lvbiApOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBHZXRWZXJzaW9uRXgzMlcgICAoS0VSTkVMMzIuNDI5KQorICovCitCT09MMzIgV0lOQVBJIEdldFZlcnNpb25FeDMyVyhPU1ZFUlNJT05JTkZPMzJXICp2KQoreworICAgIFZFUlNJT04gdmVyID0gVkVSU0lPTl9HZXRWZXJzaW9uKCk7CisgICAgaWYgKHYtPmR3T1NWZXJzaW9uSW5mb1NpemUhPXNpemVvZihPU1ZFUlNJT05JTkZPMzJXKSkKKyAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJ3cm9uZyBPU1ZFUlNJT05JTkZPIHNpemUgZnJvbSBhcHAiKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICB2LT5kd01ham9yVmVyc2lvbiA9IFZlcnNpb25EYXRhW3Zlcl0uZ2V0VmVyc2lvbkV4LmR3TWFqb3JWZXJzaW9uOworICAgIHYtPmR3TWlub3JWZXJzaW9uID0gVmVyc2lvbkRhdGFbdmVyXS5nZXRWZXJzaW9uRXguZHdNaW5vclZlcnNpb247CisgICAgdi0+ZHdCdWlsZE51bWJlciAgPSBWZXJzaW9uRGF0YVt2ZXJdLmdldFZlcnNpb25FeC5kd0J1aWxkTnVtYmVyOworICAgIHYtPmR3UGxhdGZvcm1JZCAgID0gVmVyc2lvbkRhdGFbdmVyXS5nZXRWZXJzaW9uRXguZHdQbGF0Zm9ybUlkOworICAgIGxzdHJjcHlBdG9XKCB2LT5zekNTRFZlcnNpb24sIFZlcnNpb25EYXRhW3Zlcl0uZ2V0VmVyc2lvbkV4LnN6Q1NEVmVyc2lvbiApOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIEdldFdpbkZsYWdzICAgKEtFUk5FTC4xMzIpCisgKi8KK0RXT1JEIFdJTkFQSSBHZXRXaW5GbGFncyh2b2lkKQoreworICBzdGF0aWMgY29uc3QgbG9uZyBjcHVmbGFnc1s1XSA9CisgICAgeyBXRl9DUFUwODYsIFdGX0NQVTE4NiwgV0ZfQ1BVMjg2LCBXRl9DUFUzODYsIFdGX0NQVTQ4NiB9OworICBTWVNURU1fSU5GTyBzaTsKKyAgT1NWRVJTSU9OSU5GTzMyQSBvdmk7CisgIERXT1JEIHJlc3VsdDsKKworICBHZXRTeXN0ZW1JbmZvKCZzaSk7CisKKyAgLyogVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBQZW50aXVtIGZsYWcuICAqLworICByZXN1bHQgPSBjcHVmbGFnc1tNSU4gKHNpLndQcm9jZXNzb3JMZXZlbCwgNCldOworCisgIHN3aXRjaChPcHRpb25zLm1vZGUpCisgIHsKKyAgY2FzZSBNT0RFX1NUQU5EQVJEOgorICAgICAgcmVzdWx0IHw9IFdGX1NUQU5EQVJEIHwgV0ZfUE1PREUgfCBXRl84MHg4NzsKKyAgICAgIGJyZWFrOworCisgIGNhc2UgTU9ERV9FTkhBTkNFRDoKKyAgICAgIHJlc3VsdCB8PSBXRl9FTkhBTkNFRCB8IFdGX1BNT0RFIHwgV0ZfODB4ODcgfCBXRl9QQUdJTkc7CisgICAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIG1vZGUgc2V0PyBUaGlzIHNob3VsZG4ndCBoYXBwZW4uIENoZWNrIEdldFdpbkZsYWdzKCkhXG4iKTsKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChzaS53UHJvY2Vzc29yTGV2ZWwgPj0gNCkgcmVzdWx0IHw9IFdGX0hBU0NQVUlEOworICBvdmkuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZihvdmkpOworICBHZXRWZXJzaW9uRXgzMkEoJm92aSk7CisgIGlmIChvdmkuZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVCkKKyAgICAgIHJlc3VsdCB8PSBXRl9XSU4zMldPVzsgLyogdW5kb2N1bWVudGVkIFdGX1dJTk5UICovCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgR2V0V2luRGVidWdJbmZvICAgKEtFUk5FTC4zNTUpCisgKi8KK0JPT0wxNiBXSU5BUEkgR2V0V2luRGVidWdJbmZvKFdJTkRFQlVHSU5GTyAqbHB3ZGksIFVJTlQxNiBmbGFncykKK3sKKyAgICBwcmludGYoIkdldFdpbkRlYnVnSW5mbyglOGx4LCVkKSBzdHViIHJldHVybmluZyAwXG4iLAorICAgICAgICAgICAodW5zaWduZWQgbG9uZylscHdkaSwgZmxhZ3MpOworICAgIC8qIDAgbWVhbnMgbm90IGluIGRlYnVnZ2luZyBtb2RlL3ZlcnNpb24gKi8KKyAgICAvKiBDYW4gdGhpcyB0eXBlIG9mIGRlYnVnZ2luZyBiZSB1c2VkIGluIHdpbmUgPyAqLworICAgIC8qIENvbnN0YW50czogV0RJX09QVElPTlMgV0RJX0ZJTFRFUiBXRElfQUxMT0NCUkVBSyAqLworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIFNldFdpbkRlYnVnSW5mbyAgIChLRVJORUwuMzU2KQorICovCitCT09MMTYgV0lOQVBJIFNldFdpbkRlYnVnSW5mbyhXSU5ERUJVR0lORk8gKmxwd2RpKQoreworICAgIHByaW50ZigiU2V0V2luRGVidWdJbmZvKCU4bHgpIHN0dWIgcmV0dXJuaW5nIDBcbiIsICh1bnNpZ25lZCBsb25nKWxwd2RpKTsKKyAgICAvKiAwIG1lYW5zIG5vdCBpbiBkZWJ1Z2dpbmcgbW9kZS92ZXJzaW9uICovCisgICAgLyogQ2FuIHRoaXMgdHlwZSBvZiBkZWJ1Z2dpbmcgYmUgdXNlZCBpbiB3aW5lID8gKi8KKyAgICAvKiBDb25zdGFudHM6IFdESV9PUFRJT05TIFdESV9GSUxURVIgV0RJX0FMTE9DQlJFQUsgKi8KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21pc2NlbXUvTWFrZWZpbGUuaW4gYi9taXNjZW11L01ha2VmaWxlLmluCmluZGV4IGQ2YzBiNTIuLmRjZmRiYmUgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvTWFrZWZpbGUuaW4KKysrIGIvbWlzY2VtdS9NYWtlZmlsZS5pbgpAQCAtNyw3ICs3LDggQEAKIAogQ19TUkNTID0gXAogCWVtdWxhdGUuYyBcCi0JaW5zdHIuYworCWluc3RyLmMgXAorCW1haW4uYwogCiBhbGw6ICQoTU9EVUxFKS5vCiAKZGlmZiAtLWdpdCBhL21pc2NlbXUvbWFpbi5jIGIvbWlzY2VtdS9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThkYzg3MQotLS0gL2Rldi9udWxsCisrKyBiL21pc2NlbXUvbWFpbi5jCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogRW11bGF0b3IgaW5pdGlhbGlzYXRpb24gY29kZQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlICJkZWJ1Z2dlci5oIgorI2luY2x1ZGUgIm1pc2NlbXUuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRW11bGF0b3IgaW5pdGlhbGlzYXRpb24KKyAqLworQk9PTDMyIE1BSU5fRW11bGF0b3JJbml0KHZvaWQpCit7CisgICAgZXh0ZXJuIEJPT0wzMiBNQUlOX0tlcm5lbEluaXQodm9pZCk7CisgICAgZXh0ZXJuIEJPT0wzMiBNQUlOX1VzZXJJbml0KHZvaWQpOworICAgIGV4dGVybiBCT09MMzIgV0lOMTZEUlZfSW5pdCh2b2lkKTsKKyAgICBleHRlcm4gQk9PTDMyIFJFTEFZX0luaXQodm9pZCk7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBrZXJuZWwgKi8KKyAgICBpZiAoIU1BSU5fS2VybmVsSW5pdCgpKSByZXR1cm4gRkFMU0U7CisKKyAgICAvKiBJbml0aWFsaXplIHJlbGF5IGNvZGUgKi8KKyAgICBpZiAoIVJFTEFZX0luaXQoKSkgcmV0dXJuIEZBTFNFOworCisgICAgICAvKiBJbml0aWFsaXplIHNpZ25hbCBoYW5kbGluZyAqLworICAgIGlmICghU0lHTkFMX0luaXRFbXVsYXRvcigpKSByZXR1cm4gRkFMU0U7CisKKyAgICAvKiBDcmVhdGUgdGhlIFdpbjE2IHByaW50ZXIgZHJpdmVyICovCisgICAgaWYgKCFXSU4xNkRSVl9Jbml0KCkpIHJldHVybiBGQUxTRTsKKworICAgIC8qIEluaXRpYWxpemUgYWxsIHRoZSBVU0VSIHN0dWZmICovCisgICAgcmV0dXJuIE1BSU5fVXNlckluaXQoKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIG1haW4KKyAqLworaW50IG1haW4oIGludCBhcmdjLCBjaGFyICphcmd2W10gKQoreworICAgIGV4dGVybiBCT09MMzIgTUFJTl9XaW5lSW5pdCggaW50ICphcmdjLCBjaGFyICphcmd2W10gKTsKKyAgICBleHRlcm4gdm9pZCAqQ0FMTDMyX0luaXQodm9pZCk7CisgICAgZXh0ZXJuIGNoYXIgKiBERUJVR19hcmd2MDsKKworICAgIGludCBpLGxvYWRlZDsKKyAgICBISU5TVEFOQ0UzMiBoYW5kbGU7CisKKyAgICBfX3dpbmVsaWIgPSAwOyAgLyogRmlyc3Qgb2YgYWxsLCBjbGVhciB0aGUgV2luZWxpYiBmbGFnICovCisKKyAgICAvKgorICAgICAqIFNhdmUgdGhpcyBzbyB0aGF0IHRoZSBpbnRlcm5hbCBkZWJ1Z2dlciBjYW4gZ2V0IGEgaG9sZCBvZiBpdCBpZgorICAgICAqIGl0IG5lZWRzIHRvLgorICAgICAqLworICAgIERFQlVHX2FyZ3YwID0gYXJndlswXTsKKworICAgIGlmICghTUFJTl9XaW5lSW5pdCggJmFyZ2MsIGFyZ3YgKSkgcmV0dXJuIDE7CisKKyAgICAvKiBIYW5kbGUgLWRsbCBvcHRpb24gKGhhY2spICovCisKKyAgICBpZiAoT3B0aW9ucy5kbGxGbGFncykKKyAgICB7CisgICAgICAgIGlmICghQlVJTFRJTl9QYXJzZURMTE9wdGlvbnMoIE9wdGlvbnMuZGxsRmxhZ3MgKSkKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJXM6IFN5bnRheDogLWRsbCAreHh4LC4uLiBvciAtZGxsIC14eHgsLi4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgYXJndlswXSApOworICAgICAgICAgICAgQlVJTFRJTl9QcmludERMTHMoKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIGV2ZXJ5dGhpbmcgKi8KKworICAgIGlmICghTUFJTl9FbXVsYXRvckluaXQoKSkgcmV0dXJuIDE7CisKKyAgICAvKiBJbml0aWFsaXplIENBTEwzMiByb3V0aW5lcyAqLworICAgIC8qIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBqdXN0IGJlZm9yZSB0YXNrLXN3aXRjaGluZyBzdGFydHMgKi8KKyAgICBJRjE2MzJfQ2FsbExhcmdlU3RhY2sgPSAoaW50ICgqKShpbnQgKCpmdW5jKSgpLCB2b2lkICphcmcpKUNBTEwzMl9Jbml0KCk7CisKKyAgICBsb2FkZWQ9MDsKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKChoYW5kbGUgPSBXaW5FeGVjMzIoIGFyZ3ZbaV0sIFNXX1NIT1dOT1JNQUwgKSkgPCAzMikKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3aW5lOiBjYW4ndCBleGVjICclcyc6ICIsIGFyZ3ZbaV0pOworICAgICAgICAgICAgc3dpdGNoIChoYW5kbGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDI6IGZwcmludGYoIHN0ZGVyciwgImZpbGUgbm90IGZvdW5kXG4iICk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTogZnByaW50Ziggc3RkZXJyLCAiaW52YWxpZCBleGUgZmlsZVxuIiApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjE6IGZwcmludGYoIHN0ZGVyciwgIndpbjMyIGV4ZWN1dGFibGVcbiIgKTsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBmcHJpbnRmKCBzdGRlcnIsICJlcnJvcj0lZFxuIiwgaGFuZGxlICk7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKwlsb2FkZWQrKzsKKyAgICB9CisKKyAgICBpZiAoIWxvYWRlZCkgeyAvKiBub3RoaW5nIGxvYWRlZCAqLworICAgIAlleHRlcm4gdm9pZCBNQUlOX1VzYWdlKGNoYXIqKTsKKyAgICAJTUFJTl9Vc2FnZShhcmd2WzBdKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIUdldE51bVRhc2tzKCkpCisgICAgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJ3aW5lOiBubyBleGVjdXRhYmxlIGZpbGUgZm91bmQuXG4iICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChPcHRpb25zLmRlYnVnKSBERUJVR19BZGRNb2R1bGVCcmVha3BvaW50cygpOworCisgICAgWWllbGQoKTsgIC8qIFN0YXJ0IHRoZSBmaXJzdCB0YXNrICovCisgICAgZnByaW50Ziggc3RkZXJyLCAiV2luTWFpbjogU2hvdWxkIG5ldmVyIGhhcHBlbjogcmV0dXJuZWQgZnJvbSBZaWVsZCgpXG4iICk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tc2Rvcy9NYWtlZmlsZS5pbiBiL21zZG9zL01ha2VmaWxlLmluCmluZGV4IGExMTI4NWIuLjMxYmU4MGUgMTAwNjQ0Ci0tLSBhL21zZG9zL01ha2VmaWxlLmluCisrKyBiL21zZG9zL01ha2VmaWxlLmluCkBAIC0xLDQgKzEsNCBAQAotREVGUyAgICAgID0gLURfX1dJTkVfXworREVGUyAgICAgID0gQERMTEZMQUdTQCAtRF9fV0lORV9fCiBUT1BTUkNESVIgPSBAdG9wX3NyY2RpckAKIFRPUE9CSkRJUiA9IC4uCiBTUkNESVIgICAgPSBAc3JjZGlyQApkaWZmIC0tZ2l0IGEvbXNkb3MvZHBtaS5jIGIvbXNkb3MvZHBtaS5jCmluZGV4IDE4OWE5OWIuLjBhNWZlYjQgMTAwNjQ0Ci0tLSBhL21zZG9zL2RwbWkuYworKysgYi9tc2Rvcy9kcG1pLmMKQEAgLTM0LDcgKzM0LDcgQEAKICAgICBEV09SRCBlZHg7CiAgICAgRFdPUkQgZWN4OwogICAgIERXT1JEIGVheDsKLSAgICBXT1JEICBmbGFnczsKKyAgICBXT1JEICBmbDsKICAgICBXT1JEICBlczsKICAgICBXT1JEICBkczsKICAgICBXT1JEICBmczsKQEAgLTQ1LDcgKzQ1LDE4NiBAQAogICAgIFdPUkQgIHNzOwogfSBSRUFMTU9ERUNBTEw7CiAKLWV4dGVybiB2b2lkIGRvX21zY2RleCggQ09OVEVYVCAqY29udGV4dCApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgSU5UX0dldFJlYWxNb2RlQ29udGV4dAorICovCitzdGF0aWMgdm9pZCBJTlRfR2V0UmVhbE1vZGVDb250ZXh0KCBSRUFMTU9ERUNBTEwgKmNhbGwsIENPTlRFWFQgKmNvbnRleHQgKQoreworICAgIEVBWF9yZWcoY29udGV4dCkgPSBjYWxsLT5lYXg7CisgICAgRUJYX3JlZyhjb250ZXh0KSA9IGNhbGwtPmVieDsKKyAgICBFQ1hfcmVnKGNvbnRleHQpID0gY2FsbC0+ZWN4OworICAgIEVEWF9yZWcoY29udGV4dCkgPSBjYWxsLT5lZHg7CisgICAgRVNJX3JlZyhjb250ZXh0KSA9IGNhbGwtPmVzaTsKKyAgICBFRElfcmVnKGNvbnRleHQpID0gY2FsbC0+ZWRpOworICAgIEVCUF9yZWcoY29udGV4dCkgPSBjYWxsLT5lYnA7CisgICAgRUZMX3JlZyhjb250ZXh0KSA9IGNhbGwtPmZsOworICAgIEVJUF9yZWcoY29udGV4dCkgPSBjYWxsLT5pcDsKKyAgICBFU1BfcmVnKGNvbnRleHQpID0gY2FsbC0+c3A7CisgICAgQ1NfcmVnKGNvbnRleHQpICA9IGNhbGwtPmNzOworICAgIERTX3JlZyhjb250ZXh0KSAgPSBjYWxsLT5kczsKKyAgICBFU19yZWcoY29udGV4dCkgID0gY2FsbC0+ZXM7CisgICAgRlNfcmVnKGNvbnRleHQpICA9IGNhbGwtPmZzOworICAgIEdTX3JlZyhjb250ZXh0KSAgPSBjYWxsLT5nczsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIElOVF9TZXRSZWFsTW9kZUNvbnRleHQKKyAqLworc3RhdGljIHZvaWQgSU5UX1NldFJlYWxNb2RlQ29udGV4dCggUkVBTE1PREVDQUxMICpjYWxsLCBDT05URVhUICpjb250ZXh0ICkKK3sKKyAgICBjYWxsLT5lYXggPSBFQVhfcmVnKGNvbnRleHQpOworICAgIGNhbGwtPmVieCA9IEVCWF9yZWcoY29udGV4dCk7CisgICAgY2FsbC0+ZWN4ID0gRUNYX3JlZyhjb250ZXh0KTsKKyAgICBjYWxsLT5lZHggPSBFRFhfcmVnKGNvbnRleHQpOworICAgIGNhbGwtPmVzaSA9IEVTSV9yZWcoY29udGV4dCk7CisgICAgY2FsbC0+ZWRpID0gRURJX3JlZyhjb250ZXh0KTsKKyAgICBjYWxsLT5lYnAgPSBFQlBfcmVnKGNvbnRleHQpOworICAgIGNhbGwtPmZsICA9IEZMX3JlZyhjb250ZXh0KTsKKyAgICBjYWxsLT5pcCAgPSBJUF9yZWcoY29udGV4dCk7CisgICAgY2FsbC0+c3AgID0gU1BfcmVnKGNvbnRleHQpOworICAgIGNhbGwtPmNzICA9IENTX3JlZyhjb250ZXh0KTsKKyAgICBjYWxsLT5kcyAgPSBEU19yZWcoY29udGV4dCk7CisgICAgY2FsbC0+ZXMgID0gRVNfcmVnKGNvbnRleHQpOworICAgIGNhbGwtPmZzICA9IEZTX3JlZyhjb250ZXh0KTsKKyAgICBjYWxsLT5ncyAgPSBHU19yZWcoY29udGV4dCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICBJTlRfRG9SZWFsTW9kZUludAorICovCitzdGF0aWMgdm9pZCBJTlRfRG9SZWFsTW9kZUludCggQ09OVEVYVCAqY29udGV4dCApCit7CisgICAgQ09OVEVYVCByZWFsbW9kZV9jdHg7CisgICAgUkVBTE1PREVDQUxMICpjYWxsID0gKFJFQUxNT0RFQ0FMTCAqKVBUUl9TRUdfT0ZGX1RPX0xJTiggRVNfcmVnKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJX3JlZyhjb250ZXh0KSApOworICAgIElOVF9HZXRSZWFsTW9kZUNvbnRleHQoIGNhbGwsICZyZWFsbW9kZV9jdHggKTsKKworICAgIFJFU0VUX0NGTEFHKGNvbnRleHQpOworICAgIHN3aXRjaCAoQkxfcmVnKGNvbnRleHQpKQorICAgIHsKKyAgICBjYXNlIDB4MmY6CS8qIGludDJmICovCisgICAgICAgIHN3aXRjaCAoQUhfcmVnKCZyZWFsbW9kZV9jdHgpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMHgxNToKKyAgICAgICAgICAgIC8qIE1TQ0RFWCBob29rICovCisgICAgICAgICAgICBkb19tc2NkZXgoICZyZWFsbW9kZV9jdHggKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDIxOgkvKiBpbnQyMSAqLworICAgICAgICBzd2l0Y2ggKEFIX3JlZygmcmVhbG1vZGVfY3R4KSkKKyAgICAgICAgeworICAgICAgICBjYXNlIDB4NTI6CisgICAgICAgICAgICBFU19yZWcoJnJlYWxtb2RlX2N0eCkgPSAwOworICAgICAgICAgICAgRUJYX3JlZygmcmVhbG1vZGVfY3R4KSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDY1OgorICAgICAgICAgICAgc3dpdGNoIChBTF9yZWcoJnJlYWxtb2RlX2N0eCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDB4MDY6CisgICAgICAgICAgICAgICAgey8qIGdldCBjb2xsYXRlIHRhYmxlICovCisgICAgICAgICAgICAgICAgICAgIC8qIEVTOkRJIGlzIGEgUkVBTE1PREUgcG9pbnRlciB0byA1IGJ5dGUgZG9zbWVtIAorICAgICAgICAgICAgICAgICAgICAgKiB3ZSBmaWxsIHRoYXQgd2l0aCAweDYsIHJlYWxtb2RlIHBvaW50ZXIgdG8gY29sbGF0ZVRCCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBjaGFyICp0YWJsZSA9IERPU01FTV9NYXBSZWFsVG9MaW5lYXIoCisgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKEVESV9yZWcoJnJlYWxtb2RlX2N0eCksRVNfcmVnKCZyZWFsbW9kZV9jdHgpKSk7CisgICAgICAgICAgICAgICAgICAgICooQllURSopdGFibGUgICAgICA9IDB4MDY7CisgICAgICAgICAgICAgICAgICAgICooRFdPUkQqKSh0YWJsZSsxKSA9IERPU01FTV9Db2xsYXRlVGFibGU7CisgICAgICAgICAgICAgICAgICAgIENYX3JlZygmcmVhbG1vZGVfY3R4KSA9IDI1ODsvKkZJWE1FOiBzaXplIG9mIHRhYmxlPyovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg0NDoKKyAgICAgICAgICAgIHN3aXRjaCAoQUxfcmVnKCZyZWFsbW9kZV9jdHgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAweDBEOgorICAgICAgICAgICAgICAgIHsvKiBnZW5lcmljIGJsb2NrIGRldmljZSByZXF1ZXN0ICovCisgICAgICAgICAgICAgICAgICAgIEJZVEUgKmRhdGFwdHIgPSBET1NNRU1fTWFwUmVhbFRvTGluZWFyKAorICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyhFRFhfcmVnKCZyZWFsbW9kZV9jdHgpLERTX3JlZygmcmVhbG1vZGVfY3R4KSkpOworICAgICAgICAgICAgICAgICAgICBpbnQgZHJpdmUgPSBET1NfR0VUX0RSSVZFKEJMX3JlZygmcmVhbG1vZGVfY3R4KSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChDSF9yZWcoJnJlYWxtb2RlX2N0eCkgIT0gMHgwOCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChDTF9yZWcoJnJlYWxtb2RlX2N0eCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDY2OgorICAgICAgICAgICAgICAgICAgICAgICAgeworCQkJICAgIGNoYXIgICAgbGFiZWxbMTJdLGZzbmFtZVs5XSxwYXRoWzRdOworCQkJICAgIERXT1JEICAgc2VyaWFsOworCisJCQkgICAgc3RyY3B5KHBhdGgsIng6XFwiKTtwYXRoWzBdPWRyaXZlKydBJzsKKwkJCSAgICBHZXRWb2x1bWVJbmZvcm1hdGlvbjMyQShwYXRoLGxhYmVsLDEyLCZzZXJpYWwsTlVMTCxOVUxMLGZzbmFtZSw5KTsKKwkJCSAgICAqKFdPUkQqKWRhdGFwdHIgICAgICAgICA9IDA7CisJCQkgICAgbWVtY3B5KGRhdGFwdHIrMiwmc2VyaWFsLDQpOworCQkJICAgIG1lbWNweShkYXRhcHRyKzYsbGFiZWwgICwxMSk7CisJCQkgICAgbWVtY3B5KGRhdGFwdHIrMTcsZnNuYW1lLDgpOworCQkJICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NjA6CS8qIGdldCBkZXZpY2UgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2VkIGJ5IGRlZnJhZy5leGUgb2Ygd2luOTUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChkYXRhcHRyLCAwLCAweDI2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFwdHJbMF0gPSAweDA0OworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXB0cls2XSA9IDA7IC8qIG1lZGlhIHR5cGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcml2ZSA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXB0clsxXSA9IDB4MDU7IC8qIGZpeGVkIGRpc2sgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR3b3JkKCZkYXRhcHRyWzJdLCAweDAxKTsgLyogbm9uIHJlbW92YWJsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHdvcmQoJmRhdGFwdHJbNF0sIDB4MzAwKTsgLyogIyBvZiBjeWxpbmRlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcHRyWzFdID0gMHgwNzsgLyogYmxvY2sgZGV2LCBmbG9wcHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR3b3JkKCZkYXRhcHRyWzJdLCAweDAyKTsgLyogcmVtb3ZhYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0d29yZCgmZGF0YXB0cls0XSwgODApOyAvKiAjIG9mIGN5bGluZGVycyAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQlBCKGRyaXZlLCAmZGF0YXB0cls3XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoRUZMX3JlZyhjb250ZXh0KSYxKQorICAgICAgICBmcHJpbnRmKHN0ZG5pbXAsCisgICAgICAgICAgICAgICAgIlJlYWxNb2RlSW50ICUwMng6IEVBWD0lMDhseCBFQlg9JTA4bHggRUNYPSUwOGx4IEVEWD0lMDhseFxuIgorICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgRVNJPSUwOGx4IEVEST0lMDhseCBEUz0lMDRseCBFUz0lMDRseFxuIiwKKyAgICAgICAgICAgICAgICBCTF9yZWcoY29udGV4dCksIEVBWF9yZWcoJnJlYWxtb2RlX2N0eCksCisgICAgICAgICAgICAgICAgRUJYX3JlZygmcmVhbG1vZGVfY3R4KSwgRUNYX3JlZygmcmVhbG1vZGVfY3R4KSwKKyAgICAgICAgICAgICAgICBFRFhfcmVnKCZyZWFsbW9kZV9jdHgpLCBFU0lfcmVnKCZyZWFsbW9kZV9jdHgpLAorICAgICAgICAgICAgICAgIEVESV9yZWcoJnJlYWxtb2RlX2N0eCksIERTX3JlZygmcmVhbG1vZGVfY3R4KSwKKyAgICAgICAgICAgICAgICBFU19yZWcoJnJlYWxtb2RlX2N0eCkgKTsKKyAgICBJTlRfU2V0UmVhbE1vZGVDb250ZXh0KCBjYWxsLCAmcmVhbG1vZGVfY3R4ICk7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICBJTlRfSW50MzFIYW5kbGVyCkBAIC0yMDYsMTE4ICszODUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCkgKSk7CiAJYnJlYWs7CiAKLSAgICBjYXNlIDB4MDMwMDogIC8qIFNpbXVsYXRlIHJlYWwgbW9kZSBpbnRlcnJ1cHQgCi0gICAgICAgICogIEludGVycnVwdCBudW1iZXIgaXMgaW4gQkwsIGZsYWdzIGFyZSBpbiBCSAotICAgICAgICAqICBFUzpESSBwb2ludHMgdG8gcmVhbC1tb2RlIGNhbGwgc3RydWN0dXJlICAKLSAgICAgICAgKiAgQ3VycmVudGx5IHdlIGp1c3QgcHJpbnQgaXQgb3V0IGFuZCByZXR1cm4gZXJyb3IuCi0gICAgICAgICovCi0JUkVTRVRfQ0ZMQUcoY29udGV4dCk7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFJFQUxNT0RFQ0FMTCAqcCA9IChSRUFMTU9ERUNBTEwgKilQVFJfU0VHX09GRl9UT19MSU4oIEVTX3JlZyhjb250ZXh0KSwgRElfcmVnKGNvbnRleHQpICk7Ci0KLQkgICAgc3dpdGNoIChCTF9yZWcoY29udGV4dCkpIHsKLQkgICAgY2FzZSAweDJmOgkvKiBpbnQyZiAqLwotCSAgICAJc3dpdGNoICgocC0+ZWF4ICYgMHhGRjAwKT4+OCkgewotCQljYXNlIDB4MTU6Ci0JCQkvKiBNU0NERVggaG9vayAqLwotCQkJQVhfcmVnKGNvbnRleHQpID0gcC0+ZWF4ICYgMHhGRkZGOwotICAgICAgICAgICAgICAgIAlkb19tc2NkZXgoIGNvbnRleHQgKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJU0VUX0NGTEFHKGNvbnRleHQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgMHgyMToJLyogaW50MjEgKi8KLQkgICAgCXN3aXRjaCAoKHAtPmVheCAmIDB4RkYwMCk+PjgpIHsKLQkJY2FzZSAweDY1OgotCQkgICAgc3dpdGNoIChwLT5lYXggJiAweEZGKSB7Ci0JCSAgICBjYXNlIDA2OnsvKiBnZXQgY29sbGF0ZSB0YWJsZSAqLwotCQkgICAgICAgIGNoYXIJKnRhYmxlOwotCQkgICAgICAgIC8qIEVTOkRJIGlzIGEgUkVBTE1PREUgcG9pbnRlciB0byA1IGJ5dGUgZG9zbWVtIAotCQkJICogd2UgZmlsbCB0aGF0IHdpdGggMHg2LCByZWFsbW9kZSBwb2ludGVyIHRvIGNvbGxhdGVUQgotCQkJICovCi0JCQl0YWJsZSA9IERPU01FTV9NYXBSZWFsVG9MaW5lYXIoTUFLRUxPTkcocC0+ZWRpLHAtPmVzKSk7Ci0JCQkqKEJZVEUqKXRhYmxlCQk9IDB4MDY7Ci0JCQkqKERXT1JEKikodGFibGUrMSkJPSBET1NNRU1fQ29sbGF0ZVRhYmxlOwotCi0JCQlDWF9yZWcoY29udGV4dCkJCT0gMjU4Oy8qRklYTUU6IHNpemUgb2YgdGFibGU/Ki8KLQkJCWJyZWFrOwotCQkgICAgfQotCQkgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIAkJU0VUX0NGTEFHKGNvbnRleHQpOwotCQkgICAgfQotCQkgICAgYnJlYWs7Ci0JCWNhc2UgMHg0NDoKLQkJICAgIHN3aXRjaCAocC0+ZWF4ICYgMHhGRikgewotCQkgICAgY2FzZSAweDBEOnsvKiBnZW5lcmljIGJsb2NrIGRldmljZSByZXF1ZXN0ICovCi0JCSAgICAJQllURQkqZGF0YXB0ciA9IERPU01FTV9NYXBSZWFsVG9MaW5lYXIoKHAtPmRzKSoweDEwMDArKHAtPmVkeCAmIDB4RkZGRikpOwotCQkJaW50CWRyaXZlID0gRE9TX0dFVF9EUklWRShwLT5lYngmMHhGRik7IAotCi0JCSAgICAJaWYgKChwLT5lY3ggJiAweEZGMDApICE9IDB4MDgwMCkgewotCQkJCVNFVF9DRkxBRyhjb250ZXh0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXN3aXRjaCAocC0+ZWN4ICYgMHhGRikgewotCQkJY2FzZSAweDY2OnsgCi0KLQkJCSAgICBjaGFyICAgIGxhYmVsWzEyXSxmc25hbWVbOV0scGF0aFs0XTsKLQkJCSAgICBEV09SRCAgIHNlcmlhbDsKLQotCQkJICAgIHN0cmNweShwYXRoLCJ4OlxcIik7cGF0aFswXT1kcml2ZSsnQSc7Ci0JCQkgICAgR2V0Vm9sdW1lSW5mb3JtYXRpb24zMkEocGF0aCxsYWJlbCwxMiwmc2VyaWFsLE5VTEwsTlVMTCxmc25hbWUsOSk7Ci0JCQkgICAgKihXT1JEKilkYXRhcHRyICAgICAgICAgPSAwOwotCQkJICAgIG1lbWNweShkYXRhcHRyKzIsJnNlcmlhbCw0KTsKLQkJCSAgICBtZW1jcHkoZGF0YXB0cis2LGxhYmVsICAsMTEpOwotCQkJICAgIG1lbWNweShkYXRhcHRyKzE3LGZzbmFtZSw4KTsKLQkJCSAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkJCWNhc2UgMHg2MDoJLyogZ2V0IGRldmljZSBwYXJhbWV0ZXJzICovCi0JCQkJCS8qIHVzZWQgYnkgZGVmcmFnLmV4ZSBvZiB3aW45NSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChkYXRhcHRyLCAwLCAweDI2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcHRyWzBdID0gMHgwNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcHRyWzZdID0gMDsgLyogbWVkaWEgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcml2ZSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXB0clsxXSA9IDB4MDU7IC8qIGZpeGVkIGRpc2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0d29yZCgmZGF0YXB0clsyXSwgMHgwMSk7IC8qIG5vbiByZW1vdmFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0d29yZCgmZGF0YXB0cls0XSwgMHgzMDApOyAvKiAjIG9mIGN5bGluZGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFwdHJbMV0gPSAweDA3OyAvKiBibG9jayBkZXYsIGZsb3BweSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR3b3JkKCZkYXRhcHRyWzJdLCAweDAyKTsgLyogcmVtb3ZhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHdvcmQoJmRhdGFwdHJbNF0sIDgwKTsgLyogIyBvZiBjeWxpbmRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQlBCKGRyaXZlLCAmZGF0YXB0cls3XSk7Ci0JCQkgICAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKLQkJCSAgICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJICAgIAlicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAJCVNFVF9DRkxBRyhjb250ZXh0KTsKLQkJCWJyZWFrOwotCQkgICAgfQotCQkgICAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0gICAgICAgICAgICAJICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlTRVRfQ0ZMQUcoY29udGV4dCk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGlmIChFRkxfcmVnKGNvbnRleHQpJjEpIHsKLQkgICAgICAgIGZwcmludGYoc3RkbmltcCwKLSAgICAgICAgICAgICAgICAgICAgIlJlYWxNb2RlSW50ICUwMng6IEVBWD0lMDhseCBFQlg9JTA4bHggRUNYPSUwOGx4IEVEWD0lMDhseFxuIgotICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgIEVTST0lMDhseCBFREk9JTA4bHggRVM9JTA0eCBEUz0lMDR4XG4iLAotICAgICAgICAgICAgICAgICAgICBCTF9yZWcoY29udGV4dCksIHAtPmVheCwgcC0+ZWJ4LCBwLT5lY3gsIHAtPmVkeCwKLSAgICAgICAgICAgICAgICAgICAgcC0+ZXNpLCBwLT5lZGksIHAtPmVzLCBwLT5kcwotCQkpOwotCSAgICB9Ci0gICAgICAgIH0KKyAgICBjYXNlIDB4MDMwMDogIC8qIFNpbXVsYXRlIHJlYWwgbW9kZSBpbnRlcnJ1cHQgKi8KKyAgICAgICAgSU5UX0RvUmVhbE1vZGVJbnQoIGNvbnRleHQgKTsKICAgICAgICAgYnJlYWs7CisKICAgICBjYXNlIDB4MDMwMTogIC8qIENhbGwgcmVhbCBtb2RlIHByb2NlZHVyZSB3aXRoIGZhciByZXR1cm4gKi8KICAgICAgICAgewogICAgICAgICAgICAgUkVBTE1PREVDQUxMICpwID0gKFJFQUxNT0RFQ0FMTCAqKVBUUl9TRUdfT0ZGX1RPX0xJTiggRVNfcmVnKGNvbnRleHQpLCBESV9yZWcoY29udGV4dCkgKTsKZGlmZiAtLWdpdCBhL21zZG9zL2ludDJmLmMgYi9tc2Rvcy9pbnQyZi5jCmluZGV4IGI0M2UzYjIuLjJmNGQ1NmUgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDJmLmMKKysrIGIvbXNkb3MvaW50MmYuYwpAQCAtMTksNyArMTksNiBAQAogI2RlZmluZSBWWERfQkFTRSA0MDAKIAogc3RhdGljIHZvaWQgZG9faW50MmZfMTYoIENPTlRFWFQgKmNvbnRleHQgKTsKLXZvaWQgZG9fbXNjZGV4KCBDT05URVhUICpjb250ZXh0ICk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgSU5UX0ludDJmSGFuZGxlcgpAQCAtOTMsNiArOTIsMTQgQEAKIAlzbGVlcCgwKTsKICAgICAgICAgYnJlYWs7CiAKKyAgICBjYXNlIDB4ODE6IC8qIEJlZ2luIGNyaXRpY2FsIHNlY3Rpb24uICAqLworICAgICAgICAvKiBGSVhNRT8gKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4ODI6IC8qIEVuZCBjcml0aWNhbCBzZWN0aW9uLiAgKi8KKyAgICAgICAgLyogRklYTUU/ICovCisgICAgICAgIGJyZWFrOworCiAgICAgY2FzZSAweDgzOiAgLyogUmV0dXJuIEN1cnJlbnQgVmlydHVhbCBNYWNoaW5lIElEICovCiAgICAgICAgIC8qIFZpcnR1YWwgTWFjaGluZXMgYXJlIHVzdWFsbHkgY3JlYXRlZC9kZXN0cm95ZWQgd2hlbiBXaW5kb3dzIHJ1bnMKICAgICAgICAgICogRE9TIHByb2dyYW1zLiBTaW5jZSB3ZSBuZXZlciBkbywgd2UgYXJlIGFsd2F5cyBpbiB0aGUgU3lzdGVtIFZNLgpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9NYWtlZmlsZS5pbiBiL211bHRpbWVkaWEvTWFrZWZpbGUuaW4KaW5kZXggOGYyMGUxNy4uMmYyZjE1NyAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9NYWtlZmlsZS5pbgorKysgYi9tdWx0aW1lZGlhL01ha2VmaWxlLmluCkBAIC0xLDQgKzEsNCBAQAotREVGUyAgICAgID0gLURfX1dJTkVfXworREVGUyAgICAgID0gQERMTEZMQUdTQCAtRF9fV0lORV9fCiBUT1BTUkNESVIgPSBAdG9wX3NyY2RpckAKIFRPUE9CSkRJUiA9IC4uCiBTUkNESVIgICAgPSBAc3JjZGlyQApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9NYWtlZmlsZS5pbiBiL29iamVjdHMvTWFrZWZpbGUuaW4KaW5kZXggOTUzYzY4ZC4uYWVjZmZkMCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9NYWtlZmlsZS5pbgorKysgYi9vYmplY3RzL01ha2VmaWxlLmluCkBAIC0xLDQgKzEsNCBAQAotREVGUyAgICAgID0gLURfX1dJTkVfXworREVGUyAgICAgID0gQERMTEZMQUdTQCAtRF9fV0lORV9fCiBUT1BTUkNESVIgPSBAdG9wX3NyY2RpckAKIFRPUE9CSkRJUiA9IC4uCiBTUkNESVIgICAgPSBAc3JjZGlyQApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9iaXRtYXAuYyBiL29iamVjdHMvYml0bWFwLmMKaW5kZXggMThkZjk4My4uYzZmYmJlMSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9iaXRtYXAuYworKysgYi9vYmplY3RzL2JpdG1hcC5jCkBAIC01NDIsNiArNTQyLDIzIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICBDb3B5Qml0bWFwMzIgKG5vdCBhbiBBUEkpCisgKgorICovCitIQklUTUFQMzIgV0lOQVBJIENvcHlCaXRtYXAzMiAoSEJJVE1BUDMyIGhuZCkKK3sKKyAgICBIQklUTUFQMzIgcmVzID0gMDsKKyAgICBCSVRNQVAzMiBibXA7CisKKyAgICBpZiAoR2V0T2JqZWN0MzJBIChobmQsIHNpemVvZiAoYm1wKSwgJmJtcCkpCisgICAgeworCXJlcyA9IENyZWF0ZUJpdG1hcEluZGlyZWN0MzIgKCZibXApOworCVNldEJpdG1hcEJpdHMzMiAocmVzLCBibXAuYm1XaWR0aEJ5dGVzICogYm1wLmJtSGVpZ2h0LCBibXAuYm1CaXRzKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICBDb3B5SW1hZ2UzMiAgICAoVVNFUjMyLjYwKQogICoKICAqIEZJWE1FOiBpbXBsZW1lbnRhdGlvbiBzdGlsbCBsYWNrcyBuZWFybHkgYWxsIGZlYXR1cmVzLCBzZWUgTFJfKgpAQCAtNTUzLDcgKzU3MCw3IEBACiAgICAgc3dpdGNoICh0eXBlKQogICAgIHsKIAljYXNlIElNQUdFX0JJVE1BUDoKLQkJcmV0dXJuIGhuZDsJLyogRklYTUUgLi4uIG5lZWQgdG8gY29weSBoZXJlICovCisJCXJldHVybiBDb3B5Qml0bWFwMzIoaG5kKTsKIAljYXNlIElNQUdFX0lDT046CiAJCXJldHVybiBDb3B5SWNvbjMyKGhuZCk7CiAJY2FzZSBJTUFHRV9DVVJTT1I6CmRpZmYgLS1naXQgYS9vYmplY3RzL2N1cnNvcmljb24uYyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCmluZGV4IDJhN2NjNmQuLjU2OWI2YWIgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY3Vyc29yaWNvbi5jCisrKyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCkBAIC04MTgsOCArODE4LDEwIEBACiAgKi8KIEhJQ09OMzIgV0lOQVBJIENvcHlJY29uMzIoIEhJQ09OMzIgaEljb24gKQogeworICBIVEFTSzE2IGhUYXNrID0gR2V0Q3VycmVudFRhc2sgKCk7CisgIFREQiogcFRhc2sgPSAoVERCICopIEdsb2JhbExvY2sxNiAoaFRhc2spOwogICAgIGRwcmludGZfaWNvbiggc3RkZGViLCAiQ29weUljb24zMjogJTA0eFxuIiwgaEljb24gKTsKLSAgICByZXR1cm4gQ1VSU09SSUNPTl9Db3B5KCAwLCBoSWNvbiApOworICByZXR1cm4gQ1VSU09SSUNPTl9Db3B5KCBwVGFzay0+aEluc3RhbmNlLCBoSWNvbiApOwogfQogCiAKQEAgLTE0OTcsMyArMTQ5OSw4MCBAQAogICAgIH0KICAgICByZXR1cm4gaE9iajsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgIERyYXdJY29uRXgxNgkJKFVTRVIuMzk0KQorICovCisKK0JPT0wxNiBXSU5BUEkgRHJhd0ljb25FeDE2IChIREMxNiBoZGMsIElOVDE2IHhMZWZ0LCBJTlQxNiB5VG9wLCBISUNPTjE2IGhJY29uLAorCQkJICAgIElOVDE2IGN4V2lkdGgsIElOVDE2IGN5V2lkdGgsIFVJTlQxNiBpc3RlcCwKKwkJCSAgICBIQlJVU0gxNiBoYnIsIFVJTlQxNiBmbGFncykKK3sKKyAgcmV0dXJuIERyYXdJY29uRXgzMiAoaGRjLCB4TGVmdCwgeVRvcCwgaEljb24sIGN4V2lkdGgsIGN5V2lkdGgsCisJCSAgICAgICBpc3RlcCwgaGJyLCBmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICBEcmF3SWNvbkV4MzIJCShVU0VSMzIuMTYwKQorICovCisKK0JPT0wzMiBXSU5BUEkgRHJhd0ljb25FeDMyIChIREMzMiBoZGMsIElOVDMyIHgwLCBJTlQzMiB5MCwgSElDT04zMiBoSWNvbiwKKwkJCSAgICBJTlQzMiBjeFdpZHRoLCBJTlQzMiBjeVdpZHRoLCBVSU5UMzIgaXN0ZXAsCisJCQkgICAgSEJSVVNIMzIgaGJyLCBVSU5UMzIgZmxhZ3MpCit7CisgICAgQ1VSU09SSUNPTklORk8gKnB0ciA9IChDVVJTT1JJQ09OSU5GTyAqKUdsb2JhbExvY2sxNiAoaEljb24pOworICAgIEhEQzMyIGhNZW1EQyA9IENyZWF0ZUNvbXBhdGlibGVEQzMyIChoZGMpOworICAgIEJPT0wzMiByZXN1bHQgPSBGQUxTRTsKKworICAgIGRwcmludGZfaWNvbiAoc3RkZGViLCAiRHJhd0ljb25FeDMyOiBwYXJ0IHN0dWIuXG4iKTsKKworICAgIGlmIChoTWVtREMgJiYgcHRyKQorICAgIHsKKwlIQklUTUFQMzIgaFhvckJpdHMsIGhBbmRCaXRzOworCUNPTE9SUkVGIG9sZEZnLCBvbGRCZzsKKworCS8qIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UuICAqLworCWlmIChjeFdpZHRoID09IDApCisJICAgIGlmIChmbGFncyAmIERJX0RFRkFVTFRTSVpFKQorCQljeFdpZHRoID0gR2V0U3lzdGVtTWV0cmljczMyIChTTV9DWElDT04pOworCSAgICBlbHNlCisJCWN4V2lkdGggPSBwdHItPm5XaWR0aDsKKwlpZiAoY3lXaWR0aCA9PSAwKQorCSAgICBpZiAoZmxhZ3MgJiBESV9ERUZBVUxUU0laRSkKKwkJY3lXaWR0aCA9IEdldFN5c3RlbU1ldHJpY3MzMiAoU01fQ1lJQ09OKTsKKwkgICAgZWxzZQorCQljeVdpZHRoID0gcHRyLT5uSGVpZ2h0OworCisJaFhvckJpdHMgPSBDcmVhdGVCaXRtYXAzMiAoIHB0ci0+bldpZHRoLCBwdHItPm5IZWlnaHQsCisJCQkJICAgIHB0ci0+YlBsYW5lcywgcHRyLT5iQml0c1BlclBpeGVsLAorCQkJCSAgICAoY2hhciAqKShwdHIgKyAxKQorCQkJCSAgICArIHB0ci0+bkhlaWdodCAqCisJCQkJICAgIEJJVE1BUF9XSURUSF9CWVRFUyhwdHItPm5XaWR0aCwxKSApOworCWhBbmRCaXRzID0gQ3JlYXRlQml0bWFwMzIgKCBjeFdpZHRoLCBjeVdpZHRoLAorCQkJCSAgICAxLCAxLCAoY2hhciAqKShwdHIrMSkgKTsKKwlvbGRGZyA9IFNldFRleHRDb2xvcjMyKCBoZGMsIFJHQigwLDAsMCkgKTsKKwlvbGRCZyA9IFNldEJrQ29sb3IzMiggaGRjLCBSR0IoMjU1LDI1NSwyNTUpICk7CisKKwlpZiAoaFhvckJpdHMgJiYgaEFuZEJpdHMpCisJeworCSAgICBIQklUTUFQMzIgaEJpdFRlbXAgPSBTZWxlY3RPYmplY3QzMiggaE1lbURDLCBoQW5kQml0cyApOworCSAgICBpZiAoZmxhZ3MgJiBESV9NQVNLKQorCQlCaXRCbHQzMiAoaGRjLCB4MCwgeTAsIGN4V2lkdGgsIGN5V2lkdGgsCisJCQkgIGhNZW1EQywgMCwgMCwgU1JDQU5EKTsKKwkgICAgU2VsZWN0T2JqZWN0MzIoIGhNZW1EQywgaFhvckJpdHMgKTsKKwkgICAgaWYgKGZsYWdzICYgRElfSU1BR0UpCisJCUJpdEJsdDMyIChoZGMsIHgwLCB5MCwgY3hXaWR0aCwgY3lXaWR0aCwKKwkJCSAgaE1lbURDLCAwLCAwLCBTUkNQQUlOVCk7CisJICAgIFNlbGVjdE9iamVjdDMyKCBoTWVtREMsIGhCaXRUZW1wICk7CisJICAgIHJlc3VsdCA9IFRSVUU7CisJfQorCisJU2V0VGV4dENvbG9yMzIoIGhkYywgb2xkRmcgKTsKKwlTZXRCa0NvbG9yMzIoIGhkYywgb2xkQmcgKTsKKwlpZiAoaFhvckJpdHMpIERlbGV0ZU9iamVjdDMyKCBoWG9yQml0cyApOworCWlmIChoQW5kQml0cykgRGVsZXRlT2JqZWN0MzIoIGhBbmRCaXRzICk7CisgICAgfQorICAgIGlmIChoTWVtREMpIERlbGV0ZURDMzIoIGhNZW1EQyApOworICAgIEdsb2JhbFVubG9jazE2KCBoSWNvbiApOworICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9vYmplY3RzL2RpYi5jIGIvb2JqZWN0cy9kaWIuYwppbmRleCAxZjkzMTgzLi44OGNiMDMzIDEwMDY0NAotLS0gYS9vYmplY3RzL2RpYi5jCisrKyBiL29iamVjdHMvZGliLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERJQl9Jbml0CiAgKi8KLUJPT0wzMiBESUJfSW5pdCgpCitCT09MMzIgRElCX0luaXQodm9pZCkKIHsKICAgICBpbnQJCWk7CiAgICAgWEltYWdlKgl0ZXN0aW1hZ2U7CkBAIC0xMTI3LDE0ICsxMTI3LDQ0IEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotSEJJVE1BUDMyIENyZWF0ZURJQlNlY3Rpb24oCi0JSERDMzIgaGRjLEJJVE1BUElORk8gKmJtaSxVSU5UMzIgdXNhZ2UsIExQVk9JRCAqKmJpdHMsSEFORExFMzIgc2VjdGlvbiwKLQlEV09SRCBvZmZzZXQKLSkgewotCWZwcmludGYoc3RkZXJyLCJDcmVhdGVESUJTZWN0aW9uKCVkLFt3PSVsZCxoPSVsZF0sJWQsJXAsMHglMDh4LCVsZCksc3R1YlxuIiwKLQkJaGRjLGJtaS0+Ym1pSGVhZGVyLmJpV2lkdGgsYm1pLT5ibWlIZWFkZXIuYmlIZWlnaHQsdXNhZ2UsYml0cyxzZWN0aW9uLG9mZnNldAotCSk7Ci0JKmJpdHMgPSAweENhZmVCYWJlOwotCXJldHVybiAwOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ3JlYXRlRElCU2VjdGlvbjE2ICAgIChHREkuNDg5KQorICovCitIQklUTUFQMTYgV0lOQVBJIENyZWF0ZURJQlNlY3Rpb24xNiAoSERDMTYgaGRjLCBCSVRNQVBJTkZPICpibWksIFVJTlQxNiB1c2FnZSwKKwkJCQkgICAgIExQVk9JRCAqKmJpdHMsIEhBTkRMRTE2IHNlY3Rpb24sCisJCQkJICAgICBEV09SRCBvZmZzZXQpCit7CisgIHJldHVybiBDcmVhdGVESUJTZWN0aW9uMzIgKGhkYywgYm1pLCB1c2FnZSwgYml0cywgc2VjdGlvbiwgb2Zmc2V0KTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ3JlYXRlRElCU2VjdGlvbjMyICAgIChHREkzMi4zNikKKyAqLworSEJJVE1BUDMyIFdJTkFQSSBDcmVhdGVESUJTZWN0aW9uMzIgKEhEQzMyIGhkYywgQklUTUFQSU5GTyAqYm1pLCBVSU5UMzIgdXNhZ2UsCisJCQkJICAgICBMUFZPSUQgKipiaXRzLEhBTkRMRTMyIHNlY3Rpb24sCisJCQkJICAgICBEV09SRCBvZmZzZXQpCit7CisgIEhCSVRNQVAzMiByZXMgPSAwOworCisgIGZwcmludGYoc3RkZXJyLAorCSAgIkNyZWF0ZURJQlNlY3Rpb24oJWQsW3c9JWxkLGg9JWxkXSwlZCwlcCwweCUwOHgsJWxkKSxzZW1pc3R1YlxuIiwKKwkgIGhkYyxibWktPmJtaUhlYWRlci5iaVdpZHRoLGJtaS0+Ym1pSGVhZGVyLmJpSGVpZ2h0LAorCSAgdXNhZ2UsYml0cyxzZWN0aW9uLG9mZnNldAorCSk7CisgIC8qIEZJWE1FLiAgVGhlIGZvbGxvd2luZyBsaW5lIGlzbid0IHF1aXRlIHJpZ2h0LiAgKi8KKyAgcmVzID0gQ3JlYXRlRElCaXRtYXAzMiAoaGRjLCAmYm1pLT5ibWlIZWFkZXIsIDAsIE5VTEwsIGJtaSwgMCk7CisgIGlmIChyZXMpCisgICAgeworICAgICAgQklUTUFQMzIgYm1wOworICAgICAgaWYgKEdldE9iamVjdDMyQSAocmVzLCBzaXplb2YgKGJtcCksICZibXApKQorCXsKKwkgICpiaXRzID0gYm1wLmJtQml0czsKKwkgIHJldHVybiByZXM7CisJfQorICAgIH0KKworICAvKiBFcnJvci4gICovCisgIGlmIChyZXMpIERlbGV0ZU9iamVjdDMyIChyZXMpOworICAqYml0cyA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vYmplY3RzL2ZvbnQuYyBiL29iamVjdHMvZm9udC5jCmluZGV4IDkzMTczZjkuLmY2NWYwMTYgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZm9udC5jCisrKyBiL29iamVjdHMvZm9udC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Z3N0ci5oIgogCiAjZGVmaW5lIEVOVU1fVU5JQ09ERQkweDAwMDAwMDAxCiAKQEAgLTcxNSw4ICs3MTYsOSBAQAogICAgICAgICAhZGMtPmZ1bmNzLT5wR2V0VGV4dEV4dGVudFBvaW50KCBkYywgc3RyLCBjb3VudCwgc2l6ZSApKQogICAgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJHZXRUZXh0RXh0ZW50UG9pbnQoJTA4eCAnJS4qcycgJWQgJXApOiByZXR1cm5pbmcgJWQsJWRcbiIsCi0gICAgICAgICAgICAgICAgIGhkYywgY291bnQsIHN0ciwgY291bnQsIHNpemUsIHNpemUtPmN4LCBzaXplLT5jeSApOworICAgIGRwcmludGZfZm9udChzdGRkZWIsIkdldFRleHRFeHRlbnRQb2ludCglMDh4ICVzICVkICVwKTogcmV0dXJuaW5nICVkLCVkXG4iLAorICAgICAgICAgICAgICAgICBoZGMsIGRlYnVnc3RyX2FuIChzdHIsIGNvdW50KSwgY291bnQsCisJCSBzaXplLCBzaXplLT5jeCwgc2l6ZS0+Y3kgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9nZGlvYmouYyBiL29iamVjdHMvZ2Rpb2JqLmMKaW5kZXggNjUwNDY3Ni4uZGQ0OTUzMCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9nZGlvYmouYworKysgYi9vYmplY3RzL2dkaW9iai5jCkBAIC03MzgsMTMgKzczOCwxOCBAQAogICovCiBCT09MMTYgV0lOQVBJIElzR0RJT2JqZWN0KCBIR0RJT0JKMTYgaGFuZGxlICkKIHsKLSAgICBHRElPQkpIRFIgKm9iamVjdCA9IChHRElPQkpIRFIgKikgR0RJX0hFQVBfTE9DSyggaGFuZGxlICk7Ci0gICAgaWYgKG9iamVjdCkKKyAgICBpZiAoaGFuZGxlID49IEZJUlNUX1NUT0NLX0hBTkRMRSApIAorCXJldHVybiBUUlVFOworICAgIGVsc2UKICAgICB7Ci0gICAgICAgIFVJTlQxNiBtYWdpYyA9IG9iamVjdC0+d01hZ2ljOwotICAgICAgICBHRElfSEVBUF9VTkxPQ0soIGhhbmRsZSApOwotICAgICAgICBpZiAobWFnaWMgPj0gUEVOX01BR0lDICYmIG1hZ2ljIDw9IE1FVEFGSUxFX0RDX01BR0lDKQotICAgICAgICAgICAgcmV0dXJuIG1hZ2ljIC0gUEVOX01BR0lDICsgMTsKKwlHRElPQkpIRFIgKm9iamVjdCA9IChHRElPQkpIRFIgKikgR0RJX0hFQVBfTE9DSyggaGFuZGxlICk7CisJaWYgKG9iamVjdCkKKwl7CisJICAgIFVJTlQxNiBtYWdpYyA9IG9iamVjdC0+d01hZ2ljOworCSAgICBHRElfSEVBUF9VTkxPQ0soIGhhbmRsZSApOworCSAgICBpZiAobWFnaWMgPj0gUEVOX01BR0lDICYmIG1hZ2ljIDw9IE1FVEFGSUxFX0RDX01BR0lDKQorCQlyZXR1cm4gbWFnaWMgLSBQRU5fTUFHSUMgKyAxOworCX0KICAgICB9CiAgICAgcmV0dXJuIEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9vZW1iaXRtYXAuYyBiL29iamVjdHMvb2VtYml0bWFwLmMKaW5kZXggYmExM2I4Mi4uM2E3YmNhYSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9vZW1iaXRtYXAuYworKysgYi9vYmplY3RzL29lbWJpdG1hcC5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSAiYml0bWFwcy9vYm1fc2l6ZSIKICNpbmNsdWRlICJiaXRtYXBzL29ibV9vbGRfY2xvc2UiCiAjaW5jbHVkZSAiYml0bWFwcy9vYm1fdHJ0eXBlIgorI2luY2x1ZGUgImJpdG1hcHMvb2JtX3JhZGlvY2hlY2siCiAKICNpbmNsdWRlICJiaXRtYXBzL29ibV96b29tZCIKICNpbmNsdWRlICJiaXRtYXBzL29ibV9yZWR1Y2VkIgpAQCAtNzAsNyArNzEsNyBAQAogI2luY2x1ZGUgImJpdG1hcHMvb2JtX2Nsb3NlZF85NSIKIAogCi0jZGVmaW5lIE9CTV9GSVJTVCAgT0JNX1RSVFlQRQkgICAvKiBGaXJzdCBPRU0gYml0bWFwICovCisjZGVmaW5lIE9CTV9GSVJTVCAgT0JNX1JBRElPQ0hFQ0sgIC8qIEZpcnN0IE9FTSBiaXRtYXAgKi8KICNkZWZpbmUgT0JNX0xBU1QgICBPQk1fT0xEX0NMT1NFICAgLyogTGFzdCBPRU0gYml0bWFwICovCiAKIHN0YXRpYyBzdHJ1Y3QKQEAgLTc4LDYgKzc5LDcgQEAKICAgICBjaGFyKiogZGF0YTsgICAvKiBQb2ludGVyIHRvIGJpdG1hcCBkYXRhICovCiAgICAgQk9PTDMyIGNvbG9yOyAgLyogSXMgaXQgYSBjb2xvciBiaXRtYXA/ICAqLwogfSBPQk1fUGl4bWFwc19EYXRhW09CTV9MQVNULU9CTV9GSVJTVCsxXSA9IHsKKyAgICB7IG9ibV9yYWRpb2NoZWNrLCBGQUxTRSB9LAkvKiBPQk1fUkFESU9DSEVDSyAqLwogICAgIHsgb2JtX3RydHlwZSwgVFJVRSB9LAkvKiBPQk1fVFJUWVBFICovICAgIAogICAgIHsgb2JtX2Nkcm9tLCBUUlVFIH0sICAgICAgICAvKiBPQk1fQ0RST00gICAgKi8KICAgICB7IG9ibV9oYXJkZGlzaywgVFJVRSB9LCAgICAgLyogT0JNX0hBUkRESVNLICovCmRpZmYgLS1naXQgYS9vYmplY3RzL3JlZ2lvbi5jIGIvb2JqZWN0cy9yZWdpb24uYwppbmRleCBmZDBiYmI1Li42NTk1MWVhIDEwMDY0NAotLS0gYS9vYmplY3RzL3JlZ2lvbi5jCisrKyBiL29iamVjdHMvcmVnaW9uLmMKQEAgLTM5LDE2ICszOSwyMiBAQAogSU5UMzIgV0lOQVBJIE9mZnNldFJnbjMyKCBIUkdOMzIgaHJnbiwgSU5UMzIgeCwgSU5UMzIgeSApCiB7CiAgICAgUkdOT0JKICogb2JqID0gKFJHTk9CSiAqKSBHRElfR2V0T2JqUHRyKCBocmduLCBSRUdJT05fTUFHSUMgKTsKLSAgICBpZiAoIW9iaikgcmV0dXJuIEVSUk9SOwotICAgIGRwcmludGZfcmVnaW9uKHN0ZGRlYiwgIk9mZnNldFJnbjogJTA0eCAlZCwlZFxuIiwgaHJnbiwgeCwgeSApOwotICAgIGlmICghb2JqLT54cmduKSAKKworICAgIGlmIChvYmopCiAgICAgewotICAgICAgR0RJX0hFQVBfVU5MT0NLKCBocmduICk7Ci0gICAgICByZXR1cm4gTlVMTFJFR0lPTjsKKwlJTlQzMiByZXQ7CisJZHByaW50Zl9yZWdpb24oc3RkZGViLCAiT2Zmc2V0UmduOiAlMDR4ICVkLCVkXG4iLCBocmduLCB4LCB5ICk7CisJaWYgKG9iai0+eHJnbikgCisJeworCSAgICBYT2Zmc2V0UmVnaW9uKCBvYmotPnhyZ24sIHgsIHkgKTsKKwkgICAgcmV0ID0gQ09NUExFWFJFR0lPTjsKKwl9CisJZWxzZQorCSAgICByZXQgPSBOVUxMUkVHSU9OOworCUdESV9IRUFQX1VOTE9DSyggaHJnbiApOworCXJldHVybiByZXQ7CiAgICAgfQotICAgIFhPZmZzZXRSZWdpb24oIG9iai0+eHJnbiwgeCwgeSApOwotICAgIEdESV9IRUFQX1VOTE9DSyggaHJnbiApOwotICAgIHJldHVybiBDT01QTEVYUkVHSU9OOworICAgIHJldHVybiBFUlJPUjsKIH0KIAogCkBAIC01OCwyMyArNjQsMjcgQEAKIElOVDE2IFdJTkFQSSBHZXRSZ25Cb3gxNiggSFJHTjE2IGhyZ24sIExQUkVDVDE2IHJlY3QgKQogewogICAgIFJHTk9CSiAqIG9iaiA9IChSR05PQkogKikgR0RJX0dldE9ialB0ciggaHJnbiwgUkVHSU9OX01BR0lDICk7Ci0gICAgaWYgKCFvYmopIHJldHVybiBFUlJPUjsKLSAgICBkcHJpbnRmX3JlZ2lvbihzdGRkZWIsICJHZXRSZ25Cb3g6ICUwNHhcbiIsIGhyZ24gKTsKLSAgICBpZiAoIW9iai0+eHJnbikKKyAgICBpZiAob2JqKQogICAgIHsKLSAgICAgICAgU2V0UmVjdEVtcHR5MTYoIHJlY3QgKTsKLQlHRElfSEVBUF9VTkxPQ0soIGhyZ24gKTsKLSAgICAgICAgcmV0dXJuIE5VTExSRUdJT047Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFhSZWN0YW5nbGUgeHJlY3Q7Ci0gICAgICAgIFhDbGlwQm94KCBvYmotPnhyZ24sICZ4cmVjdCApOworCUlOVDE2IHJldDsKKwlkcHJpbnRmX3JlZ2lvbihzdGRkZWIsICJHZXRSZ25Cb3g6ICUwNHhcbiIsIGhyZ24gKTsKKwlpZiAob2JqLT54cmduKQorCXsKKwkgICAgWFJlY3RhbmdsZSB4cmVjdDsKKwkgICAgWENsaXBCb3goIG9iai0+eHJnbiwgJnhyZWN0ICk7CisJICAgIFNldFJlY3QxNiggcmVjdCwgeHJlY3QueCwgeHJlY3QueSwKKwkJICAgICAgIHhyZWN0LnggKyB4cmVjdC53aWR0aCwgeHJlY3QueSArIHhyZWN0LmhlaWdodCk7CisJICAgIHJldCA9IENPTVBMRVhSRUdJT047CisJfQorCWVsc2UKKwl7CisJICAgIFNldFJlY3RFbXB0eTE2KCByZWN0ICk7CisJICAgIHJldCA9IE5VTExSRUdJT047CisJfQogCUdESV9IRUFQX1VOTE9DSyhocmduKTsKLSAgICAgICAgU2V0UmVjdDE2KCByZWN0LCB4cmVjdC54LCB4cmVjdC55LAotICAgICAgICAgICAgICAgICAgIHhyZWN0LnggKyB4cmVjdC53aWR0aCwgeHJlY3QueSArIHhyZWN0LmhlaWdodCk7Ci0gICAgICAgIHJldHVybiBDT01QTEVYUkVHSU9OOworICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KKyAgICByZXR1cm4gRVJST1I7CiB9CiAKIApAQCAtNDY5LDEzICs0NzksMTggQEAKIEJPT0wzMiBXSU5BUEkgUHRJblJlZ2lvbjMyKCBIUkdOMzIgaHJnbiwgSU5UMzIgeCwgSU5UMzIgeSApCiB7CiAgICAgUkdOT0JKICogb2JqOwotICAgIEJPT0wzMiByZXN1bHQ7CiAgICAgCi0gICAgaWYgKCEob2JqID0gKFJHTk9CSiAqKSBHRElfR2V0T2JqUHRyKCBocmduLCBSRUdJT05fTUFHSUMgKSkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIW9iai0+eHJnbikgcmVzdWx0ID0gRkFMU0U7Ci0gICAgZWxzZSByZXN1bHQgPSBYUG9pbnRJblJlZ2lvbiggb2JqLT54cmduLCB4LCB5ICk7Ci0gICAgR0RJX0hFQVBfVU5MT0NLKCBocmduICk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoKG9iaiA9IChSR05PQkogKikgR0RJX0dldE9ialB0ciggaHJnbiwgUkVHSU9OX01BR0lDICkpKQorICAgIHsKKwlCT09MMzIgcmV0OworCWlmIChvYmotPnhyZ24pCisJICAgIHJldCA9IFhQb2ludEluUmVnaW9uKCBvYmotPnhyZ24sIHgsIHkgKTsKKwllbHNlCisJICAgIHJldCA9IEZBTFNFOworCUdESV9IRUFQX1VOTE9DSyggaHJnbiApOworCXJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKIH0KIAogCkBAIC00ODUsMTUgKzUwMCwxOSBAQAogQk9PTDE2IFdJTkFQSSBSZWN0SW5SZWdpb24xNiggSFJHTjE2IGhyZ24sIGNvbnN0IFJFQ1QxNiAqcmVjdCApCiB7CiAgICAgUkdOT0JKICogb2JqOwotICAgIEJPT0wxNiByZXN1bHQ7CiAKLSAgICBpZiAoIShvYmogPSAoUkdOT0JKICopIEdESV9HZXRPYmpQdHIoIGhyZ24sIFJFR0lPTl9NQUdJQyApKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghb2JqLT54cmduKSByZXN1bHQgPSBGQUxTRTsKLSAgICBlbHNlIHJlc3VsdCA9IChYUmVjdEluUmVnaW9uKCBvYmotPnhyZ24sIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPnJpZ2h0LXJlY3QtPmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LT5ib3R0b20tcmVjdC0+dG9wICkgIT0gUmVjdGFuZ2xlT3V0KTsKLSAgICBHRElfSEVBUF9VTkxPQ0soIGhyZ24gKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIGlmICgob2JqID0gKFJHTk9CSiAqKSBHRElfR2V0T2JqUHRyKCBocmduLCBSRUdJT05fTUFHSUMgKSkpCisgICAgeworCUJPT0wxNiByZXQ7CisJaWYgKG9iai0+eHJnbikKKwkgICAgcmV0ID0gKFhSZWN0SW5SZWdpb24oIG9iai0+eHJnbiwgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLAorICAgICAgICAgICAgICAgICAgIHJlY3QtPnJpZ2h0LXJlY3QtPmxlZnQsIHJlY3QtPmJvdHRvbS1yZWN0LT50b3AgKSAhPSBSZWN0YW5nbGVPdXQpOworCWVsc2UKKwkgICAgcmV0ID0gRkFMU0U7CisJR0RJX0hFQVBfVU5MT0NLKCBocmduICk7CisJcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiAKQEAgLTUwMywxNSArNTIyLDE5IEBACiBCT09MMzIgV0lOQVBJIFJlY3RJblJlZ2lvbjMyKCBIUkdOMzIgaHJnbiwgY29uc3QgUkVDVDMyICpyZWN0ICkKIHsKICAgICBSR05PQkogKiBvYmo7Ci0gICAgQk9PTDMyIHJlc3VsdDsKICAgICAKLSAgICBpZiAoIShvYmogPSAoUkdOT0JKICopIEdESV9HZXRPYmpQdHIoIGhyZ24sIFJFR0lPTl9NQUdJQyApKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghb2JqLT54cmduKSByZXN1bHQgPSBGQUxTRTsKLSAgICBlbHNlIHJlc3VsdCA9IChYUmVjdEluUmVnaW9uKCBvYmotPnhyZ24sIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPnJpZ2h0LXJlY3QtPmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LT5ib3R0b20tcmVjdC0+dG9wICkgIT0gUmVjdGFuZ2xlT3V0KTsKLSAgICBHRElfSEVBUF9VTkxPQ0soIGhyZ24gKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIGlmICgob2JqID0gKFJHTk9CSiAqKSBHRElfR2V0T2JqUHRyKCBocmduLCBSRUdJT05fTUFHSUMgKSkpCisgICAgeworCUJPT0wzMiByZXQ7CisJaWYgKG9iai0+eHJnbikKKwkgICAgcmV0ID0gKFhSZWN0SW5SZWdpb24oIG9iai0+eHJnbiwgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLAorICAgICAgICAgICAgICAgICAgIHJlY3QtPnJpZ2h0LXJlY3QtPmxlZnQsIHJlY3QtPmJvdHRvbS1yZWN0LT50b3AgKSAhPSBSZWN0YW5nbGVPdXQpOworCWVsc2UKKwkgICAgcmV0ID0gRkFMU0U7CisJR0RJX0hFQVBfVU5MT0NLKCBocmduICk7CisJcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiAKQEAgLTUzMCwxOSArNTUzLDIxIEBACiBCT09MMzIgV0lOQVBJIEVxdWFsUmduMzIoIEhSR04zMiByZ24xLCBIUkdOMzIgcmduMiApCiB7CiAgICAgUkdOT0JKICpvYmoxLCAqb2JqMjsKLSAgICBCT09MMzIgcmVzdWx0OworICAgIEJPT0wzMiByZXQgPSBGQUxTRTsKIAotICAgIGlmICghKG9iajEgPSAoUkdOT0JKICopIEdESV9HZXRPYmpQdHIoIHJnbjEsIFJFR0lPTl9NQUdJQyApKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghKG9iajIgPSAoUkdOT0JKICopIEdESV9HZXRPYmpQdHIoIHJnbjIsIFJFR0lPTl9NQUdJQyApKSkgCisgICAgaWYgKChvYmoxID0gKFJHTk9CSiAqKSBHRElfR2V0T2JqUHRyKCByZ24xLCBSRUdJT05fTUFHSUMgKSkpIAogICAgIHsKLSAgICAgIEdESV9IRUFQX1VOTE9DSyggcmduMSApOwotICAgICAgcmV0dXJuIEZBTFNFOworCWlmICgob2JqMiA9IChSR05PQkogKikgR0RJX0dldE9ialB0ciggcmduMiwgUkVHSU9OX01BR0lDICkpKSAKKwl7CisJICAgIGlmICghb2JqMS0+eHJnbiB8fCAhb2JqMi0+eHJnbikgCisJCXJldCA9ICghb2JqMS0+eHJnbiAmJiAhb2JqMi0+eHJnbik7CisJICAgIGVsc2UgCisJCXJldCA9IFhFcXVhbFJlZ2lvbiggb2JqMS0+eHJnbiwgb2JqMi0+eHJnbiApOworCSAgICBHRElfSEVBUF9VTkxPQ0soIHJnbjIgKTsKKwl9CisJR0RJX0hFQVBfVU5MT0NLKCByZ24xICk7CiAgICAgfQotICAgIGlmICghb2JqMS0+eHJnbiB8fCAhb2JqMi0+eHJnbikgcmVzdWx0ID0gKCFvYmoxLT54cmduICYmICFvYmoyLT54cmduKTsKLSAgICBlbHNlIHJlc3VsdCA9IFhFcXVhbFJlZ2lvbiggb2JqMS0+eHJnbiwgb2JqMi0+eHJnbiApOwotICAgIEdESV9IRUFQX1VOTE9DSyggcmduMSApOwotICAgIEdESV9IRUFQX1VOTE9DSyggcmduMiApOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJldDsKIH0KIAogCmRpZmYgLS1naXQgYS9vYmplY3RzL3RleHQuYyBiL29iamVjdHMvdGV4dC5jCmluZGV4IGFhYjgyZmEuLjc4NDRkOGEgMTAwNjQ0Ci0tLSBhL29iamVjdHMvdGV4dC5jCisrKyBiL29iamVjdHMvdGV4dC5jCkBAIC04MCwxMCArODAsMTEgQEAKIAkgICAgYnJlYWs7CiAJICAgIAogCWNhc2UgUFJFRklYOgotCSAgICBpZiAoIShmb3JtYXQgJiBEVF9OT1BSRUZJWCkpCi0JICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyWysraV0gIT0gUFJFRklYKQorCSAgICBpZiAoIShmb3JtYXQgJiBEVF9OT1BSRUZJWCkgJiYgKmNvdW50ID4gMSkKICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0clsrK2ldID09IFBSRUZJWCkKKwkJICAgICgqY291bnQpLS07CisJCWVsc2UgewogICAgICAgICAgICAgICAgICAgICBwcmVmaXhfb2Zmc2V0ID0gajsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUuaW4KaW5kZXggYTA5Zjg2ZC4uYzE5NDhkNiAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlLmluCkBAIC0xLDMgKzEsNCBAQAorREVGUyAgICAgID0gLURXSU5FTElCCiBUT1BTUkNESVIgPSBAdG9wX3NyY2RpckAKIFRPUE9CSkRJUiA9IC4uLy4uCiBTUkNESVIgICAgPSBAc3JjZGlyQApAQCAtNSw3ICs2LDYgQEAKIE1PRFVMRSAgICA9IG5vbmUKIFBST0dSQU1TICA9IHByb2dtYW4KIEFMTF9MSUJTICA9ICQoV0lORUxJQikgJChYX0xJQlMpICQoWFBNX0xJQikgJChYTElCKSAkKExETElCUykKLURFRlMgICAgICA9IC1JJChTUkNESVIpCiBSQ0ZMQUdTICAgPSAtdzMyIC1oCiAKIExBTkdVQUdFUyAgID0gRW4gRGEgRGUgRnIgRmkgS28gSHUgSXQgVmEKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3Byb2dtYW4vbWFpbi5jIGIvcHJvZ3JhbXMvcHJvZ21hbi9tYWluLmMKaW5kZXggYmM5Yjg0My4uNmYwZTk4NSAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvcHJvZ21hbi9tYWluLmMKKysrIGIvcHJvZ3JhbXMvcHJvZ21hbi9tYWluLmMKQEAgLTM1NywxNCArMzU3LDkgQEAKICAgICAgIFdpbmVXYXJyYW50eShHbG9iYWxzLmhNYWluV25kLCBHbG9iYWxzLmxwc3pMYW5ndWFnZSk7CiAgICAgICBicmVhazsKIAotI2lmZGVmIFdJTkVMSUIKICAgICBjYXNlIFBNX0FCT1VUX1dJTkU6Ci0gICAgICB7Ci0JZXh0ZXJuIGNvbnN0IGNoYXIgcGVvcGxlW107Ci0JU2hlbGxBYm91dChoV25kLCAiV0lORSIsIHBlb3BsZSwgMCk7Ci0gICAgICB9CisgICAgICBTaGVsbEFib3V0KGhXbmQsICJXSU5FIiwgIlByb2dyYW0gTWFuYWdlciIsIDApOwogICAgICAgYnJlYWs7Ci0jZW5kaWYKIAogICAgIGRlZmF1bHQ6CiAgICAgICBpZiAod1BhcmFtID49IFBNX0ZJUlNUX0xBTkdVQUdFICYmIHdQYXJhbSA8PSBQTV9MQVNUX0xBTkdVQUdFKQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvd2luaGVscC9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUuaW4KaW5kZXggMjJiNjA1YS4uMzIyYmIwYiAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvd2luaGVscC9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy93aW5oZWxwL01ha2VmaWxlLmluCkBAIC0xLDMgKzEsNCBAQAorREVGUyAgICAgID0gLURXSU5FTElCCiBUT1BTUkNESVIgPSBAdG9wX3NyY2RpckAKIFRPUE9CSkRJUiA9IC4uLy4uCiBTUkNESVIgICAgPSBAc3JjZGlyQApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvd2luaGVscC93aW5oZWxwLmMgYi9wcm9ncmFtcy93aW5oZWxwL3dpbmhlbHAuYwppbmRleCA4YjUzMDU1Li5jZDhhMjJiIDEwMDY0NAotLS0gYS9wcm9ncmFtcy93aW5oZWxwL3dpbmhlbHAuYworKysgYi9wcm9ncmFtcy93aW5oZWxwL3dpbmhlbHAuYwpAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgInJlc291cmNlLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgInNoZWxsLmgiCi1leHRlcm4gY29uc3QgY2hhciBwZW9wbGVbXTsKICNlbmRpZgogI2luY2x1ZGUgIndpbmhlbHAuaCIKIApAQCAtNDIxLDExICs0MjAsMTAgQEAKIAogCSAgLyogTWVudSBJbmZvICovCiAJY2FzZSBXSF9BQk9VVDogICAgICAgICAgIE1BQ1JPX0Fib3V0KCk7ICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFdJTkVMSUIKKwogCWNhc2UgV0hfQUJPVVRfV0lORTogCi0JICBTaGVsbEFib3V0KGhXbmQsICJXSU5FIiwgcGVvcGxlLCAwKTsKKwkgIFNoZWxsQWJvdXQoaFduZCwgIldJTkUiLCAiSGVscCIsIDApOwogCSAgYnJlYWs7Ci0jZW5kaWYKIAogCWRlZmF1bHQ6CiAJICAvKiBCdXR0b25zICovCmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvTWFrZWZpbGUuaW4gYi9yZXNvdXJjZXMvTWFrZWZpbGUuaW4KaW5kZXggNDMwMTJlNS4uYTk5YjYwNSAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL01ha2VmaWxlLmluCisrKyBiL3Jlc291cmNlcy9NYWtlZmlsZS5pbgpAQCAtMSw0ICsxLDQgQEAKLURFRlMgICAgICA9IC1EX19XSU5FX18KK0RFRlMgICAgICA9IEBETExGTEFHU0AgLURfX1dJTkVfXwogVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACiBUT1BPQkpESVIgPSAuLgogU1JDRElSICAgID0gQHNyY2RpckAKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfQ3oucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0N6LnJjCmluZGV4IGRiMTk2YjAuLjc3MThlZGEgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfQ3oucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19Dei5yYwpAQCAtNDIsMTggKzQyLDE4IEBACiAgICAgICAgIFBVU0hCVVRUT04gIiZOZSIsIDcsIDMwNCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogRU5ECiAKLVNIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA1MCwgNDQsIDIyMywgMjcwCi1TVFlMRSBEU19MT0NBTEVESVQgfCBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK1NIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAxNSwgNDAsIDIxMCwgMTUyCitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKIENBUFRJT04gIk8gYXBsaWthY2kgJXMiCiBGT05UIDEwLCAiU3lzdGVtIgogewotIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgOTEsIDI1MCwgNDAsIDE0Ci0gQ09OVFJPTCAiIiwgLTEsICJTVEFUSUMiLCBTU19CTEFDS0ZSQU1FIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfRElTQUJMRUQsIDQsIDM1LCAyMTUsIDIxMAotIExURVhUICJUZXh0IiwgMTAwLCAxMSwgNDAsIDIwMCwgMjAwLCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCi0gSUNPTiAiIiwgMTA4OCwgMTk1LCAxMCwgMTgsIDIwCisgREVGUFVTSEJVVFRPTiAiT0siLCAxLCAxNTMsIDEzMCwgNTAsIDEyCisgTElTVEJPWCA5OSwgOCwgNjUsIDEzNywgODIsIExCU19OT1RJRlkgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCisgSUNPTiAiIiwgMTA4OCwgMTg5LCAxMCwgMTQsIDE2CisgTFRFWFQgIiIsIDEwMCwgOCwgMTAsIDEzNywgMzMKKyBMVEVYVCAiV2luZSB3YXMgYnJvdWdodCB0byB5b3UgYnk6IiwgOTgsIDgsIDU1LCAxMzcsIDEwCiB9CiAKLQogT1BFTl9GSUxFIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjc1LCAxMzQKIFNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCiBDQVBUSU9OICJPdGV2+GVu7SBzb3Vib3J1IgpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19EYS5yYyBiL3Jlc291cmNlcy9zeXNyZXNfRGEucmMKaW5kZXggNWM2MGFkOC4uZWM5OWNkNiAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19EYS5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX0RhLnJjCkBAIC00MiwxOCArNDIsMTggQEAKICAgICAgICAgUFVTSEJVVFRPTiAiJk5laiIsIDcsIDMwNCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogRU5ECiAKLVNIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA1MCwgNDQsIDIyMywgMjcwCi1TVFlMRSBEU19MT0NBTEVESVQgfCBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK1NIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAxNSwgNDAsIDIxMCwgMTUyCitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKIENBUFRJT04gIk9tICVzIgogRk9OVCAxMCwgIlN5c3RlbSIKIHsKLSBERUZQVVNIQlVUVE9OICJPayIsIDEsIDkxLCAyNTAsIDQwLCAxNAotIENPTlRST0wgIiIsIC0xLCAiU1RBVElDIiwgU1NfQkxBQ0tGUkFNRSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0RJU0FCTEVELCA0LCAzNSwgMjE1LCAyMTAKLSBMVEVYVCAiVGVrc3QiLCAxMDAsIDExLCA0MCwgMjAwLCAyMDAsIFNTX05PUFJFRklYIHwgV1NfR1JPVVAKLSBJQ09OICIiLCAxMDg4LCAxOTUsIDEwLCAxOCwgMjAKKyBERUZQVVNIQlVUVE9OICJPSyIsIDEsIDE1MywgMTMwLCA1MCwgMTIKKyBMSVNUQk9YIDk5LCA4LCA2NSwgMTM3LCA4MiwgTEJTX05PVElGWSB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIKKyBJQ09OICIiLCAxMDg4LCAxODksIDEwLCAxNCwgMTYKKyBMVEVYVCAiIiwgMTAwLCA4LCAxMCwgMTM3LCAzMworIExURVhUICJXaW5lIHdhcyBicm91Z2h0IHRvIHlvdSBieToiLCA5OCwgOCwgNTUsIDEzNywgMTAKIH0KIAotCiBPUEVOX0ZJTEUgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNzUsIDEzNAogU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKIENBUFRJT04gIsVibiIKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfRGUucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0RlLnJjCmluZGV4IGE5MjA4Y2MuLmI4NjZmZDQgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfRGUucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19EZS5yYwpAQCAtNDIsMTUgKzQyLDE2IEBACiAgICAgICAgIFBVU0hCVVRUT04gIiZOZWluIiwgNywgMzA0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCiBFTkQKIAotU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDUwLCA0NCwgMjIzLCAyNzAKLVNUWUxFIERTX0xPQ0FMRURJVCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDE1LCA0MCwgMjEwLCAxNTIKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQ0FQVElPTiAiSW5mbyD8YmVyICVzIgogRk9OVCAxMCwgIlN5c3RlbSIKIHsKLSBERUZQVVNIQlVUVE9OICJPSyIsIDEsIDkxLCAyNTAsIDQwLCAxNAotIENPTlRST0wgIiIsIC0xLCAiU1RBVElDIiwgU1NfQkxBQ0tGUkFNRSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0RJU0FCTEVELCA0LCAzNSwgMjE1LCAyMTAKLSBMVEVYVCAiVGV4dCIsIDEwMCwgMTEsIDQwLCAyMDAsIDIwMCwgU1NfTk9QUkVGSVggfCBXU19HUk9VUAotIElDT04gIiIsIDEwODgsIDE5NSwgMTAsIDE4LCAyMAorIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgMTUzLCAxMzAsIDUwLCAxMgorIExJU1RCT1ggOTksIDgsIDY1LCAxMzcsIDgyLCBMQlNfTk9USUZZIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUgorIElDT04gIiIsIDEwODgsIDE4OSwgMTAsIDE0LCAxNgorIExURVhUICIiLCAxMDAsIDgsIDEwLCAxMzcsIDMzCisgTFRFWFQgIldpbmUgd2FzIGJyb3VnaHQgdG8geW91IGJ5OiIsIDk4LCA4LCA1NSwgMTM3LCAxMAogfQogCiAKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfRW4ucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0VuLnJjCmluZGV4IGI3YjZhZGUuLjk1MDE1ODAgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfRW4ucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19Fbi5yYwpAQCAtNDIsMTggKzQyLDE4IEBACiAgICAgICAgIFBVU0hCVVRUT04gIiZObyIsIDcsIDMwNCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogRU5ECiAKLVNIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA1MCwgNDQsIDIyMywgMjcwCi1TVFlMRSBEU19MT0NBTEVESVQgfCBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK1NIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAxNSwgNDAsIDIxMCwgMTUyCitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKIENBUFRJT04gIkFib3V0ICVzIgogRk9OVCAxMCwgIlN5c3RlbSIKIHsKLSBERUZQVVNIQlVUVE9OICJPSyIsIDEsIDkxLCAyNTAsIDQwLCAxNAotIENPTlRST0wgIiIsIC0xLCAiU1RBVElDIiwgU1NfQkxBQ0tGUkFNRSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0RJU0FCTEVELCA0LCAzNSwgMjE1LCAyMTAKLSBMVEVYVCAiVGV4dCIsIDEwMCwgMTEsIDQwLCAyMDAsIDIwMCwgU1NfTk9QUkVGSVggfCBXU19HUk9VUAotIElDT04gIiIsIDEwODgsIDE5NSwgMTAsIDE4LCAyMAorIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgMTUzLCAxMzAsIDUwLCAxMgorIExJU1RCT1ggOTksIDgsIDY1LCAxMzcsIDgyLCBMQlNfTk9USUZZIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUgorIElDT04gIiIsIDEwODgsIDE4OSwgMTAsIDE0LCAxNgorIExURVhUICIiLCAxMDAsIDgsIDEwLCAxMzcsIDMzCisgTFRFWFQgIldpbmUgd2FzIGJyb3VnaHQgdG8geW91IGJ5OiIsIDk4LCA4LCA1NSwgMTM3LCAxMAogfQogCi0KIE9QRU5fRklMRSBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI3NSwgMTM0CiBTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQ0FQVElPTiAiT3BlbiIKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfRW8ucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0VvLnJjCmluZGV4IGE1ZDViMzFlLi4yZmE2ZTgwIDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzX0VvLnJjCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfRW8ucmMKQEAgLTQyLDE4ICs0MiwxOCBAQAogICAgICAgICBQVVNIQlVUVE9OICJOJmUiLCA3LCAzMDQsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKIEVORAogCi1TSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgNTAsIDQ0LCAyMjMsIDI3MAotU1RZTEUgRFNfTE9DQUxFRElUIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitTSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMTUsIDQwLCAyMTAsIDE1MgorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCiBDQVBUSU9OICJQcmkgJXMiCiBGT05UIDEwLCAiU3lzdGVtIgogewotIERFRlBVU0hCVVRUT04gIkVub3JkZSIsIDEsIDkxLCAyNTAsIDQwLCAxNAotIENPTlRST0wgIiIsIC0xLCAiU1RBVElDIiwgU1NfQkxBQ0tGUkFNRSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0RJU0FCTEVELCA0LCAzNSwgMjE1LCAyMTAKLSBMVEVYVCAiVGV4dCIsIDEwMCwgMTEsIDQwLCAyMDAsIDIwMCwgU1NfTk9QUkVGSVggfCBXU19HUk9VUAotIElDT04gIiIsIDEwODgsIDE5NSwgMTAsIDE4LCAyMAorIERFRlBVU0hCVVRUT04gIkVub3JkZSIsIDEsIDE1MywgMTMwLCA1MCwgMTIKKyBMSVNUQk9YIDk5LCA4LCA2NSwgMTM3LCA4MiwgTEJTX05PVElGWSB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIKKyBJQ09OICIiLCAxMDg4LCAxODksIDEwLCAxNCwgMTYKKyBMVEVYVCAiIiwgMTAwLCA4LCAxMCwgMTM3LCAzMworIExURVhUICJXaW5lIHdhcyBicm91Z2h0IHRvIHlvdSBieToiLCA5OCwgOCwgNTUsIDEzNywgMTAKIH0KIAotCiBPUEVOX0ZJTEUgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNzUsIDEzNAogU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKIENBUFRJT04gIk1hbGZlcm11IGRvc2llcm9uIgpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19Fcy5yYyBiL3Jlc291cmNlcy9zeXNyZXNfRXMucmMKaW5kZXggZDdiMDQ4ZS4uMzg3ZDhiYiAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19Fcy5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX0VzLnJjCkBAIC00MywxOCArNDMsMTggQEAKICAgICAgICAgUFVTSEJVVFRPTiAiJk5vIiwgNywgMzA0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCiBFTkQKIAotU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDUwLCA0NCwgMjIzLCAyNzAKLVNUWUxFIERTX0xPQ0FMRURJVCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDE1LCA0MCwgMjEwLCAxNTIKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQ0FQVElPTiAiQWNlcmNhIGRlICVzIgogRk9OVCAxMCwgIlN5c3RlbSIKIHsKLSBERUZQVVNIQlVUVE9OICJBY2VwdGFyIiwgMSwgOTEsIDI1MCwgNDAsIDE0Ci0gQ09OVFJPTCAiIiwgLTEsICJTVEFUSUMiLCBTU19CTEFDS0ZSQU1FIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfRElTQUJMRUQsIDQsIDM1LCAyMTUsIDIxMAotIExURVhUICJUZXh0IiwgMTAwLCAxMSwgNDAsIDIwMCwgMjAwLCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCi0gSUNPTiAiIiwgMTA4OCwgMTk1LCAxMCwgMTgsIDIwCisgREVGUFVTSEJVVFRPTiAiQWNlcHRhciIsIDEsIDE1MywgMTMwLCA1MCwgMTIKKyBMSVNUQk9YIDk5LCA4LCA2NSwgMTM3LCA4MiwgTEJTX05PVElGWSB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIKKyBJQ09OICIiLCAxMDg4LCAxODksIDEwLCAxNCwgMTYKKyBMVEVYVCAiIiwgMTAwLCA4LCAxMCwgMTM3LCAzMworIExURVhUICJXaW5lIHdhcyBicm91Z2h0IHRvIHlvdSBieToiLCA5OCwgOCwgNTUsIDEzNywgMTAKIH0KIAotCiBPUEVOX0ZJTEUgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNzUsIDEzNAogU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKIENBUFRJT04gIkFicmlyIgpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19GaS5yYyBiL3Jlc291cmNlcy9zeXNyZXNfRmkucmMKaW5kZXggNTlmYTE3MS4uMzY5ODczYyAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19GaS5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX0ZpLnJjCkBAIC00MiwxOCArNDIsMTggQEAKICAgICAgICAgUFVTSEJVVFRPTiAiJkVpIiwgNywgMzA0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCiBFTkQKIAotU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDUwLCA0NCwgMjIzLCAyNzAKLVNUWUxFIERTX0xPQ0FMRURJVCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDE1LCA0MCwgMjEwLCAxNTIKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQ0FQVElPTiAiVGlldG9qYTogJXMiCiBGT05UIDEwLCAiU3lzdGVtIgogewotIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgOTEsIDI1MCwgNDAsIDE0Ci0gQ09OVFJPTCAiIiwgLTEsICJTVEFUSUMiLCBTU19CTEFDS0ZSQU1FIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfRElTQUJMRUQsIDQsIDM1LCAyMTUsIDIxMAotIExURVhUICJUZWtzdGkiLCAxMDAsIDExLCA0MCwgMjAwLCAyMDAsIFNTX05PUFJFRklYIHwgV1NfR1JPVVAKLSBJQ09OICIiLCAxMDg4LCAxOTUsIDEwLCAxOCwgMjAKKyBERUZQVVNIQlVUVE9OICJPSyIsIDEsIDE1MywgMTMwLCA1MCwgMTIKKyBMSVNUQk9YIDk5LCA4LCA2NSwgMTM3LCA4MiwgTEJTX05PVElGWSB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIKKyBJQ09OICIiLCAxMDg4LCAxODksIDEwLCAxNCwgMTYKKyBMVEVYVCAiIiwgMTAwLCA4LCAxMCwgMTM3LCAzMworIExURVhUICJXaW5lIHdhcyBicm91Z2h0IHRvIHlvdSBieToiLCA5OCwgOCwgNTUsIDEzNywgMTAKIH0KIAotCiBPUEVOX0ZJTEUgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNzUsIDEzNAogU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKIENBUFRJT04gIkF2YWEiCmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzX0ZyLnJjIGIvcmVzb3VyY2VzL3N5c3Jlc19Gci5yYwppbmRleCBjNThiYmM5Li40ZmE5NTM1IDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzX0ZyLnJjCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfRnIucmMKQEAgLTQzLDE4ICs0MywxOCBAQAogICAgICAgICBQVVNIQlVUVE9OICImTm9uIiwgNywgMzA0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCiBFTkQKIAotU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDUwLCA0NCwgMjIzLCAyNzAKLVNUWUxFIERTX0xPQ0FMRURJVCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDE1LCA0MCwgMjEwLCAxNTIKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQ0FQVElPTiAiQSBwcm9wb3MgZGUgJXMiCiBGT05UIDEwLCAiU3lzdGVtIgogewotIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgOTEsIDI1MCwgNDAsIDE0Ci0gQ09OVFJPTCAiIiwgLTEsICJTVEFUSUMiLCBTU19CTEFDS0ZSQU1FIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfRElTQUJMRUQsIDQsIDM1LCAyMTUsIDIxMAotIExURVhUICJUZXh0IiwgMTAwLCAxMSwgNDAsIDIwMCwgMjAwLCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCi0gSUNPTiAiIiwgMTA4OCwgMTg1LCAxMCwgMTgsIDIwCisgREVGUFVTSEJVVFRPTiAiT0siLCAxLCAxNTMsIDEzMCwgNTAsIDEyCisgTElTVEJPWCA5OSwgOCwgNjUsIDEzNywgODIsIExCU19OT1RJRlkgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCisgSUNPTiAiIiwgMTA4OCwgMTg5LCAxMCwgMTQsIDE2CisgTFRFWFQgIiIsIDEwMCwgOCwgMTAsIDEzNywgMzMKKyBMVEVYVCAiV2luZSB3YXMgYnJvdWdodCB0byB5b3UgYnk6IiwgOTgsIDgsIDU1LCAxMzcsIDEwCiB9CiAKLQogT1BFTl9GSUxFIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjc1LCAxMzQKIFNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCiBDQVBUSU9OICJPdXZyaXIiCmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzX0h1LnJjIGIvcmVzb3VyY2VzL3N5c3Jlc19IdS5yYwppbmRleCBjNmFlNmMyLi42NmNmMjgxIDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzX0h1LnJjCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfSHUucmMKQEAgLTQyLDE4ICs0MiwxOCBAQAogICAgICAgICBQVVNIQlVUVE9OICImTmVtIiwgNywgMzA0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCiBFTkQKIAotU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDUwLCA0NCwgMjIzLCAyNzAKLVNUWUxFIERTX0xPQ0FMRURJVCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDE1LCA0MCwgMjEwLCAxNTIKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQ0FQVElPTiAiQSAlcy1y9WwiCiBGT05UIDEwLCAiU3lzdGVtIgogewotIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgOTEsIDI1MCwgNDAsIDE0Ci0gQ09OVFJPTCAiIiwgLTEsICJTVEFUSUMiLCBTU19CTEFDS0ZSQU1FIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfRElTQUJMRUQsIDQsIDM1LCAyMTUsIDIxMAotIExURVhUICJUZXh0IiwgMTAwLCAxMSwgNDAsIDIwMCwgMjAwLCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCi0gSUNPTiAiIiwgMTA4OCwgMTk1LCAxMCwgMTgsIDIwCisgREVGUFVTSEJVVFRPTiAiT0siLCAxLCAxNTMsIDEzMCwgNTAsIDEyCisgTElTVEJPWCA5OSwgOCwgNjUsIDEzNywgODIsIExCU19OT1RJRlkgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCisgSUNPTiAiIiwgMTA4OCwgMTg5LCAxMCwgMTQsIDE2CisgTFRFWFQgIiIsIDEwMCwgOCwgMTAsIDEzNywgMzMKKyBMVEVYVCAiV2luZSB3YXMgYnJvdWdodCB0byB5b3UgYnk6IiwgOTgsIDgsIDU1LCAxMzcsIDEwCiB9CiAKLQogT1BFTl9GSUxFIERJQUxPRyAzNiwgMjQsIDI3NSwgMTM0CiBTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQ0FQVElPTiAiTWVnbnlpdOFzIgpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19JdC5yYyBiL3Jlc291cmNlcy9zeXNyZXNfSXQucmMKaW5kZXggZDMyYmI4Yi4uYmQ3ODY3MiAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19JdC5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX0l0LnJjCkBAIC00MiwxNSArNDIsMTYgQEAKICAgICAgICAgUFVTSEJVVFRPTiAiJk5vIiwgNywgMzA0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCiBFTkQKIAotU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDUwLCA0NCwgMjIzLCAyNzAKLVNUWUxFIERTX0xPQ0FMRURJVCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDE1LCA0MCwgMjEwLCAxNTIKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQ0FQVElPTiAiSW5mb3JtYXppb25pIHN1ICVzIgogRk9OVCAxMCwgIlN5c3RlbSIKIHsKLSBERUZQVVNIQlVUVE9OICJPSyIsIDEsIDkxLCAyNTAsIDQwLCAxNAotIENPTlRST0wgIiIsIC0xLCAiU1RBVElDIiwgU1NfQkxBQ0tGUkFNRSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0RJU0FCTEVELCA0LCAzNSwgMjE1LCAyMTAKLSBMVEVYVCAiVGV4dCIsIDEwMCwgMTEsIDQwLCAyMDAsIDIwMCwgU1NfTk9QUkVGSVggfCBXU19HUk9VUAotIElDT04gIiIsIDEwODgsIDE5NSwgMTAsIDE4LCAyMAorIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgMTUzLCAxMzAsIDUwLCAxMgorIExJU1RCT1ggOTksIDgsIDY1LCAxMzcsIDgyLCBMQlNfTk9USUZZIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUgorIElDT04gIiIsIDEwODgsIDE4OSwgMTAsIDE0LCAxNgorIExURVhUICIiLCAxMDAsIDgsIDEwLCAxMzcsIDMzCisgTFRFWFQgIldpbmUgd2FzIGJyb3VnaHQgdG8geW91IGJ5OiIsIDk4LCA4LCA1NSwgMTM3LCAxMAogfQogCiBPUEVOX0ZJTEUgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNzUsIDEzNApkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19Lby5yYyBiL3Jlc291cmNlcy9zeXNyZXNfS28ucmMKaW5kZXggNjQ2YzhjMy4uNzgxMGMxMiAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19Lby5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX0tvLnJjCkBAIC00MiwxOCArNDIsMTggQEAKIAlQVVNIQlVUVE9OICK+xrTPv8AoJk4pIiwgNywgMzA0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCiBFTkQKIAotU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDUwLCA0NCwgMjIzLCAyNzAKLVNUWUxFIERTX0xPQ0FMRURJVCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDE1LCA0MCwgMjEwLCAxNTIKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQ0FQVElPTiAiJXO/oSCw/MfPv6kiCiBGT05UIDEwLCAiU3lzdGVtIgogewotIERFRlBVU0hCVVRUT04gIsiuwM4iLCAxLCA5MSwgMjUwLCA0MCwgMTQKLSBDT05UUk9MICIiLCAtMSwgIlNUQVRJQyIsIFNTX0JMQUNLRlJBTUUgfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19ESVNBQkxFRCwgNCwgMzUsIDIxNSwgMjEwCi0gTFRFWFQgIlRleHQiLCAxMDAsIDExLCA0MCwgMjAwLCAyMDAsIFNTX05PUFJFRklYIHwgV1NfR1JPVVAKLSBJQ09OICIiLCAxMDg4LCAxOTUsIDEwLCAxOCwgMjAKKyBERUZQVVNIQlVUVE9OICLIrsDOIiwgMSwgMTUzLCAxMzAsIDUwLCAxMgorIExJU1RCT1ggOTksIDgsIDY1LCAxMzcsIDgyLCBMQlNfTk9USUZZIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUgorIElDT04gIiIsIDEwODgsIDE4OSwgMTAsIDE0LCAxNgorIExURVhUICIiLCAxMDAsIDgsIDEwLCAxMzcsIDMzCisgTFRFWFQgIldpbmUgd2FzIGJyb3VnaHQgdG8geW91IGJ5OiIsIDk4LCA4LCA1NSwgMTM3LCAxMAogfQogCi0KIE9QRU5fRklMRSBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI3NSwgMTM0CiBTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQ0FQVElPTiAiv62x4iIKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfTm8ucmMgYi9yZXNvdXJjZXMvc3lzcmVzX05vLnJjCmluZGV4IGVlZDdkZmUuLjU4NTBiZjEgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfTm8ucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19Oby5yYwpAQCAtNDIsMTggKzQyLDE4IEBACiAgICAgICAgIFBVU0hCVVRUT04gIiZOZWkiLCA3LCAzMDQsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKIEVORAogCi1TSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgNTAsIDQ0LCAyMjMsIDI3MAotU1RZTEUgRFNfTE9DQUxFRElUIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitTSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMTUsIDQwLCAyMTAsIDE1MgorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCiBDQVBUSU9OICJPbSAlcyIKIEZPTlQgMTAsICJTeXN0ZW0iCiB7Ci0gREVGUFVTSEJVVFRPTiAiT0siLCAxLCA5MSwgMjUwLCA0MCwgMTQKLSBDT05UUk9MICIiLCAtMSwgIlNUQVRJQyIsIFNTX0JMQUNLRlJBTUUgfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19ESVNBQkxFRCwgNCwgMzUsIDIxNSwgMjEwCi0gTFRFWFQgIlRla3N0IiwgMTAwLCAxMSwgNDAsIDIwMCwgMjAwLCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCi0gSUNPTiAiIiwgMTA4OCwgMTk1LCAxMCwgMTgsIDIwCisgREVGUFVTSEJVVFRPTiAiT0siLCAxLCAxNTMsIDEzMCwgNTAsIDEyCisgTElTVEJPWCA5OSwgOCwgNjUsIDEzNywgODIsIExCU19OT1RJRlkgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCisgSUNPTiAiIiwgMTA4OCwgMTg5LCAxMCwgMTQsIDE2CisgTFRFWFQgIiIsIDEwMCwgOCwgMTAsIDEzNywgMzMKKyBMVEVYVCAiV2luZSB3YXMgYnJvdWdodCB0byB5b3UgYnk6IiwgOTgsIDgsIDU1LCAxMzcsIDEwCiB9CiAKLQogT1BFTl9GSUxFIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjc1LCAxMzQKIFNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCiBDQVBUSU9OICLFcG5lIgpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19QbC5yYyBiL3Jlc291cmNlcy9zeXNyZXNfUGwucmMKaW5kZXggMWU4MjFmOC4uODAyNjBiYyAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19QbC5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX1BsLnJjCkBAIC00MSwxNiArNDEsMTkgQEAKIAlQVVNIQlVUVE9OICImVGFrIiwgNiwgMjYzLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCiAJUFVTSEJVVFRPTiAiJk5pZSIsIDcsIDMxMSwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogRU5ECi1TSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIDUwLCA0NCwgMjIzLCAyNzAKLVNUWUxFIERTX0xPQ0FMRURJVCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorCitTSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMTUsIDQwLCAyMTAsIDE1MgorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCiBDQVBUSU9OICJPICVzIgogRk9OVCAxMCwgIlN5c3RlbSIKIHsKLQlERUZQVVNIQlVUVE9OICJPSyIsIDEsIDkxLCAyNTAsIDQwLCAxNAotCUNPTlRST0wgIiIsIC0xLCAiU1RBVElDIiwgU1NfQkxBQ0tGUkFNRSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0RJU0FCTEVELCA0LCAzNSwgMjE1LCAyMTAKLQlDT05UUk9MICJUZXh0IiwgMTAwLCAiU1RBVElDIiwgU1NfTk9QUkVGSVggfCBXU19HUk9VUCwgMTEsIDQwLCAyMDAsIDIwMAotCUlDT04gIiIsIDEwODgsIDE5NSwgMTAsIDE4LCAyMAorIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgMTUzLCAxMzAsIDUwLCAxMgorIExJU1RCT1ggOTksIDgsIDY1LCAxMzcsIDgyLCBMQlNfTk9USUZZIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUgorIElDT04gIiIsIDEwODgsIDE4OSwgMTAsIDE0LCAxNgorIExURVhUICIiLCAxMDAsIDgsIDEwLCAxMzcsIDMzCisgTFRFWFQgIldpbmUgd2FzIGJyb3VnaHQgdG8geW91IGJ5OiIsIDk4LCA4LCA1NSwgMTM3LCAxMAogfQorCiAvKiBMVEVYVCAiV3lzd2lldGwgcGxpa2kgJnR5cHU6IiwgMTA4OSwgNiwgMTA0LCA5MCwgOSAqLwogT1BFTl9GSUxFIERJQUxPRyAzNiwgMjQsIDI3OSwgMTM0CiBTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19Qby5yYyBiL3Jlc291cmNlcy9zeXNyZXNfUG8ucmMKaW5kZXggMGZjYTI1MS4uMjAwYjhkMiAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19Qby5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX1BvLnJjCkBAIC00MiwxOCArNDIsMTggQEAKICAgICAgICAgUFVTSEJVVFRPTiAiJk7jbyIsIDcsIDMwNCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogRU5ECiAKLVNIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA1MCwgNDQsIDIyMywgMjcwCi1TVFlMRSBEU19MT0NBTEVESVQgfCBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK1NIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAxNSwgNDAsIDIxMCwgMTUyCitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKIENBUFRJT04gIlNvYnJlICVzIgotRk9OVCAxMCwgIlNpc3RlbWEiCitGT05UIDEwLCAiU3lzdGVtIgogewotIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgOTEsIDI1MCwgNDAsIDE0Ci0gQ09OVFJPTCAiIiwgLTEsICJTVEFUSUMiLCBTU19CTEFDS0ZSQU1FIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfRElTQUJMRUQsIDQsIDM1LCAyMTUsIDIxMAotIExURVhUICJUZXh0IiwgMTAwLCAxMSwgNDAsIDIwMCwgMjAwLCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCi0gSUNPTiAiIiwgMTA4OCwgMTk1LCAxMCwgMTgsIDIwCisgREVGUFVTSEJVVFRPTiAiT0siLCAxLCAxNTMsIDEzMCwgNTAsIDEyCisgTElTVEJPWCA5OSwgOCwgNjUsIDEzNywgODIsIExCU19OT1RJRlkgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCisgSUNPTiAiIiwgMTA4OCwgMTg5LCAxMCwgMTQsIDE2CisgTFRFWFQgIiIsIDEwMCwgOCwgMTAsIDEzNywgMzMKKyBMVEVYVCAiV2luZSB3YXMgYnJvdWdodCB0byB5b3UgYnk6IiwgOTgsIDgsIDU1LCAxMzcsIDEwCiB9CiAKLQogT1BFTl9GSUxFIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjc1LCAxMzQKIFNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCiBDQVBUSU9OICJBYnJpciIKZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9NYWtlZmlsZS5pbiBiL3NjaGVkdWxlci9NYWtlZmlsZS5pbgppbmRleCBmNjMyN2IxLi43NWZmMDgwIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvTWFrZWZpbGUuaW4KKysrIGIvc2NoZWR1bGVyL01ha2VmaWxlLmluCkBAIC0xLDQgKzEsNCBAQAotREVGUyAgICAgID0gLURfX1dJTkVfXworREVGUyAgICAgID0gQERMTEZMQUdTQCAtRF9fV0lORV9fCiBUT1BTUkNESVIgPSBAdG9wX3NyY2RpckAKIFRPUE9CSkRJUiA9IC4uCiBTUkNESVIgICAgPSBAc3JjZGlyQApkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3RocmVhZC5jIGIvc2NoZWR1bGVyL3RocmVhZC5jCmluZGV4IDkxMTMxYjUuLjk3NDAwODYgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci90aHJlYWQuYworKysgYi9zY2hlZHVsZXIvdGhyZWFkLmMKQEAgLTU4LDYgKzU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIExQVEhSRUFEX1NUQVJUX1JPVVRJTkUgc3RhcnRfYWRkciApCiB7CiAgICAgRFdPUkQgb2xkX3Byb3Q7CisgICAgV09SRCBjcywgZHM7CiAgICAgVEhEQiAqdGhkYiA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKFRIREIpICk7CiAgICAgaWYgKCF0aGRiKSByZXR1cm4gTlVMTDsKICAgICB0aGRiLT5oZWFkZXIudHlwZSAgICAgPSBLMzJPQkpfVEhSRUFEOwpAQCAtOTIsMTMgKzkzLDE1IEBACiAKICAgICAvKiBJbml0aWFsaXplIHRoZSB0aHJlYWQgY29udGV4dCAqLwogCisgICAgR0VUX0NTKGNzKTsKKyAgICBHRVRfRFMoZHMpOwogICAgIHRoZGItPnBjb250ZXh0ICAgICAgICA9ICZ0aGRiLT5jb250ZXh0OwotICAgIHRoZGItPmNvbnRleHQuU2VnQ3MgICA9IFdJTkVfQ09ERV9TRUxFQ1RPUjsKLSAgICB0aGRiLT5jb250ZXh0LlNlZ0RzICAgPSBXSU5FX0RBVEFfU0VMRUNUT1I7Ci0gICAgdGhkYi0+Y29udGV4dC5TZWdFcyAgID0gV0lORV9EQVRBX1NFTEVDVE9SOworICAgIHRoZGItPmNvbnRleHQuU2VnQ3MgICA9IGNzOworICAgIHRoZGItPmNvbnRleHQuU2VnRHMgICA9IGRzOworICAgIHRoZGItPmNvbnRleHQuU2VnRXMgICA9IGRzOworICAgIHRoZGItPmNvbnRleHQuU2VnR3MgICA9IGRzOworICAgIHRoZGItPmNvbnRleHQuU2VnU3MgICA9IGRzOwogICAgIHRoZGItPmNvbnRleHQuU2VnRnMgICA9IHRoZGItPnRlYl9zZWw7Ci0gICAgdGhkYi0+Y29udGV4dC5TZWdHcyAgID0gV0lORV9EQVRBX1NFTEVDVE9SOwotICAgIHRoZGItPmNvbnRleHQuU2VnU3MgICA9IFdJTkVfREFUQV9TRUxFQ1RPUjsKICAgICB0aGRiLT5jb250ZXh0LkVpcCAgICAgPSAoRFdPUkQpc3RhcnRfYWRkcjsKICAgICB0aGRiLT5jb250ZXh0LkVzcCAgICAgPSAoRFdPUkQpdGhkYi0+dGViLnN0YWNrX3RvcDsKIApAQCAtMTM1LDggKzEzOCwxMiBAQAogICAgIHsKICAgICAgICAgLyogQ2hlY2sgaWYgd2UgYXJlIGRlbGV0aW5nIHRoZSBjdXJyZW50IHRocmVhZCAqLwogICAgICAgICBXT1JEIGZzOwotICAgICAgICBfX2FzbV9fKCJtb3Z3ICUlZnMsJXcwIjoiPXIiIChmcykpOwotICAgICAgICBpZiAoZnMgPT0gdGhkYi0+dGViX3NlbCkgX19hc21fXyBfX3ZvbGF0aWxlX18oInB1c2h3ICVkc1xuXHRwb3B3ICVmcyIpOworICAgICAgICBHRVRfRlMoIGZzICk7CisgICAgICAgIGlmIChmcyA9PSB0aGRiLT50ZWJfc2VsKQorICAgICAgICB7CisgICAgICAgICAgICBHRVRfRFMoIGZzICk7CisgICAgICAgICAgICBTRVRfRlMoIGZzICk7CisgICAgICAgIH0KICAgICB9CiAjZW5kaWYKICAgICBTRUxFQ1RPUl9GcmVlQmxvY2soIHRoZGItPnRlYl9zZWwsIDEgKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkLmMgYi90b29scy9idWlsZC5jCmluZGV4IDI1M2JiNDUuLjk1MmJiOWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2J1aWxkLmMKKysrIGIvdG9vbHMvYnVpbGQuYwpAQCAtMTM3LDExICsxMzcsMTIgQEAKIHN0YXRpYyBTUEVDX1RZUEUgU3BlY1R5cGUgPSBTUEVDX0lOVkFMSUQ7CiBzdGF0aWMgY2hhciBETExOYW1lWzgwXTsKIHN0YXRpYyBjaGFyIERMTEZpbGVOYW1lWzgwXTsKLWludCBMaW1pdCA9IDA7Ci1pbnQgQmFzZSA9IE1BWF9PUkRJTkFMUzsKLWludCBETExIZWFwU2l6ZSA9IDA7Ci1jaGFyICpTcGVjTmFtZTsKLUZJTEUgKlNwZWNGcDsKK3N0YXRpYyBpbnQgTGltaXQgPSAwOworc3RhdGljIGludCBCYXNlID0gTUFYX09SRElOQUxTOworc3RhdGljIGludCBETExIZWFwU2l6ZSA9IDA7CitzdGF0aWMgY2hhciAqU3BlY05hbWU7CitzdGF0aWMgRklMRSAqU3BlY0ZwOworc3RhdGljIFdPUkQgQ29kZV9TZWxlY3RvciwgRGF0YV9TZWxlY3RvcjsKIAogY2hhciAqUGFyc2VCdWZmZXIgPSBOVUxMOwogY2hhciAqUGFyc2VOZXh0OwpAQCAtMTA4NCw3ICsxMDg1LDcgQEAKICAgICAgICAgICAgICAgICBpZiAob2RwLT51LmZ1bmMuYXJnX3R5cGVzW2pdID09ICd0JykgbWFzayB8PSAxPDwgKGoqMik7CiAgICAgICAgICAgICAgICAgaWYgKG9kcC0+dS5mdW5jLmFyZ190eXBlc1tqXSA9PSAnVycpIG1hc2sgfD0gMjw8IChqKjIpOwogCSAgICB9Ci0JZnByaW50Ziggb3V0ZmlsZSwgIlx0LmxvbmcgJWxkXG4iLG1hc2spOworCWZwcmludGYoIG91dGZpbGUsICJcdC5sb25nICVkXG4iLG1hc2spOwogICAgIH0KIAogICAgIC8qIE91dHB1dCB0aGUgRExMIG9yZGluYWxzIHRhYmxlICovCkBAIC0xMjMzLDEwICsxMjM0LDggQEAKICAgICAgICAgICAgICAgICAgICAgIChvZHAtPnR5cGUgPT0gVFlQRV9SRUdJU1RFUikgPyAicmVncyIgOgogICAgICAgICAgICAgICAgICAgICAgKG9kcC0+dHlwZSA9PSBUWVBFX1BBU0NBTCkgPyAibG9uZyIgOiAid29yZCIsCiAgICAgICAgICAgICAgICAgICAgICBvZHAtPnUuZnVuYy5hcmdfdHlwZXMgKTsKLSAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsIlx0LmJ5dGUgMHglMDJ4LDB4JTAyeFxuIiwgLyogU29tZSBhc21zIGRvbid0IGhhdmUgLndvcmQgKi8KLSAgICAgICAgICAgICAgICAgICAgIExPQllURShXSU5FX0NPREVfU0VMRUNUT1IpLCBISUJZVEUoV0lORV9DT0RFX1NFTEVDVE9SKSApOwotICAgICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bm9wXG4iICk7Ci0gICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRub3BcblxuIiApOworICAgICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmxvbmcgMHglMDhseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKCBDb2RlX1NlbGVjdG9yLCAweDkwOTAgLyogbm9wIDsgbm9wICovICkgKTsKICAgICAgICAgICAgIG9kcC0+b2Zmc2V0ID0gY29kZV9vZmZzZXQ7CiAgICAgICAgICAgICBjb2RlX29mZnNldCArPSAxNjsgIC8qIEFzc2VtYmx5IGNvZGUgaXMgMTYgYnl0ZXMgbG9uZyAqLwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xNTcxLDggKzE1NzAsNyBAQAogCiAgICAgLyogUmVzdG9yZSAzMi1iaXQgZHMgYW5kIGVzICovCiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAkMHglMDR4JTA0eFxuIiwKLSAgICAgICAgICAgICBXSU5FX0RBVEFfU0VMRUNUT1IsIFdJTkVfREFUQV9TRUxFQ1RPUiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICQweCUwNHglMDR4XG4iLCBEYXRhX1NlbGVjdG9yLCBEYXRhX1NlbGVjdG9yICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wdyAlJWRzXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wdyAlJWVzXG4iICk7CiAKQEAgLTE5NjYsMTAgKzE5NjQsMTAgQEAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlYXgsJSVkeFxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlZHgsJSVlYXhcbiIgKTsKIAotICAgIC8qIFJlc3RvcmUgMzItYml0IHNlZ21lbnQgcmVnaXN0ZXJzIGFuZCBzdGFjayovCisgICAgLyogUmVzdG9yZSAzMi1iaXQgc2VnbWVudCByZWdpc3RlcnMgKi8KIAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlY3hcbiIgKTsgIC8qIEdldCB0aGUgc2F2ZWQgJSVlc3AgKi8KLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICQweCUwNHgsJSVieFxuIiwgV0lORV9EQVRBX1NFTEVDVE9SICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAkMHglMDR4LCUlYnhcbiIsIERhdGFfU2VsZWN0b3IgKTsKICNpZmRlZiBfX3N2cjRfXwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdGRhdGExNlxuIik7CiAjZW5kaWYKQEAgLTI0MjIsNiArMjQyMCwxMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyogUmV0cmlldmUgdGhlIHNlbGVjdG9yIHZhbHVlczsgdGhpcyBhc3N1bWVzIHRoYXQgd2UgYXJlIGJ1aWxkaW5nCisgICAgICogdGhlIGFzbSBmaWxlcyBvbiB0aGUgcGxhdGZvcm0gdGhhdCB3aWxsIGFsc28gcnVuIHRoZW0uIFByb2JhYmx5CisgICAgICogYSBzYWZlIGFzc3VtcHRpb24gdG8gbWFrZS4KKyAgICAgKi8KKyAgICBHRVRfQ1MoIENvZGVfU2VsZWN0b3IgKTsKKyAgICBHRVRfRFMoIERhdGFfU2VsZWN0b3IgKTsKKwogICAgIGlmICghc3RyY21wKCBhcmd2WzFdLCAiLXNwZWMiICkpCiAgICAgICAgIHJlcyA9IEJ1aWxkU3BlYyggb3V0ZmlsZSwgYXJnYywgYXJndiApOwogICAgIGVsc2UgaWYgKCFzdHJjbXAoIGFyZ3ZbMV0sICItY2FsbGZyb20xNiIgKSkKZGlmZiAtLWdpdCBhL3Rvb2xzL2V4YW1pbmUtcmVsYXkgYi90b29scy9leGFtaW5lLXJlbGF5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYwMzBmMDgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9leGFtaW5lLXJlbGF5CkBAIC0wLDAgKzEsNjEgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitteSAkc3JjZmlsZSA9ICRBUkdWWzBdOworbXkgQGNhbGxzdGFjayA9ICgpOworCitvcGVuIChJTiwgIjwkc3JjZmlsZSIpIHx8IGRpZSAiQ2Fubm90IG9wZW4gJHNyY2ZpbGUgZm9yIHJlYWRpbmc6ICQhXG4iOworTElORToKK3doaWxlICg8SU4+KSB7CisgICAgaWYgKC9eQ2FsbCAoW0EtWmEtejAtOV0rXC5bMC05XSspOiAuKlwpLykgeworCW15ICRmdW5jID0gJDE7CisJaWYgKC8gcmV0PSguLi4uLi4uLikkLyB8fAorCSAgICAvIHJldD0oLi4uLjouLi4uKSBkcz0uLi4uJC8pIHsKKwkgICAgbXkgJHJldGFkZHIgPSAkMTsKKwkgICAgcHVzaCBAY2FsbHN0YWNrLCBbJGZ1bmMsJHJldGFkZHJdOworCSAgICBuZXh0OworCX0gZWxzZSB7CisJICAgICMgQXNzdW1lIGEgbGluZSBnb3QgY3V0IGJ5IGEgbGluZSBmZWVkIGluIGEgc3RyaW5nLgorCSAgICAkXyAuPSBzY2FsYXIgKDxJTj4pOworCSAgICBwcmludCAiWyRfXSI7CisJICAgIHJlZG87CisJfQorICAgIH0KKworCisgICAgaWYgKC9eUmV0ICAoW0EtWmEtejAtOV0rXC5bMC05XSspOiAuKiByZXQ9KC4uLi4uLi4uKSQvIHx8CisJL15SZXQgIChbQS1aYS16MC05XStcLlswLTldKyk6IC4qIHJldD0oLi4uLjouLi4uKSBkcz0uLi4uJC8pIHsKKwlteSAkZnVuYyA9ICQxOworCW15ICRyZXRhZGRyID0gJDI7CisJbXkgKCR0b3BmdW5jLCR0b3BhZGRyKTsKKworICAgICAgUE9QOgorCXdoaWxlICgxKSB7CisJICAgIGlmICgkI2NhbGxzdGFjayA9PSAtMSkgeworCQlwcmludCAiRXJyb3I6IFJldHVybiBmcm9tICRmdW5jIHRvICRyZXRhZGRyIHdpdGggZW1wdHkgc3RhY2suXG4iOworCQluZXh0IExJTkU7CisJICAgIH0KKworCSAgICAoJHRvcGZ1bmMsJHRvcGFkZHIpID0gQHtwb3AgQGNhbGxzdGFja307CisKKwkgICAgaWYgKCR0b3BmdW5jIG5lICRmdW5jKSB7CisJCXByaW50ICJFcnJvcjogUmV0dXJuIGZyb20gJHRvcGZ1bmMsIGJ1dCBjYWxsIGZyb20gJGZ1bmMuXG4iOworCQluZXh0IFBPUCAKKwkgICAgfQorCSAgICBsYXN0IFBPUDsKKwl9CisKKwlpZiAoJHRvcGFkZHIgZXEgJHJldGFkZHIpIHsKKwkgICAgcHJpbnQgIk9LOiAkZnVuYyBmcm9tICRyZXRhZGRyLlxuIjsKKwl9IGVsc2UgeworCSAgICBwcmludCAiRXJyb3I6IFJldHVybiBmcm9tICRmdW5jIGlzIHRvICRyZXRhZGRyLCBub3QgJHRvcGFkZHIuXG4iOworCX0gICAgCisgICAgfQorfQorCit3aGlsZSAoJCNjYWxsc3RhY2sgIT0gLTEpIHsKKyAgICBteSAoJHRvcGZ1bmMsJHRvcGFkZHIpID0gQHtwb3AgQGNhbGxzdGFja307CisgICAgcHJpbnQgIkVycm9yOiBsZWZ0b3ZlciBjYWxsIHRvICR0b3BmdW5jIGZyb20gJHRvcGFkZHIuXG4iOworfQorCitjbG9zZSAoSU4pOwpkaWZmIC0tZ2l0IGEvd2luMzIvTWFrZWZpbGUuaW4gYi93aW4zMi9NYWtlZmlsZS5pbgppbmRleCBiODMyMjNjLi5mYjU5NGE4IDEwMDY0NAotLS0gYS93aW4zMi9NYWtlZmlsZS5pbgorKysgYi93aW4zMi9NYWtlZmlsZS5pbgpAQCAtMSw0ICsxLDQgQEAKLURFRlMgICAgICA9IC1EX19XSU5FX18KK0RFRlMgICAgICA9IEBETExGTEFHU0AgLURfX1dJTkVfXwogVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACiBUT1BPQkpESVIgPSAuLgogU1JDRElSICAgID0gQHNyY2RpckAKZGlmZiAtLWdpdCBhL3dpbjMyL2NvZGVfcGFnZS5jIGIvd2luMzIvY29kZV9wYWdlLmMKaW5kZXggODJjYWY3Mi4uZWQ2ZWE4MjIgMTAwNjQ0Ci0tLSBhL3dpbjMyL2NvZGVfcGFnZS5jCisrKyBiL3dpbjMyL2NvZGVfcGFnZS5jCkBAIC05MCwxMSArOTAsMTEgQEAKIHsKICAgICBpZiAoc3JjbGVuID09IC0xKQogICAgCSBzcmNsZW4gPSBsc3RybGVuMzJBKHNyYykrMTsKLSAgICBpZiAoIWRzdCkKLSAgICAgICAgIHJldHVybiBzcmNsZW4qMjsKKyAgICBpZiAoIWRzdGxlbiB8fCAhZHN0KQorICAgICAgICAgcmV0dXJuIHNyY2xlbjsKIAogICAgIGxzdHJjcHluQXRvVyhkc3Qsc3JjLHNyY2xlbik7IC8qIEZJWE1FICovCi0gICAgcmV0dXJuIHNyY2xlbioyLTI7CisgICAgcmV0dXJuIHNyY2xlbi0xOwogfQogCiBpbnQgV0lOQVBJIFdpZGVDaGFyVG9NdWx0aUJ5dGUoVUlOVDMyIHBhZ2UsIERXT1JEIGZsYWdzLCBXQ0hBUiAqc3JjLCBpbnQgc3JjbGVuLApkaWZmIC0tZ2l0IGEvd2luZG93cy9NYWtlZmlsZS5pbiBiL3dpbmRvd3MvTWFrZWZpbGUuaW4KaW5kZXggNzBjYmVjMi4uYzE4YTQ3MCAxMDA2NDQKLS0tIGEvd2luZG93cy9NYWtlZmlsZS5pbgorKysgYi93aW5kb3dzL01ha2VmaWxlLmluCkBAIC0xLDQgKzEsNCBAQAotREVGUyAgICAgID0gLURfX1dJTkVfXworREVGUyAgICAgID0gQERMTEZMQUdTQCAtRF9fV0lORV9fCiBUT1BTUkNESVIgPSBAdG9wX3NyY2RpckAKIFRPUE9CSkRJUiA9IC4uCiBTUkNESVIgICAgPSBAc3JjZGlyQApkaWZmIC0tZ2l0IGEvd2luZG93cy9jbGlwYm9hcmQuYyBiL3dpbmRvd3MvY2xpcGJvYXJkLmMKaW5kZXggZDUxZGJkNC4uN2EyNjJiZCAxMDA2NDQKLS0tIGEvd2luZG93cy9jbGlwYm9hcmQuYworKysgYi93aW5kb3dzL2NsaXBib2FyZC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICdXaW5lJyBDbGlwYm9hcmQgZnVuY3Rpb24gaGFuZGxpbmcKKyAqIFdJTkUgY2xpcGJvYXJkIGZ1bmN0aW9uIGhhbmRsaW5nCiAgKgogICogQ29weXJpZ2h0IDE5OTQgTWFydGluIEF5b3R0ZQogICoJICAgICAxOTk2IEFsZXggS29yb2JrYQpAQCAtNDEsMTEgKzQxLDEzIEBACiAgKgkJCWludGVybmFsIHZhcmlhYmxlcwogICovCiAKK3N0YXRpYyBIUVVFVUUxNiBocUNsaXBMb2NrICAgPSAwOworc3RhdGljIEJPT0wzMiBiQ0JIYXNDaGFuZ2VkICA9IEZBTFNFOworCiBzdGF0aWMgSFdORDMyIGhXbmRDbGlwT3duZXIgID0gMDsgICAvKiBjdXJyZW50IGNsaXBib2FyZCBvd25lciAqLwogc3RhdGljIEhXTkQzMiBoV25kQ2xpcFdpbmRvdyA9IDA7ICAgLyogd2luZG93IHRoYXQgb3BlbmVkIGNsaXBib2FyZCAqLwogc3RhdGljIEhXTkQzMiBoV25kVmlld2VyICAgICA9IDA7ICAgLyogc3RhcnQgb2Ygdmlld2VycyBjaGFpbiAqLwogCi1zdGF0aWMgQk9PTDMyIGJDbGlwQ2hhbmdlZCAgPSBGQUxTRTsKIHN0YXRpYyBXT1JEIExhc3RSZWdGb3JtYXQgPSBDRl9SRUdGT1JNQVRCQVNFOwogCiBzdGF0aWMgQm9vbCAgIHNlbGVjdGlvbldhaXQgPSBGYWxzZTsKQEAgLTcyLDcwICs3NCwxMDQgQEAKICAgICB7IENGX0RTUEJJVE1BUCwgMSwgMCwgIkRTUEJpdG1hcCIsIChIQU5ETEUxNilOVUxMLCAwLCAmQ2xpcEZvcm1hdHNbMTRdLCBOVUxMIH0KICAgICB9OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgIENMSVBCT0FSRF9DaGVja1NlbGVjdGlvbgotICovCi1zdGF0aWMgdm9pZCBDTElQQk9BUkRfQ2hlY2tTZWxlY3Rpb24oV05EKiBwV25kKQorc3RhdGljIExQQ0xJUEZPUk1BVCBfX2xvb2t1cF9mb3JtYXQoIExQQ0xJUEZPUk1BVCBscEZvcm1hdCwgV09SRCB3SUQgKQogewotICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlx0Y2hlY2tpbmcgJTA4eFxuIiwgKHVuc2lnbmVkKXBXbmQtPndpbmRvdyk7Ci0KLSAgaWYoIHNlbGVjdGlvbkFjcXVpcmVkICYmIHNlbGVjdGlvbldpbmRvdyAhPSBOb25lICYmCi0gICAgICBwV25kLT53aW5kb3cgPT0gc2VsZWN0aW9uV2luZG93ICkKLSAgewotICAgIHNlbGVjdGlvblByZXZXaW5kb3cgPSBzZWxlY3Rpb25XaW5kb3c7Ci0gICAgc2VsZWN0aW9uV2luZG93ID0gTm9uZTsKLQotICAgIGlmKCBwV25kLT5uZXh0ICkgCi0gICAgICAgICBzZWxlY3Rpb25XaW5kb3cgPSBwV25kLT5uZXh0LT53aW5kb3c7Ci0gICAgZWxzZSBpZiggcFduZC0+cGFyZW50ICkKLSAgICAgICAgICAgICBpZiggcFduZC0+cGFyZW50LT5jaGlsZCAhPSBwV25kICkgCi0gICAgICAgICAgICAgICAgIHNlbGVjdGlvbldpbmRvdyA9IHBXbmQtPnBhcmVudC0+Y2hpbGQtPndpbmRvdzsKLQotICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiXHRzd2l0Y2hpbmcgc2VsZWN0aW9uIGZyb20gJTA4eCB0byAlMDh4XG4iLCAKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXNlbGVjdGlvblByZXZXaW5kb3csICh1bnNpZ25lZClzZWxlY3Rpb25XaW5kb3cpOwotCi0gICAgaWYoIHNlbGVjdGlvbldpbmRvdyAhPSBOb25lICkKKyAgICB3aGlsZShUUlVFKQogICAgIHsKLSAgICAgICAgWFNldFNlbGVjdGlvbk93bmVyKGRpc3BsYXksIFhBX1BSSU1BUlksIHNlbGVjdGlvbldpbmRvdywgQ3VycmVudFRpbWUpOwotICAgICAgICBpZiggWEdldFNlbGVjdGlvbk93bmVyKGRpc3BsYXksIFhBX1BSSU1BUlkpICE9IHNlbGVjdGlvbldpbmRvdyApCi0gICAgICAgICAgICBzZWxlY3Rpb25XaW5kb3cgPSBOb25lOworCWlmIChscEZvcm1hdCA9PSBOVUxMIHx8CisJICAgIGxwRm9ybWF0LT53Rm9ybWF0SUQgPT0gd0lEKSBicmVhazsKKwlscEZvcm1hdCA9IGxwRm9ybWF0LT5OZXh0Rm9ybWF0OwogICAgIH0KLSAgfQorICAgIHJldHVybiBscEZvcm1hdDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUNMSVBCT0FSRF9EaXNPd24KKyAqICAgICAgICAgICAgICAgICAgICAgIENMSVBCT0FSRF9DaGVja1NlbGVjdGlvbgorICoKKyAqIFByZXZlbnQgWCBzZWxlY3Rpb24gZnJvbSBiZWluZyBsb3N0IHdoZW4gYSB0b3AgbGV2ZWwgd2luZG93IGlzCisgKiBkZXN0cm95ZWQuCisgKi8KK3N0YXRpYyB2b2lkIENMSVBCT0FSRF9DaGVja1NlbGVjdGlvbihXTkQqIHBXbmQpCit7CisgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdGNoZWNraW5nICUwOHhcbiIsICh1bnNpZ25lZClwV25kLT53aW5kb3cpOworCisgICAgaWYoIHNlbGVjdGlvbkFjcXVpcmVkICYmIHNlbGVjdGlvbldpbmRvdyAhPSBOb25lICYmCisgICAgICAgIHBXbmQtPndpbmRvdyA9PSBzZWxlY3Rpb25XaW5kb3cgKQorICAgIHsKKwlzZWxlY3Rpb25QcmV2V2luZG93ID0gc2VsZWN0aW9uV2luZG93OworCXNlbGVjdGlvbldpbmRvdyA9IE5vbmU7CisKKwlpZiggcFduZC0+bmV4dCApIAorCSAgICBzZWxlY3Rpb25XaW5kb3cgPSBwV25kLT5uZXh0LT53aW5kb3c7CisJZWxzZSBpZiggcFduZC0+cGFyZW50ICkKKyAgICAgICAgICAgICBpZiggcFduZC0+cGFyZW50LT5jaGlsZCAhPSBwV25kICkgCisgICAgICAgICAgICAgICAgIHNlbGVjdGlvbldpbmRvdyA9IHBXbmQtPnBhcmVudC0+Y2hpbGQtPndpbmRvdzsKKworCWRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiXHRzd2l0Y2hpbmcgc2VsZWN0aW9uIGZyb20gJTA4eCB0byAlMDh4XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXNlbGVjdGlvblByZXZXaW5kb3csICh1bnNpZ25lZClzZWxlY3Rpb25XaW5kb3cpOworCisJaWYoIHNlbGVjdGlvbldpbmRvdyAhPSBOb25lICkKKwl7CisJICAgIFhTZXRTZWxlY3Rpb25Pd25lcihkaXNwbGF5LCBYQV9QUklNQVJZLCBzZWxlY3Rpb25XaW5kb3csIEN1cnJlbnRUaW1lKTsKKwkgICAgaWYoIFhHZXRTZWxlY3Rpb25Pd25lcihkaXNwbGF5LCBYQV9QUklNQVJZKSAhPSBzZWxlY3Rpb25XaW5kb3cgKQorCQlzZWxlY3Rpb25XaW5kb3cgPSBOb25lOworCX0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgQ0xJUEJPQVJEX1Jlc2V0TG9jaworICovCit2b2lkIENMSVBCT0FSRF9SZXNldExvY2soIEhRVUVVRTE2IGhxQ3VycmVudCwgSFFVRVVFMTYgaHFOZXcgKQoreworICAgIGlmKCBocUNsaXBMb2NrID09IGhxQ3VycmVudCApCisgICAgeworCWlmKCBocU5ldyApCisJICAgIGhxQ2xpcExvY2sgPSBocU5ldzsKKwllbHNlCisJeworIAkgICAgaFduZENsaXBPd25lciA9IDA7CisJICAgIGhXbmRDbGlwV2luZG93ID0gMDsKKwkgICAgRW1wdHlDbGlwYm9hcmQzMigpOworCSAgICBocUNsaXBMb2NrID0gMDsKKwl9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJQ0xJUEJPQVJEX1Jlc2V0T3duZXIKICAqCiAgKiBDYWxsZWQgZnJvbSBEZXN0cm95V2luZG93KCkuCiAgKi8KLXZvaWQgQ0xJUEJPQVJEX0Rpc093bihXTkQqIHBXbmQpCit2b2lkIENMSVBCT0FSRF9SZXNldE93bmVyKFdORCogcFduZCkKIHsKLSAgTFBDTElQRk9STUFUIGxwRm9ybWF0ID0gQ2xpcEZvcm1hdHM7CisgICAgTFBDTElQRk9STUFUIGxwRm9ybWF0ID0gQ2xpcEZvcm1hdHM7CiAKLSAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJEaXNPd246IGNsaXBib2FyZCBvd25lciA9ICUwNHgsIHNlbGVjdGlvbiA9ICUwOHhcbiIsIAorICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiRGlzT3duOiBjbGlwYm9hcmQgb3duZXIgPSAlMDR4LCBzZWxlY3Rpb24gPSAlMDh4XG4iLCAKIAkJCQloV25kQ2xpcE93bmVyLCAodW5zaWduZWQpc2VsZWN0aW9uV2luZG93KTsKIAotICBpZiggcFduZC0+aHduZFNlbGYgPT0gaFduZENsaXBPd25lcikKLSAgewotICAgICAgU2VuZE1lc3NhZ2UxNihoV25kQ2xpcE93bmVyLFdNX1JFTkRFUkFMTEZPUk1BVFMsMCwwTCk7CisgICAgaWYoIHBXbmQtPmh3bmRTZWxmID09IGhXbmRDbGlwT3duZXIpCisgICAgeworCVNlbmRNZXNzYWdlMTYoaFduZENsaXBPd25lcixXTV9SRU5ERVJBTExGT1JNQVRTLDAsMEwpOwogCi0gICAgICAvKiBjaGVjayBpZiBhbGwgZm9ybWF0cyB3ZXJlIHJlbmRlcmVkICovCisJLyogY2hlY2sgaWYgYWxsIGZvcm1hdHMgd2VyZSByZW5kZXJlZCAqLwogCi0gICAgICB3aGlsZShscEZvcm1hdCkKLSAgICAgIHsgCi0gICAgICAgICBpZiggbHBGb3JtYXQtPndEYXRhUHJlc2VudCAmJiAhbHBGb3JtYXQtPmhEYXRhICkKLQkgewotCSAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiXHRkYXRhIG1pc3NpbmcgZm9yIGNsaXBib2FyZCBmb3JtYXQgJWlcbiIsIGxwRm9ybWF0LT53Rm9ybWF0SUQpOyAKLQkgICBscEZvcm1hdC0+d0RhdGFQcmVzZW50ID0gMDsKLQkgfQotICAgICAgICAgbHBGb3JtYXQgPSBscEZvcm1hdC0+TmV4dEZvcm1hdDsKLSAgICAgIH0KLSAgICAgIGhXbmRDbGlwT3duZXIgPSAwOwotICB9CisJd2hpbGUobHBGb3JtYXQpCisJeworCSAgICBpZiggbHBGb3JtYXQtPndEYXRhUHJlc2VudCAmJiAhbHBGb3JtYXQtPmhEYXRhICkKKwkgICAgeworCQlkcHJpbnRmX2NsaXBib2FyZCggc3RkZGViLCJcdGRhdGEgbWlzc2luZyBmb3IgY2xpcGJvYXJkIGZvcm1hdCAlaVxuIiwgCisJCQkJICAgbHBGb3JtYXQtPndGb3JtYXRJRCk7IAorCQlscEZvcm1hdC0+d0RhdGFQcmVzZW50ID0gMDsKKwkgICAgfQorCSAgICBscEZvcm1hdCA9IGxwRm9ybWF0LT5OZXh0Rm9ybWF0OworCX0KKwloV25kQ2xpcE93bmVyID0gMDsKKyAgICB9CiAKLSAgLyogbm93IHRyeSB0byBzYWx2YWdlIGN1cnJlbnQgc2VsZWN0aW9uIGZyb20gYmVpbmcgZGVzdHJveWVkIGJ5IFggKi8KKyAgICAvKiBub3cgdHJ5IHRvIHNhbHZhZ2UgY3VycmVudCBzZWxlY3Rpb24gZnJvbSBiZWluZyBkZXN0cm95ZWQgYnkgWCAqLwogCi0gIGlmKCBwV25kLT53aW5kb3cgKSBDTElQQk9BUkRfQ2hlY2tTZWxlY3Rpb24ocFduZCk7CisgICAgaWYoIHBXbmQtPndpbmRvdyApIENMSVBCT0FSRF9DaGVja1NlbGVjdGlvbihwV25kKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDMsMTYgKzE3OSwxNiBAQAogICovCiBzdGF0aWMgdm9pZCBDTElQQk9BUkRfRGVsZXRlUmVjb3JkKExQQ0xJUEZPUk1BVCBscEZvcm1hdCwgQk9PTDMyIGJDaGFuZ2UpCiB7Ci0gIGlmKCBscEZvcm1hdC0+d0Zvcm1hdElEID49IENGX0dESU9CSkZJUlNUICYmCi0gICAgICBscEZvcm1hdC0+d0Zvcm1hdElEIDw9IENGX0dESU9CSkxBU1QgKQotICAgICAgRGVsZXRlT2JqZWN0MzIobHBGb3JtYXQtPmhEYXRhKTsKLSAgZWxzZSBpZiggbHBGb3JtYXQtPmhEYXRhICkKLSAgICAgICAgICAgR2xvYmFsRnJlZTE2KGxwRm9ybWF0LT5oRGF0YSk7CisgICAgaWYoIGxwRm9ybWF0LT53Rm9ybWF0SUQgPj0gQ0ZfR0RJT0JKRklSU1QgJiYKKwlscEZvcm1hdC0+d0Zvcm1hdElEIDw9IENGX0dESU9CSkxBU1QgKQorCURlbGV0ZU9iamVjdDMyKGxwRm9ybWF0LT5oRGF0YSk7CisgICAgZWxzZSBpZiggbHBGb3JtYXQtPmhEYXRhICkKKwlHbG9iYWxGcmVlMTYobHBGb3JtYXQtPmhEYXRhKTsKIAotICBscEZvcm1hdC0+d0RhdGFQcmVzZW50ID0gMDsgCi0gIGxwRm9ybWF0LT5oRGF0YSA9IDA7CisgICAgbHBGb3JtYXQtPndEYXRhUHJlc2VudCA9IDA7IAorICAgIGxwRm9ybWF0LT5oRGF0YSA9IDA7CiAKLSAgaWYoIGJDaGFuZ2UgKSBiQ2xpcENoYW5nZWQgPSBUUlVFOworICAgIGlmKCBiQ2hhbmdlICkgYkNCSGFzQ2hhbmdlZCA9IFRSVUU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTYwLDMxICsxOTYsMzQgQEAKICAqLwogc3RhdGljIEJPT0wzMiBDTElQQk9BUkRfUmVxdWVzdFhTZWxlY3Rpb24oKQogewotICBIV05EMzIgaFduZCA9IChoV25kQ2xpcFdpbmRvdykgPyBoV25kQ2xpcFdpbmRvdyA6IEdldEFjdGl2ZVdpbmRvdzMyKCk7CisgICAgSFdORDMyIGhXbmQgPSAoaFduZENsaXBXaW5kb3cpID8gaFduZENsaXBXaW5kb3cgOiBHZXRBY3RpdmVXaW5kb3czMigpOwogCi0gIGlmKCAhaFduZCApIHJldHVybiBGQUxTRTsKKyAgICBpZiggIWhXbmQgKSByZXR1cm4gRkFMU0U7CiAKLSAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJSZXF1ZXN0aW5nIHNlbGVjdGlvbi4uLlxuIik7CisgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJSZXF1ZXN0aW5nIHNlbGVjdGlvbi4uLlxuIik7CiAKICAgLyogcmVxdWVzdCBkYXRhIHR5cGUgWEFfU1RSSU5HLCBsYXRlcgogICAgKiBDTElQQk9BUkRfUmVhZFNlbGVjdGlvbigpIHdpbGwgYmUgaW52b2tlZCAKICAgICogZnJvbSB0aGUgU2VsZWN0aW9uTm90aWZ5IGV2ZW50IGhhbmRsZXIgKi8KIAotICBYQ29udmVydFNlbGVjdGlvbihkaXNwbGF5LFhBX1BSSU1BUlksWEFfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICBYSW50ZXJuQXRvbShkaXNwbGF5LCJQUklNQVJZX1RFWFQiLEZhbHNlKSwKLSAgICAgICAgICAgICAgICAgICAgV0lOX0dldFhXaW5kb3coaFduZCksQ3VycmVudFRpbWUpOworICAgIFhDb252ZXJ0U2VsZWN0aW9uKGRpc3BsYXksWEFfUFJJTUFSWSxYQV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgWEludGVybkF0b20oZGlzcGxheSwiUFJJTUFSWV9URVhUIixGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgV0lOX0dldFhXaW5kb3coaFduZCksQ3VycmVudFRpbWUpOwogCi0gIC8qIHdhaXQgdW50aWwgU2VsZWN0aW9uTm90aWZ5IGlzIHByb2Nlc3NlZCAqLworICAvKiB3YWl0IHVudGlsIFNlbGVjdGlvbk5vdGlmeSBpcyBwcm9jZXNzZWQgCisgICAqCisgICAqIEZJWE1FOiBVc2UgWENoZWNrVHlwZWRXaW5kb3dFdmVudCgpIGluc3RlYWQgKCBzYW1lIGluIHRoZSAKKyAgICoJICAgIENMSVBCT0FSRF9DaGVja1NlbGVjdGlvbigpICkuIAorICAgKi8KIAotICBzZWxlY3Rpb25XYWl0PVRydWU7Ci0gIHdoaWxlKHNlbGVjdGlvbldhaXQpIAotICAgICAgICBFVkVOVF9XYWl0TmV0RXZlbnQoIFRSVUUsIEZBTFNFICk7CisgICAgc2VsZWN0aW9uV2FpdD1UcnVlOworICAgIHdoaWxlKHNlbGVjdGlvbldhaXQpIEVWRU5UX1dhaXROZXRFdmVudCggVFJVRSwgRkFMU0UgKTsKIAogICAvKiB3ZSB0cmVhdCBVbml4IHRleHQgYXMgQ0ZfT0VNVEVYVCAqLwotICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlx0Z290IENGX09FTVRFWFQgPSAlaVxuIiwgCi0JCSAgICBDbGlwRm9ybWF0c1tDRl9PRU1URVhULTFdLndEYXRhUHJlc2VudCk7CisgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdGdvdCBDRl9PRU1URVhUID0gJWlcbiIsIAorCQkgICAgICBDbGlwRm9ybWF0c1tDRl9PRU1URVhULTFdLndEYXRhUHJlc2VudCk7CiAKLSAgcmV0dXJuIChCT09MMzIpQ2xpcEZvcm1hdHNbQ0ZfT0VNVEVYVC0xXS53RGF0YVByZXNlbnQ7CisgICAgcmV0dXJuIChCT09MMzIpQ2xpcEZvcm1hdHNbQ0ZfT0VNVEVYVC0xXS53RGF0YVByZXNlbnQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTkyLDIxICsyMzEsMTcgQEAKICAqLwogQk9PTDMyIENMSVBCT0FSRF9Jc1ByZXNlbnQoV09SRCB3Rm9ybWF0KQogewotICAgIExQQ0xJUEZPUk1BVCBscEZvcm1hdCA9IENsaXBGb3JtYXRzOyAKLQogICAgIC8qIHNwZWNpYWwgY2FzZSAqLwogCiAgICAgaWYoIHdGb3JtYXQgPT0gQ0ZfVEVYVCB8fCB3Rm9ybWF0ID09IENGX09FTVRFWFQgKQotICAgICAgICByZXR1cm4gbHBGb3JtYXRbQ0ZfVEVYVC0xXS53RGF0YVByZXNlbnQgfHwKLSAgICAgICAgICAgICAgIGxwRm9ybWF0W0NGX09FTVRFWFQtMV0ud0RhdGFQcmVzZW50OwotCi0gICAgd2hpbGUoVFJVRSkgewotICAgICAgICBpZiAobHBGb3JtYXQgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAobHBGb3JtYXQtPndGb3JtYXRJRCA9PSB3Rm9ybWF0KSBicmVhazsKLSAgICAgICAgbHBGb3JtYXQgPSBscEZvcm1hdC0+TmV4dEZvcm1hdDsKLSAgICAgICAgfQotCi0gICAgcmV0dXJuIChscEZvcm1hdC0+d0RhdGFQcmVzZW50KTsKKyAgICAgICAgcmV0dXJuIENsaXBGb3JtYXRzW0NGX1RFWFQtMV0ud0RhdGFQcmVzZW50IHx8CisgICAgICAgICAgICAgICBDbGlwRm9ybWF0c1tDRl9PRU1URVhULTFdLndEYXRhUHJlc2VudDsKKyAgICBlbHNlCisgICAgeworCUxQQ0xJUEZPUk1BVCBscEZvcm1hdCA9IF9fbG9va3VwX2Zvcm1hdCggQ2xpcEZvcm1hdHMsIHdGb3JtYXQgKTsKKwlpZiggbHBGb3JtYXQgKSByZXR1cm4gKGxwRm9ybWF0LT53RGF0YVByZXNlbnQpOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjIwLDE4ICsyNTUsMjMgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgIE9wZW5DbGlwYm9hcmQzMiAgIChVU0VSMzIuNDA2KQorICoKKyAqIE5vdGU6IE5ldHNjYXBlIHVzZXMgTlVMTCBoV25kIHRvIG9wZW4gdGhlIGNsaXBib2FyZC4KICAqLwogQk9PTDMyIFdJTkFQSSBPcGVuQ2xpcGJvYXJkMzIoIEhXTkQzMiBoV25kICkKIHsKLSAgICBCT09MMzIgYlJldCA9IEZBTFNFOworICAgIEJPT0wzMiBiUmV0OworCiAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJPcGVuQ2xpcGJvYXJkKCUwNHgpID0gIiwgaFduZCk7CiAKLSAgICBpZiAoIWhXbmRDbGlwV2luZG93KQotICAgICAgIHsKKyAgICBpZiAoIWhxQ2xpcExvY2spCisgICAgeworCSBocUNsaXBMb2NrID0gR2V0VGFza1F1ZXVlKDApOwogICAgIAkgaFduZENsaXBXaW5kb3cgPSBoV25kOworCSBiQ0JIYXNDaGFuZ2VkID0gRkFMU0U7CiAJIGJSZXQgPSBUUlVFOwotICAgICAgIH0KLSAgICBiQ2xpcENoYW5nZWQgPSBGQUxTRTsKKyAgICB9CisgICAgZWxzZSBiUmV0ID0gRkFMU0U7CiAKICAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIiVpXG4iLCBiUmV0KTsKICAgICByZXR1cm4gYlJldDsKQEAgLTI1NCwxMSArMjk0LDE0IEBACiB7CiAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJDbG9zZUNsaXBib2FyZCgpOyAhXG4iKTsKIAotICAgIGlmIChoV25kQ2xpcFdpbmRvdyA9PSAwKSByZXR1cm4gRkFMU0U7Ci0gICAgaFduZENsaXBXaW5kb3cgPSAwOworICAgIGlmIChocUNsaXBMb2NrID09IEdldFRhc2tRdWV1ZSgwKSkKKyAgICB7CisJaFduZENsaXBXaW5kb3cgPSAwOwogCi0gICAgaWYgKGJDbGlwQ2hhbmdlZCAmJiBoV25kVmlld2VyKSBTZW5kTWVzc2FnZTE2KGhXbmRWaWV3ZXIsV01fRFJBV0NMSVBCT0FSRCwwLDBMKTsKLQorICAgICAgICBpZiAoYkNCSGFzQ2hhbmdlZCAmJiBoV25kVmlld2VyKSAKKwkgICAgU2VuZE1lc3NhZ2UxNihoV25kVmlld2VyLCBXTV9EUkFXQ0xJUEJPQVJELCAwLCAwTCk7CisJaHFDbGlwTG9jayA9IDA7CisgICAgfQogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0yODEsMjAgKzMyNCwyMCBAQAogCiAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJFbXB0eUNsaXBib2FyZCgpXG4iKTsKIAotICAgIGlmIChoV25kQ2xpcFdpbmRvdyA9PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKGhxQ2xpcExvY2sgIT0gR2V0VGFza1F1ZXVlKDApKSByZXR1cm4gRkFMU0U7CiAKICAgICAvKiBkZXN0cm95IHByaXZhdGUgb2JqZWN0cyAqLwogCiAgICAgaWYgKGhXbmRDbGlwT3duZXIpCi0JU2VuZE1lc3NhZ2UxNihoV25kQ2xpcE93bmVyLFdNX0RFU1RST1lDTElQQk9BUkQsMCwwTCk7CisJU2VuZE1lc3NhZ2UxNihoV25kQ2xpcE93bmVyLCBXTV9ERVNUUk9ZQ0xJUEJPQVJELCAwLCAwTCk7CiAgIAogICAgIHdoaWxlKGxwRm9ybWF0KSAKLSAgICAgIHsKKyAgICB7CiAJaWYgKCBscEZvcm1hdC0+d0RhdGFQcmVzZW50IHx8IGxwRm9ybWF0LT5oRGF0YSApCiAJICAgICBDTElQQk9BUkRfRGVsZXRlUmVjb3JkKCBscEZvcm1hdCwgVFJVRSApOwogCiAJbHBGb3JtYXQgPSBscEZvcm1hdC0+TmV4dEZvcm1hdDsKLSAgICAgIH0KKyAgICB9CiAKICAgICBoV25kQ2xpcE93bmVyID0gaFduZENsaXBXaW5kb3c7CiAKQEAgLTMwNyw3ICszNTAsNyBAQAogCWRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwgIlx0Z2l2aW5nIHVwIHNlbGVjdGlvbiAoc3B3ID0gJTA4eClcbiIsIAogCQkJCSAJKHVuc2lnbmVkKXNlbGVjdGlvblByZXZXaW5kb3cpOwogCi0JWFNldFNlbGVjdGlvbk93bmVyKGRpc3BsYXksWEFfUFJJTUFSWSxOb25lLEN1cnJlbnRUaW1lKTsKKwlYU2V0U2VsZWN0aW9uT3duZXIoZGlzcGxheSwgWEFfUFJJTUFSWSwgTm9uZSwgQ3VycmVudFRpbWUpOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTMzNiwzNCArMzc5LDM3IEBACiAgKi8KIEhBTkRMRTE2IFdJTkFQSSBTZXRDbGlwYm9hcmREYXRhMTYoIFVJTlQxNiB3Rm9ybWF0LCBIQU5ETEUxNiBoRGF0YSApCiB7Ci0gICAgTFBDTElQRk9STUFUIGxwRm9ybWF0ID0gQ2xpcEZvcm1hdHM7IAorICAgIExQQ0xJUEZPUk1BVCBscEZvcm1hdCA9IF9fbG9va3VwX2Zvcm1hdCggQ2xpcEZvcm1hdHMsIHdGb3JtYXQgKTsKICAgICBXaW5kb3cgICAgICAgb3duZXI7CiAKICAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsCiAJCSJTZXRDbGlwYm9hcmREYXRhKCUwNFgsICUwNHgpICFcbiIsIHdGb3JtYXQsIGhEYXRhKTsKIAotICAgIHdoaWxlKFRSVUUpIAotICAgICAgewotCWlmIChscEZvcm1hdCA9PSBOVUxMKSByZXR1cm4gMDsKLQlpZiAobHBGb3JtYXQtPndGb3JtYXRJRCA9PSB3Rm9ybWF0KSBicmVhazsKLQlscEZvcm1hdCA9IGxwRm9ybWF0LT5OZXh0Rm9ybWF0OwotICAgICAgfQorICAgIC8qIE5PVEU6IElmIHRoZSBoRGF0YSBpcyB6ZXJvIGFuZCBjdXJyZW50IG93bmVyIGRvZXNuJ3QgbWF0Y2gKKyAgICAgKiB0aGUgd2luZG93IHRoYXQgb3BlbmVkIHRoZSBjbGlwYm9hcmQgdGhlbiB0aGlzIGFwcGxpY2F0aW9uCisgICAgICogaXMgc2NyZXdlZCBiZWNhdXNlIFdNX1JFTkRFUkZPUk1BVCB3aWxsIGdvIHRvIHRoZSBvd25lcgorICAgICAqICh0byBiZWNvbWUgdGhlIG93bmVyIGl0IG11c3QgY2FsbCBFbXB0eUNsaXBib2FyZCgpIGJlZm9yZQorICAgICAqICBhZGRpbmcgbmV3IGRhdGEpLgorICAgICAqLworCisgICAgaWYoIChocUNsaXBMb2NrICE9IEdldFRhc2tRdWV1ZSgwKSkgfHwgIWxwRm9ybWF0IHx8CisJKCFoRGF0YSAmJiAoIWhXbmRDbGlwT3duZXIgfHwgKGhXbmRDbGlwT3duZXIgIT0gaFduZENsaXBXaW5kb3cpKSkgKSByZXR1cm4gMDsgCiAKICAgICAvKiBBY3F1aXJlIFggc2VsZWN0aW9uIGlmIHRleHQgZm9ybWF0ICovCiAKICAgICBpZiggIXNlbGVjdGlvbkFjcXVpcmVkICYmIAogCSh3Rm9ybWF0ID09IENGX1RFWFQgfHwgd0Zvcm1hdCA9PSBDRl9PRU1URVhUKSApCiAgICAgewotICAgICAgb3duZXIgPSBXSU5fR2V0WFdpbmRvdyhoV25kQ2xpcFdpbmRvdyk7Ci0gICAgICBYU2V0U2VsZWN0aW9uT3duZXIoZGlzcGxheSxYQV9QUklNQVJZLG93bmVyLEN1cnJlbnRUaW1lKTsKLSAgICAgIGlmKCBYR2V0U2VsZWN0aW9uT3duZXIoZGlzcGxheSxYQV9QUklNQVJZKSA9PSBvd25lciApCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbkFjcXVpcmVkID0gVHJ1ZTsKLQlzZWxlY3Rpb25XaW5kb3cgPSBvd25lcjsKKwlvd25lciA9IFdJTl9HZXRYV2luZG93KCBoV25kQ2xpcFdpbmRvdyA/IGhXbmRDbGlwV2luZG93IDogQW55UG9wdXAzMigpICk7CisJWFNldFNlbGVjdGlvbk93bmVyKGRpc3BsYXksWEFfUFJJTUFSWSxvd25lcixDdXJyZW50VGltZSk7CisJaWYoIFhHZXRTZWxlY3Rpb25Pd25lcihkaXNwbGF5LFhBX1BSSU1BUlkpID09IG93bmVyICkKKwl7CisJICAgIHNlbGVjdGlvbkFjcXVpcmVkID0gVHJ1ZTsKKwkgICAgc2VsZWN0aW9uV2luZG93ID0gb3duZXI7CiAKLSAgICAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJHcmFiYmVkIFggc2VsZWN0aW9uLCBvd25lcj0oJTA4eClcbiIsIAorCSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIkdyYWJiZWQgWCBzZWxlY3Rpb24sIG93bmVyPSglMDh4KVxuIiwgCiAJCQkJCQkodW5zaWduZWQpIG93bmVyKTsKLSAgICAgIH0KKwl9CiAgICAgfQogCiAgICAgaWYgKCBscEZvcm1hdC0+d0RhdGFQcmVzZW50IHx8IGxwRm9ybWF0LT5oRGF0YSApIApAQCAtMzgwLDcgKzQyNiw3IEBACiAJICAgIENMSVBCT0FSRF9EZWxldGVSZWNvcmQoJkNsaXBGb3JtYXRzW0NGX1RFWFQtMV0sIFRSVUUpOwogICAgIH0KIAotICAgIGJDbGlwQ2hhbmdlZCA9IFRSVUU7CisgICAgYkNCSGFzQ2hhbmdlZCA9IFRSVUU7CiAgICAgbHBGb3JtYXQtPndEYXRhUHJlc2VudCA9IDE7CiAgICAgbHBGb3JtYXQtPmhEYXRhID0gaERhdGE7ICAgICAgICAgIC8qIDAgaXMgbGVnYWwsIHNlZSBXTV9SRU5ERVJGT1JNQVQgKi8KIApAQCAtNDAzLDcgKzQ0OSw3IEBACiAgKi8KIHN0YXRpYyBCT09MMzIgQ0xJUEJPQVJEX1JlbmRlckZvcm1hdChMUENMSVBGT1JNQVQgbHBGb3JtYXQpCiB7Ci0gaWYoIGxwRm9ybWF0LT53RGF0YVByZXNlbnQgJiYgIWxwRm9ybWF0LT5oRGF0YSApCisgICBpZiggbHBGb3JtYXQtPndEYXRhUHJlc2VudCAmJiAhbHBGb3JtYXQtPmhEYXRhICkKICAgIGlmKCBJc1dpbmRvdzMyKGhXbmRDbGlwT3duZXIpICkKICAgICAgICBTZW5kTWVzc2FnZTE2KGhXbmRDbGlwT3duZXIsV01fUkVOREVSRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTE2KWxwRm9ybWF0LT53Rm9ybWF0SUQsMEwpOwpAQCAtNDE0LDM3ICs0NjAsMzkgQEAKICAgICAgICBoV25kQ2xpcE93bmVyID0gMDsgbHBGb3JtYXQtPndEYXRhUHJlc2VudCA9IDA7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQotIHJldHVybiAobHBGb3JtYXQtPmhEYXRhKSA/IFRSVUUgOiBGQUxTRTsKKyAgIHJldHVybiAobHBGb3JtYXQtPmhEYXRhKSA/IFRSVUUgOiBGQUxTRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgICAgICBDTElQQk9BUkRfUmVuZGVyVGV4dAorICoKKyAqIENvbnZlcnQgdGV4dCBiZXR3ZWVuIFVOSVggYW5kIERPUyBmb3JtYXRzLgogICovCiBzdGF0aWMgQk9PTDMyIENMSVBCT0FSRF9SZW5kZXJUZXh0KExQQ0xJUEZPUk1BVCBscFRhcmdldCwgTFBDTElQRk9STUFUIGxwU291cmNlKQogewotICBVSU5UMTYgc2l6ZSA9IEdsb2JhbFNpemUxNiggbHBTb3VyY2UtPmhEYXRhICk7Ci0gIExQQ1NUUglscHN0clMgPSAoTFBTVFIpR2xvYmFsTG9jazE2KGxwU291cmNlLT5oRGF0YSk7Ci0gIExQU1RSCQlscHN0clQ7CisgICAgVUlOVDE2IHNpemUgPSBHbG9iYWxTaXplMTYoIGxwU291cmNlLT5oRGF0YSApOworICAgIExQQ1NUUiBscHN0clMgPSAoTFBTVFIpR2xvYmFsTG9jazE2KGxwU291cmNlLT5oRGF0YSk7CisgICAgTFBTVFIgIGxwc3RyVDsKIAotICBpZiggIWxwc3RyUyApIHJldHVybiBGQUxTRTsKLSAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdGNvbnZlcnRpbmcgZnJvbSAnJXMnIHRvICclcycsICVpIGNoYXJzXG4iLAorICAgIGlmKCAhbHBzdHJTICkgcmV0dXJuIEZBTFNFOworICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiXHRjb252ZXJ0aW5nIGZyb20gJyVzJyB0byAnJXMnLCAlaSBjaGFyc1xuIiwKIAkJCSAgIAkgICAgICBscFNvdXJjZS0+TmFtZSwgbHBUYXJnZXQtPk5hbWUsIHNpemUpOwogCi0gIGxwVGFyZ2V0LT5oRGF0YSA9IEdsb2JhbEFsbG9jMTYoR01FTV9aRVJPSU5JVCwgc2l6ZSk7IAotICBscHN0clQgPSAoTFBTVFIpR2xvYmFsTG9jazE2KGxwVGFyZ2V0LT5oRGF0YSk7CisgICAgbHBUYXJnZXQtPmhEYXRhID0gR2xvYmFsQWxsb2MxNihHTUVNX1pFUk9JTklULCBzaXplKTsgCisgICAgbHBzdHJUID0gKExQU1RSKUdsb2JhbExvY2sxNihscFRhcmdldC0+aERhdGEpOwogCi0gIGlmKCBscHN0clQgKQotICB7Ci0gICAgaWYoIGxwU291cmNlLT53Rm9ybWF0SUQgPT0gQ0ZfVEVYVCApCi0JQ2hhclRvT2VtQnVmZjMyQShscHN0clMsIGxwc3RyVCwgc2l6ZSk7Ci0gICAgZWxzZQotCU9lbVRvQ2hhckJ1ZmYzMkEobHBzdHJTLCBscHN0clQsIHNpemUpOwotICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiXHRnb3QgJXNcbiIsIGxwc3RyVCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci0gIH0KKyAgICBpZiggbHBzdHJUICkKKyAgICB7CisJaWYoIGxwU291cmNlLT53Rm9ybWF0SUQgPT0gQ0ZfVEVYVCApCisJICAgIENoYXJUb09lbUJ1ZmYzMkEobHBzdHJTLCBscHN0clQsIHNpemUpOworCWVsc2UKKwkgICAgT2VtVG9DaGFyQnVmZjMyQShscHN0clMsIGxwc3RyVCwgc2l6ZSk7CisJZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdGdvdCAlc1xuIiwgbHBzdHJUKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CiAKLSAgbHBUYXJnZXQtPmhEYXRhID0gMDsKLSAgcmV0dXJuIEZBTFNFOworICAgIGxwVGFyZ2V0LT5oRGF0YSA9IDA7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ1NSw3ICs1MDMsNyBAQAogICAgIExQQ0xJUEZPUk1BVCBscFJlbmRlciA9IENsaXBGb3JtYXRzOyAKICAgICBMUENMSVBGT1JNQVQgbHBVcGRhdGUgPSBOVUxMOwogCi0gICAgaWYgKCFoV25kQ2xpcFdpbmRvdykgcmV0dXJuIDA7CisgICAgaWYgKGhxQ2xpcExvY2sgIT0gR2V0VGFza1F1ZXVlKDApKSByZXR1cm4gMDsKIAogICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiR2V0Q2xpcGJvYXJkRGF0YSglMDRYKVxuIiwgd0Zvcm1hdCk7CiAKQEAgLTQ3NywxOCArNTI1LDEzIEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICB3aGlsZShUUlVFKSAKLSAgICAgIHsKLQlpZiAobHBSZW5kZXIgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JaWYgKGxwUmVuZGVyLT53Rm9ybWF0SUQgPT0gd0Zvcm1hdCkgYnJlYWs7Ci0JbHBSZW5kZXIgPSBscFJlbmRlci0+TmV4dEZvcm1hdDsKLSAgICAgIH0KLSAgICAgIGxwVXBkYXRlID0gbHBSZW5kZXI7CisJbHBSZW5kZXIgPSBfX2xvb2t1cF9mb3JtYXQoIENsaXBGb3JtYXRzLCB3Rm9ybWF0ICk7CisJbHBVcGRhdGUgPSBscFJlbmRlcjsKICAgICB9CiAgICAKLSAgICBpZiggIUNMSVBCT0FSRF9SZW5kZXJGb3JtYXQobHBSZW5kZXIpICkgcmV0dXJuIDA7IAotICAgIGlmKCBscFVwZGF0ZSAhPSBscFJlbmRlciAmJgotCSFscFVwZGF0ZS0+aERhdGEgKSBDTElQQk9BUkRfUmVuZGVyVGV4dChscFVwZGF0ZSwgbHBSZW5kZXIpOworICAgIGlmKCAhbHBSZW5kZXIgfHwgIUNMSVBCT0FSRF9SZW5kZXJGb3JtYXQobHBSZW5kZXIpICkgcmV0dXJuIDA7IAorICAgIGlmKCBscFVwZGF0ZSAhPSBscFJlbmRlciAmJiAhbHBVcGRhdGUtPmhEYXRhICkgCisJQ0xJUEJPQVJEX1JlbmRlclRleHQobHBVcGRhdGUsIGxwUmVuZGVyKTsKIAogICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiXHRyZXR1cm5pbmcgJTA0eCAodHlwZSAlaSlcbiIsIAogCQkJICAgICAgbHBVcGRhdGUtPmhEYXRhLCBscFVwZGF0ZS0+d0Zvcm1hdElEKTsKQEAgLTUyOSwxNiArNTcyLDE2IEBACiAgICAgRm9ybWF0Q291bnQgKz0gYWJzKGxwRm9ybWF0W0NGX1RFWFQtMV0ud0RhdGFQcmVzZW50IC0KIAkJICAgICAgIGxwRm9ybWF0W0NGX09FTVRFWFQtMV0ud0RhdGFQcmVzZW50KTsgCiAKLSAgICB3aGlsZShUUlVFKSB7CisgICAgd2hpbGUoVFJVRSkgCisgICAgewogCWlmIChscEZvcm1hdCA9PSBOVUxMKSBicmVhazsKIAlpZiAobHBGb3JtYXQtPndEYXRhUHJlc2VudCkgCi0JICAgIHsKLSAgICAgICAgICAgICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwgIlx0ZGF0YSBmb3VuZCBmb3IgZm9ybWF0ICVpXG4iLCBscEZvcm1hdC0+d0Zvcm1hdElEKTsKLQotCSAgICAgICBGb3JtYXRDb3VudCsrOwotCSAgICB9Ci0JbHBGb3JtYXQgPSBscEZvcm1hdC0+TmV4dEZvcm1hdDsKKwl7CisgICAgICAgICAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsICJcdGRhdGEgZm91bmQgZm9yIGZvcm1hdCAlaVxuIiwgbHBGb3JtYXQtPndGb3JtYXRJRCk7CisJICAgIEZvcm1hdENvdW50Kys7CiAJfQorCWxwRm9ybWF0ID0gbHBGb3JtYXQtPk5leHRGb3JtYXQ7CisgICAgfQogCiAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdHRvdGFsICVkXG4iLCBGb3JtYXRDb3VudCk7CiAgICAgcmV0dXJuIEZvcm1hdENvdW50OwpAQCAtNTYzLDcgKzYwNiw3IEBACiAKICAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIkVudW1DbGlwYm9hcmRGb3JtYXRzKCUwNFgpXG4iLCB3Rm9ybWF0KTsKIAotICAgIGlmKCAhaFduZENsaXBXaW5kb3cgKSByZXR1cm4gMDsKKyAgICBpZiggaHFDbGlwTG9jayAhPSBHZXRUYXNrUXVldWUoMCkgKSByZXR1cm4gMDsKIAogICAgIGlmKCAoIXdGb3JtYXQgfHwgd0Zvcm1hdCA9PSBDRl9URVhUIHx8IHdGb3JtYXQgPT0gQ0ZfT0VNVEVYVCkgCiAJICYmICFzZWxlY3Rpb25BY3F1aXJlZCkgQ0xJUEJPQVJEX1JlcXVlc3RYU2VsZWN0aW9uKCk7CkBAIC01NzYsMjIgKzYxOSwxOSBAQAogCiAgICAgLyogd2FsayB1cCB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCByZWNvcmQgKi8KIAotICAgIHdoaWxlKFRSVUUpIHsKLQlpZiAobHBGb3JtYXQgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JaWYgKGxwRm9ybWF0LT53Rm9ybWF0SUQgPT0gd0Zvcm1hdCkgYnJlYWs7Ci0JbHBGb3JtYXQgPSBscEZvcm1hdC0+TmV4dEZvcm1hdDsKLQl9CisgICAgaWYoICEobHBGb3JtYXQgPSBfX2xvb2t1cF9mb3JtYXQoIGxwRm9ybWF0LCB3Rm9ybWF0ICkpICkgcmV0dXJuIDA7CiAKICAgICAvKiBmaW5kIG5leHQgZm9ybWF0IHdpdGggYXZhaWxhYmxlIGRhdGEgKi8KIAogICAgIGxwRm9ybWF0ID0gbHBGb3JtYXQtPk5leHRGb3JtYXQ7Ci0gICAgd2hpbGUoVFJVRSkgeworICAgIHdoaWxlKFRSVUUpIAorICAgIHsKIAlpZiAobHBGb3JtYXQgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JaWYgKGxwRm9ybWF0LT53RGF0YVByZXNlbnQgfHwKLQkgICAgICAgKGxwRm9ybWF0LT53Rm9ybWF0SUQgPT0gQ0ZfT0VNVEVYVCAmJgotCQlDbGlwRm9ybWF0c1tDRl9URVhULTFdLndEYXRhUHJlc2VudCkpIGJyZWFrOworCWlmIChscEZvcm1hdC0+d0RhdGFQcmVzZW50IHx8IChscEZvcm1hdC0+d0Zvcm1hdElEID09IENGX09FTVRFWFQgJiYgCisJCQkJICAgICAgIENsaXBGb3JtYXRzW0NGX1RFWFQtMV0ud0RhdGFQcmVzZW50KSkgCisJICAgIGJyZWFrOwogCWxwRm9ybWF0ID0gbHBGb3JtYXQtPk5leHRGb3JtYXQ7Ci0JfQorICAgIH0KIAogICAgIHJldHVybiBscEZvcm1hdC0+d0Zvcm1hdElEOwogfQpAQCAtNjExLDE3ICs2NTEsMTggQEAKIAogICAgIC8qIHdhbGsgZm9ybWF0IGNoYWluIHRvIHNlZSBpZiBpdCdzIGFscmVhZHkgcmVnaXN0ZXJlZCAqLwogCi0gICAgd2hpbGUoVFJVRSkgeworICAgIHdoaWxlKFRSVUUpIAorICAgIHsKIAlpZiAoICFzdHJjbXAobHBGb3JtYXQtPk5hbWUsRm9ybWF0TmFtZSkgKQotCSAgIHsKKwl7CiAJICAgICBscEZvcm1hdC0+d1JlZkNvdW50Kys7CiAJICAgICByZXR1cm4gbHBGb3JtYXQtPndGb3JtYXRJRDsKLQkgICB9CisJfQogIAogCWlmICggbHBGb3JtYXQtPk5leHRGb3JtYXQgPT0gTlVMTCApIGJyZWFrOwogCiAJbHBGb3JtYXQgPSBscEZvcm1hdC0+TmV4dEZvcm1hdDsKLQl9CisgICAgfQogCiAgICAgLyogYWxsb2NhdGUgc3RvcmFnZSBmb3IgbmV3IGZvcm1hdCBlbnRyeSAqLwogCkBAIC02NzcsMTggKzcxOCwxMiBAQAogICovCiBJTlQzMiBXSU5BUEkgR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZTMyQSggVUlOVDMyIHdGb3JtYXQsIExQU1RSIHJldFN0ciwgSU5UMzIgbWF4bGVuICkKIHsKLSAgICBMUENMSVBGT1JNQVQgbHBGb3JtYXQgPSBDbGlwRm9ybWF0czsgCisgICAgTFBDTElQRk9STUFUIGxwRm9ybWF0ID0gX19sb29rdXBfZm9ybWF0KCBDbGlwRm9ybWF0cywgd0Zvcm1hdCApOwogCiAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLAogCSJHZXRDbGlwYm9hcmRGb3JtYXROYW1lKCUwNFgsICVwLCAlZCkgIVxuIiwgd0Zvcm1hdCwgcmV0U3RyLCBtYXhsZW4pOwogCi0gICAgd2hpbGUoVFJVRSkgewotCWlmIChscEZvcm1hdCA9PSBOVUxMKSByZXR1cm4gMDsKLQlpZiAobHBGb3JtYXQtPndGb3JtYXRJRCA9PSB3Rm9ybWF0KSBicmVhazsKLQlscEZvcm1hdCA9IGxwRm9ybWF0LT5OZXh0Rm9ybWF0OwotCX0KLQotICAgIGlmIChscEZvcm1hdC0+TmFtZSA9PSBOVUxMIHx8IAorICAgIGlmIChscEZvcm1hdCA9PSBOVUxMIHx8IGxwRm9ybWF0LT5OYW1lID09IE5VTEwgfHwgCiAJbHBGb3JtYXQtPndGb3JtYXRJRCA8IENGX1JFR0ZPUk1BVEJBU0UpIHJldHVybiAwOwogCiAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLApAQCAtNzU4LDcgKzc5Myw3IEBACiAgKi8KIEJPT0wxNiBXSU5BUEkgQ2hhbmdlQ2xpcGJvYXJkQ2hhaW4xNihIV05EMTYgaFduZCwgSFdORDE2IGhXbmROZXh0KQogewotICAgIHJldHVybiBDaGFuZ2VDbGlwYm9hcmRDaGFpbjMyKGhXbmQsaFduZE5leHQpOworICAgIHJldHVybiBDaGFuZ2VDbGlwYm9hcmRDaGFpbjMyKGhXbmQsIGhXbmROZXh0KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03NzEsMTAgKzgwNiwxMCBAQAogICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZG5pbXAsICJDaGFuZ2VDbGlwYm9hcmRDaGFpbiglMDR4LCAlMDR4KVxuIiwgaFduZCwgaFduZE5leHQpOwogCiAgICAgaWYoIGhXbmRWaWV3ZXIgKQotICAgICAgYlJldCA9ICFTZW5kTWVzc2FnZTE2KCBoV25kVmlld2VyLCBXTV9DSEFOR0VDQkNIQUlOLAorCWJSZXQgPSAhU2VuZE1lc3NhZ2UxNiggaFduZFZpZXdlciwgV01fQ0hBTkdFQ0JDSEFJTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTE2KWhXbmQsIChMUEFSQU0paFduZE5leHQpOyAgIAogICAgIGVsc2UKLSAgICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiQ2hhbmdlQ2xpcGJvYXJkQ2hhaW46IGhXbmRWaWV3ZXIgaXMgbG9zdFxuIik7CisJZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJDaGFuZ2VDbGlwYm9hcmRDaGFpbjogaFduZFZpZXdlciBpcyBsb3N0XG4iKTsKIAogICAgIGlmKCBoV25kID09IGhXbmRWaWV3ZXIgKSBoV25kVmlld2VyID0gaFduZE5leHQ7CiAKQEAgLTkyOSwzMiArOTY0LDMxIEBACiAgKi8KIHZvaWQgQ0xJUEJPQVJEX1JlbGVhc2VTZWxlY3Rpb24oV2luZG93IHcsIEhXTkQzMiBod25kKQogewotICAvKiB3IGlzIHRoZSB3aW5kb3cgdGhhdCBsb3N0IHNlbGVjdGlvbiwKLSAgICogCi0gICAqIHNlbGVjdGlvblByZXZXaW5kb3cgaXMgbm9uemVybyBpZiBDaGVja1NlbGVjdGlvbigpIHdhcyBjYWxsZWQuIAotICAgKi8KKyAgICAvKiB3IGlzIHRoZSB3aW5kb3cgdGhhdCBsb3N0IHNlbGVjdGlvbiwKKyAgICAgKiAKKyAgICAgKiBzZWxlY3Rpb25QcmV2V2luZG93IGlzIG5vbnplcm8gaWYgQ2hlY2tTZWxlY3Rpb24oKSB3YXMgY2FsbGVkLiAKKyAgICAgKi8KIAotICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlx0ZXZlbnQtPndpbmRvdyA9ICUwOHggKHN3ID0gJTA4eCwgc3B3PSUwOHgpXG4iLCAKKyAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlx0ZXZlbnQtPndpbmRvdyA9ICUwOHggKHN3ID0gJTA4eCwgc3B3PSUwOHgpXG4iLCAKIAkgICh1bnNpZ25lZCl3LCAodW5zaWduZWQpc2VsZWN0aW9uV2luZG93LCAodW5zaWduZWQpc2VsZWN0aW9uUHJldldpbmRvdyApOwogCi0gIGlmKCBzZWxlY3Rpb25BY3F1aXJlZCApCi0gICAgaWYoIHcgPT0gc2VsZWN0aW9uV2luZG93IHx8IHNlbGVjdGlvblByZXZXaW5kb3cgPT0gTm9uZSkKLSAgICB7Ci0gICAgICAvKiBhbHJpZ2h0LCB3ZSByZWFsbHkgbG9zdCBpdCAqLworICAgIGlmKCBzZWxlY3Rpb25BY3F1aXJlZCApCisJaWYoIHcgPT0gc2VsZWN0aW9uV2luZG93IHx8IHNlbGVjdGlvblByZXZXaW5kb3cgPT0gTm9uZSkKKwl7CisJICAgIC8qIGFscmlnaHQsIHdlIHJlYWxseSBsb3N0IGl0ICovCiAKLSAgICAgIHNlbGVjdGlvbkFjcXVpcmVkID0gRmFsc2U7Ci0gICAgICBzZWxlY3Rpb25XaW5kb3cgPSBOb25lOyAKKwkgICAgc2VsZWN0aW9uQWNxdWlyZWQgPSBGYWxzZTsKKwkgICAgc2VsZWN0aW9uV2luZG93ID0gTm9uZTsgCiAKLSAgICAgIC8qIGJ1dCB3ZSdsbCBrZWVwIGV4aXN0aW5nIGRhdGEgZm9yIGludGVybmFsIHVzZSAqLwotICAgIH0KLSAgICBlbHNlIGlmKCB3ID09IHNlbGVjdGlvblByZXZXaW5kb3cgKQotICAgIHsKLSAgICAgIHcgPSAgWEdldFNlbGVjdGlvbk93bmVyKGRpc3BsYXksIFhBX1BSSU1BUlkpOworCSAgICAvKiBidXQgd2UnbGwga2VlcCBleGlzdGluZyBkYXRhIGZvciBpbnRlcm5hbCB1c2UgKi8KKwl9CisJZWxzZSBpZiggdyA9PSBzZWxlY3Rpb25QcmV2V2luZG93ICkKKwl7CisJICAgIHcgPSBYR2V0U2VsZWN0aW9uT3duZXIoZGlzcGxheSwgWEFfUFJJTUFSWSk7CisJICAgIGlmKCB3ID09IE5vbmUgKQorCQlYU2V0U2VsZWN0aW9uT3duZXIoZGlzcGxheSwgWEFfUFJJTUFSWSwgc2VsZWN0aW9uV2luZG93LCBDdXJyZW50VGltZSk7CisJfQogCi0gICAgICBpZiggdyA9PSBOb25lICkKLSAgICAgICAgWFNldFNlbGVjdGlvbk93bmVyKGRpc3BsYXksIFhBX1BSSU1BUlksIHNlbGVjdGlvbldpbmRvdywgQ3VycmVudFRpbWUpOwotICAgIH0KLQotICBzZWxlY3Rpb25QcmV2V2luZG93ID0gTm9uZTsKKyAgICBzZWxlY3Rpb25QcmV2V2luZG93ID0gTm9uZTsKIH0KIApkaWZmIC0tZ2l0IGEvd2luZG93cy9kY2UuYyBiL3dpbmRvd3MvZGNlLmMKaW5kZXggODU3NjE5MC4uZGY5OGExMSAxMDA2NDQKLS0tIGEvd2luZG93cy9kY2UuYworKysgYi93aW5kb3dzL2RjZS5jCkBAIC00MCw3ICs0MCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBEQ0VfRHVtcENhY2hlCiAgKi8KLXN0YXRpYyB2b2lkIERDRV9EdW1wQ2FjaGUoKQorc3RhdGljIHZvaWQgRENFX0R1bXBDYWNoZSh2b2lkKQogewogICAgIERDRSogZGNlID0gZmlyc3REQ0U7CiAgICAgCkBAIC0yMDYsNyArMjA2LDcgQEAKICAqIHJlY3RhbmdsZS4gd25kU2NvcGUgaXMgdGhlIGltbWVkaWF0ZSBwYXJlbnQgb2YgdGhlIHdpbmRvdyhzKSB0aGF0IAogICogd2FzKHdlcmUpIG1vdmVkIGFuZChvcikgcmVzaXplZC4KICAqLwotQk9PTDMyIERDRV9JbnZhbGlkYXRlRENFKFdORCogd25kU2NvcGUsIFJFQ1QzMiogcFJlY3RVcGRhdGUpCitCT09MMzIgRENFX0ludmFsaWRhdGVEQ0UoV05EKiB3bmRTY29wZSwgY29uc3QgUkVDVDMyKiBwUmVjdFVwZGF0ZSkKIHsKICAgICBCT09MMzIgYlJldCA9IEZBTFNFOwogCkBAIC0yMTksOCArMjE5LDYgQEAKIAkJCQkgICAgICAgIHBSZWN0VXBkYXRlLT5yaWdodCxwUmVjdFVwZGF0ZS0+Ym90dG9tKTsKIAlpZiggZGVidWdnaW5nX2RjICkgRENFX0R1bXBDYWNoZSgpOwogCi0JaWYoICFPcHRpb25zLmRlc2t0b3BHZW9tZXRyeSAmJiB3bmRTY29wZSA9PSBXSU5fR2V0RGVza3RvcCgpICkgcmV0dXJuIFRSVUU7Ci0KICAJLyogd2FsayBhbGwgRENFcyBhbmQgZml4dXAgbm9uLWVtcHR5IGVudHJpZXMgKi8KIAogCWZvciAoZGNlID0gZmlyc3REQ0U7IChkY2UpOyBkY2UgPSBkY2UtPm5leHQpCkBAIC0yMzQsOCArMjMyLDcgQEAKIAkJICAgIFdORCogd25kID0gd25kQ3VycmVudDsKIAkJICAgIElOVDMyIHhvZmZzZXQgPSAwLCB5b2Zmc2V0ID0gMDsKIAotCQkgICAgaWYoICh3bmRDdXJyZW50ID09IHduZFNjb3BlKSAmJiAhKGRjZS0+RENYZmxhZ3MgJiBEQ1hfQ0xJUENISUxEUkVOKSApCi0JCQljb250aW51ZTsKKwkJICAgIGlmKCAod25kQ3VycmVudCA9PSB3bmRTY29wZSkgJiYgIShkY2UtPkRDWGZsYWdzICYgRENYX0NMSVBDSElMRFJFTikgKSBjb250aW51ZTsKIAogCQkgICAgLyogY2hlY2sgaWYgRENFIHdpbmRvdyBpcyB3aXRoaW4gdGhlIHotb3JkZXIgc2NvcGUgKi8KIApAQCAtMjg4LDcgKzI4NSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBEQ0VfSW5pdAogICovCi12b2lkIERDRV9Jbml0KCkKK3ZvaWQgRENFX0luaXQodm9pZCkKIHsKICAgICBpbnQgaTsKICAgICBEQ0UgKiBkY2U7CkBAIC00NDgsMTMgKzQ0NSwyMCBAQAogCQkgICAgRENFX0FkZENsaXBSZWN0cyggd25kUHRyLT5wYXJlbnQtPmNoaWxkLAogCQkJCSAgICAgIHduZFB0ciwgaHJnbkNsaXAsICZyZWN0LCB4b2Zmc2V0LCB5b2Zmc2V0ICk7CiAKKwkJLyogQ2xpcCBzaWJsaW5ncyBvZiBhbGwgYW5jZXN0b3JzIHRoYXQgaGF2ZSB0aGUKKyAgICAgICAgICAgICAgICAgKiBXU19DTElQU0lCTElOR1Mgc3R5bGUKKwkJICovCisKIAkJd2hpbGUgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKQogCQl7CiAJCSAgICB3bmRQdHIgPSB3bmRQdHItPnBhcmVudDsKIAkJICAgIHhvZmZzZXQgLT0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQ7CiAJCSAgICB5b2Zmc2V0IC09IHduZFB0ci0+cmVjdENsaWVudC50b3A7Ci0JCSAgICBEQ0VfQWRkQ2xpcFJlY3RzKCB3bmRQdHItPnBhcmVudC0+Y2hpbGQsIHduZFB0ciwKLQkJCQkJaHJnbkNsaXAsICZyZWN0LCB4b2Zmc2V0LCB5b2Zmc2V0ICk7CisJCSAgICBpZih3bmRQdHItPmR3U3R5bGUgJiBXU19DTElQU0lCTElOR1MgJiYgd25kUHRyLT5wYXJlbnQpCisJCSAgICB7CisJCQlEQ0VfQWRkQ2xpcFJlY3RzKCB3bmRQdHItPnBhcmVudC0+Y2hpbGQsIHduZFB0ciwKKwkJCQkJICBocmduQ2xpcCwgJnJlY3QsIHhvZmZzZXQsIHlvZmZzZXQgKTsKKwkJICAgIH0KIAkJfQogCiAJCS8qIE5vdyBvbmNlIHdlJ3ZlIGdvdCBhIGp1bWJvIGNsaXAgcmVnaW9uIHdlIGhhdmUKQEAgLTY2NSwxMyArNjY5LDkgQEAKIAkJICAgKChkY2UtPkRDWGZsYWdzICYgKERDWF9DTElQU0lCTElOR1MgfCBEQ1hfQ0xJUENISUxEUkVOIHwKIAkJCQkgICAgICBEQ1hfQ0FDSEUgfCBEQ1hfV0lORE9XIHwgRENYX1BBUkVOVENMSVApKSA9PSBkY3hGbGFncykpCiAJCXsKLQkJICAgIGRwcmludGZfZGMoc3RkZGViLCJcdGZvdW5kIHZhbGlkICUwOHggZGNlIFslMDR4XVxuIiwgKHVuc2lnbmVkKWRjZSwgaHduZCApOwotCi0vKiBFdmVudHVhbGx5LCB0aGlzIHdvbid0IGJlIGNvbW1lbnRlZCBvdXQgYnV0IGF0IHRoaXMgdGltZQotICogdGhlcmUgYXJlIHN0aWxsIHNvbWUgcHJvYmxlbXMgd2l0aCBEQyByZXVzZS4KLSAqIAotCQkgICAgYlVwZGF0ZVZpc1JnbiA9IFRSVUU7IAotICovCisJCSAgICBkcHJpbnRmX2RjKHN0ZGRlYiwiXHRmb3VuZCB2YWxpZCAlMDh4IGRjZSBbJTA0eF0sIGZsYWdzICUwOHhcbiIsIAorCQkJCQkodW5zaWduZWQpZGNlLCBod25kLCAodW5zaWduZWQpZGN4RmxhZ3MgKTsKKwkJICAgIGJVcGRhdGVWaXNSZ24gPSBGQUxTRTsgCiAJCSAgICBiVXBkYXRlQ2xpcE9yaWdpbiA9IFRSVUU7CiAJCSAgICBicmVhazsKIAkJfQpAQCAtNzE4LDcgKzcxOCw3IEBACiAgICAgRENFX1NldERyYXdhYmxlKCB3bmRQdHIsIGRjLCBmbGFncywgYlVwZGF0ZUNsaXBPcmlnaW4gKTsKICAgICBpZiggYlVwZGF0ZVZpc1JnbiApCiAgICAgewotCWRwcmludGZfZGMoc3RkZGViLCJ1cGRhdGluZyAlMDh4IGRjZSwgdmlzcmduIFslMDR4XVxuIiwgKHVuc2lnbmVkKWRjZSwgaHduZCk7CisJZHByaW50Zl9kYyhzdGRkZWIsInVwZGF0aW5nIHZpc3JnbiBmb3IgJTA4eCBkY2UsIGh3bmQgWyUwNHhdXG4iLCAodW5zaWduZWQpZGNlLCBod25kKTsKIAogCWlmIChmbGFncyAmIERDWF9QQVJFTlRDTElQKQogICAgICAgICB7CkBAIC03NzIsNiArNzcyLDggQEAKIAlkYy0+dy5mbGFncyAmPSB+RENfRElSVFk7CiAJU2VsZWN0VmlzUmduKCBoZGMsIGhyZ25WaXNpYmxlICk7CiAgICAgfQorICAgIGVsc2UKKwlkcHJpbnRmX2RjKHN0ZGRlYiwibm8gdmlzcmduIHVwZGF0ZSAlMDh4IGRjZSwgaHduZCBbJTA0eF1cbiIsICh1bnNpZ25lZClkY2UsIGh3bmQpOwogCiAgICAgLyogYXBwbHkgYWRkaXRpb25hbCByZWdpb24gb3BlcmF0aW9uIChpZiBhbnkpICovCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmZGxnLmMgYi93aW5kb3dzL2RlZmRsZy5jCmluZGV4IDEyODVkNzMuLjM2YzE0NmEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmZGxnLmMKKysrIGIvd2luZG93cy9kZWZkbGcuYwpAQCAtNTQsNyArNTQsOCBAQAogICAgIGlmICghaW5mb1B0ci0+aHduZEZvY3VzIHx8IElzSWNvbmljMzIoaHduZCkpIHJldHVybiBGQUxTRTsKICAgICBpZiAoIUlzV2luZG93MzIoIGluZm9QdHItPmh3bmRGb2N1cyApKSByZXR1cm4gRkFMU0U7CiAgICAgREVGRExHX1NldEZvY3VzKCBod25kLCBpbmZvUHRyLT5od25kRm9jdXMgKTsKLSAgICBpbmZvUHRyLT5od25kRm9jdXMgPSAwOworICAgIC8qIFRoaXMgdXNlZCB0byBzZXQgaW5mb1B0ci0+aHduZEZvY3VzIHRvIE5VTEwgZm9yIG5vIGFwcGFyZW50IHJlYXNvbiwKKyAgICAgICBzb21ldGltZXMgbG9zaW5nIGZvY3VzIHdoZW4gcmVjZWl2aW5nIFdNX1NFVEZPQ1VTIG1lc3NhZ2VzLiAqLwogICAgIHJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS93aW5kb3dzL2RlZnduZC5jIGIvd2luZG93cy9kZWZ3bmQuYwppbmRleCA4YTJhN2IzLi44MGE4ZDkyIDEwMDY0NAotLS0gYS93aW5kb3dzL2RlZnduZC5jCisrKyBiL3dpbmRvd3MvZGVmd25kLmMKQEAgLTcxLDYgKzcxLDI1IEBACiAgICAgfQogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBERUZXTkRfQ29udHJvbENvbG9yCisgKgorICogRGVmYXVsdCBjb2xvcnMgZm9yIGNvbnRyb2wgcGFpbnRpbmcuCisgKi8KK0hCUlVTSDMyIERFRldORF9Db250cm9sQ29sb3IoIEhEQzMyIGhEQywgVUlOVDE2IGN0bFR5cGUgKQoreworICAgIGlmKCBjdGxUeXBlID09IENUTENPTE9SX1NDUk9MTEJBUikKKyAgICB7CisJU2V0QmtDb2xvcjMyKCBoREMsIFJHQigyNTUsIDI1NSwgMjU1KSApOworCVNldFRleHRDb2xvcjMyKCBoREMsIFJHQigwLCAwLCAwKSApOworCVVucmVhbGl6ZU9iamVjdDMyKCBzeXNDb2xvck9iamVjdHMuaGJydXNoU2Nyb2xsYmFyICk7CisgICAgICAgIHJldHVybiBzeXNDb2xvck9iamVjdHMuaGJydXNoU2Nyb2xsYmFyOworICAgIH0KKworICAgIFNldEJrQ29sb3IzMiggaERDLCBHZXRTeXNDb2xvcjMyKENPTE9SX1dJTkRPVykgKTsKKyAgICBTZXRUZXh0Q29sb3IzMiggaERDLCBHZXRTeXNDb2xvcjMyKENPTE9SX1dJTkRPV1RFWFQpKTsKKyAgICByZXR1cm4gc3lzQ29sb3JPYmplY3RzLmhicnVzaFdpbmRvdzsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgREVGV05EX0RlZldpblByb2MKQEAgLTg5LDcgKzEwOCw3IEBACiAgICAgICAgIHJldHVybiBOQ19IYW5kbGVOQ0hpdFRlc3QoIHduZFB0ci0+aHduZFNlbGYsIE1BS0VQT0lOVDE2KGxQYXJhbSkgKTsKIAogICAgIGNhc2UgV01fTkNMQlVUVE9ORE9XTjoKLQlyZXR1cm4gTkNfSGFuZGxlTkNMQnV0dG9uRG93biggd25kUHRyLT5od25kU2VsZiwgd1BhcmFtLCBsUGFyYW0gKTsKKwlyZXR1cm4gTkNfSGFuZGxlTkNMQnV0dG9uRG93biggd25kUHRyLCB3UGFyYW0sIGxQYXJhbSApOwogCiAgICAgY2FzZSBXTV9MQlVUVE9OREJMQ0xLOgogICAgIGNhc2UgV01fTkNMQlVUVE9OREJMQ0xLOgpAQCAtMjA2LDMyICsyMjUsMTEgQEAKICAgICBjYXNlIFdNX0NUTENPTE9SQlROOgogICAgIGNhc2UgV01fQ1RMQ09MT1JETEc6CiAgICAgY2FzZSBXTV9DVExDT0xPUlNUQVRJQzoKLSAgICAgICAgU2V0QmtDb2xvcjMyKCAoSERDMzIpd1BhcmFtLCBHZXRTeXNDb2xvcjMyKENPTE9SX1dJTkRPVykgKTsKLSAgICAgICAgU2V0VGV4dENvbG9yMzIoIChIREMzMil3UGFyYW0sIEdldFN5c0NvbG9yMzIoQ09MT1JfV0lORE9XVEVYVCkgKTsKLSAgICAgICAgcmV0dXJuIChMUkVTVUxUKXN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hXaW5kb3c7Ci0KICAgICBjYXNlIFdNX0NUTENPTE9SU0NST0xMQkFSOgotICAgICAgICBTZXRCa0NvbG9yMzIoIChIREMzMil3UGFyYW0sIFJHQigyNTUsIDI1NSwgMjU1KSApOwotICAgICAgICBTZXRUZXh0Q29sb3IzMiggKEhEQzMyKXdQYXJhbSwgUkdCKDAsIDAsIDApICk7Ci0gICAgICAgIFVucmVhbGl6ZU9iamVjdDMyKCBzeXNDb2xvck9iamVjdHMuaGJydXNoU2Nyb2xsYmFyICk7Ci0gICAgICAgIHJldHVybiAoTFJFU1VMVClzeXNDb2xvck9iamVjdHMuaGJydXNoU2Nyb2xsYmFyOworCXJldHVybiAoTFJFU1VMVClERUZXTkRfQ29udHJvbENvbG9yKCAoSERDMzIpd1BhcmFtLCBtc2cgLSBXTV9DVExDT0xPUk1TR0JPWCApOwogCiAgICAgY2FzZSBXTV9DVExDT0xPUjoKLQl7Ci0JICAgIGlmIChISVdPUkQobFBhcmFtKSA9PSBDVExDT0xPUl9TQ1JPTExCQVIpCi0JICAgIHsKLQkJU2V0QmtDb2xvcjMyKCAoSERDMzIpd1BhcmFtLCBSR0IoMjU1LCAyNTUsIDI1NSkgKTsKLQkJU2V0VGV4dENvbG9yMzIoIChIREMzMil3UGFyYW0sIFJHQigwLCAwLCAwKSApOwotCQlVbnJlYWxpemVPYmplY3QzMiggc3lzQ29sb3JPYmplY3RzLmhicnVzaFNjcm9sbGJhciApOwotCQlyZXR1cm4gKExSRVNVTFQpc3lzQ29sb3JPYmplY3RzLmhicnVzaFNjcm9sbGJhcjsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJU2V0QmtDb2xvcjMyKCAoSERDMzIpd1BhcmFtLCBHZXRTeXNDb2xvcjMyKENPTE9SX1dJTkRPVykgKTsKLQkJU2V0VGV4dENvbG9yMzIoKEhEQzMyKXdQYXJhbSwgR2V0U3lzQ29sb3IzMihDT0xPUl9XSU5ET1dURVhUKSk7Ci0JCXJldHVybiAoTFJFU1VMVClzeXNDb2xvck9iamVjdHMuaGJydXNoV2luZG93OwotCSAgICB9Ci0JfQorCXJldHVybiAoTFJFU1VMVClERUZXTkRfQ29udHJvbENvbG9yKCAoSERDMzIpd1BhcmFtLCBISVdPUkQobFBhcmFtKSApOwogCQogICAgIGNhc2UgV01fR0VUVEVYVExFTkdUSDoKICAgICAgICAgaWYgKHduZFB0ci0+dGV4dCkgcmV0dXJuIChMUkVTVUxUKXN0cmxlbih3bmRQdHItPnRleHQpOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9ldmVudC5jIGIvd2luZG93cy9ldmVudC5jCmluZGV4IGI1NDc2OWEuLjY5YzQwZWMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZXZlbnQuYworKysgYi93aW5kb3dzL2V2ZW50LmMKQEAgLTUsNiArNSw3IEBACiAgKiAKICAqLwogCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtMjcsNiArMjgsNyBAQAogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgImNsYXNzLmgiCiAjaW5jbHVkZSAiY2xpcGJvYXJkLmgiCisjaW5jbHVkZSAiZGNlLmgiCiAjaW5jbHVkZSAibWVzc2FnZS5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKQEAgLTg2LDcgKzg4LDcgQEAKIH07CiAKICAgLyogRXZlbnQgaGFuZGxlcnMgKi8KLXN0YXRpYyB2b2lkIEVWRU5UX0tleSggWEtleUV2ZW50ICpldmVudCApOworc3RhdGljIHZvaWQgRVZFTlRfS2V5KCBXTkQgKnBXbmQsIFhLZXlFdmVudCAqZXZlbnQgKTsKIHN0YXRpYyB2b2lkIEVWRU5UX0J1dHRvblByZXNzKCBXTkQgKnBXbmQsIFhCdXR0b25FdmVudCAqZXZlbnQgKTsKIHN0YXRpYyB2b2lkIEVWRU5UX0J1dHRvblJlbGVhc2UoIFdORCAqcFduZCwgWEJ1dHRvbkV2ZW50ICpldmVudCApOwogc3RhdGljIHZvaWQgRVZFTlRfTW90aW9uTm90aWZ5KCBXTkQgKnBXbmQsIFhNb3Rpb25FdmVudCAqZXZlbnQgKTsKQEAgLTk0LDcgKzk2LDcgQEAKIHN0YXRpYyB2b2lkIEVWRU5UX0ZvY3VzT3V0KCBXTkQgKnBXbmQsIFhGb2N1c0NoYW5nZUV2ZW50ICpldmVudCApOwogc3RhdGljIHZvaWQgRVZFTlRfRXhwb3NlKCBXTkQgKnBXbmQsIFhFeHBvc2VFdmVudCAqZXZlbnQgKTsKIHN0YXRpYyB2b2lkIEVWRU5UX0dyYXBoaWNzRXhwb3NlKCBXTkQgKnBXbmQsIFhHcmFwaGljc0V4cG9zZUV2ZW50ICpldmVudCApOwotc3RhdGljIHZvaWQgRVZFTlRfQ29uZmlndXJlTm90aWZ5KCBIV05EMzIgaHduZCwgWENvbmZpZ3VyZUV2ZW50ICpldmVudCApOworc3RhdGljIHZvaWQgRVZFTlRfQ29uZmlndXJlTm90aWZ5KCBXTkQgKnBXbmQsIFhDb25maWd1cmVFdmVudCAqZXZlbnQgKTsKIHN0YXRpYyB2b2lkIEVWRU5UX1NlbGVjdGlvblJlcXVlc3QoIFdORCAqcFduZCwgWFNlbGVjdGlvblJlcXVlc3RFdmVudCAqZXZlbnQpOwogc3RhdGljIHZvaWQgRVZFTlRfU2VsZWN0aW9uTm90aWZ5KCBYU2VsZWN0aW9uRXZlbnQgKmV2ZW50KTsKIHN0YXRpYyB2b2lkIEVWRU5UX1NlbGVjdGlvbkNsZWFyKCBXTkQgKnBXbmQsIFhTZWxlY3Rpb25DbGVhckV2ZW50ICpldmVudCk7CkBAIC0xNjAsOCArMTYyLDcgQEAKICAgICB7CiAgICAgY2FzZSBLZXlQcmVzczoKICAgICBjYXNlIEtleVJlbGVhc2U6Ci0gICAgICAgIGlmIChJbnB1dEVuYWJsZWQpCi0gICAgICAgICAgICBFVkVOVF9LZXkoIChYS2V5RXZlbnQqKWV2ZW50ICk7CisgICAgICAgIGlmIChJbnB1dEVuYWJsZWQpIEVWRU5UX0tleSggcFduZCwgKFhLZXlFdmVudCopZXZlbnQgKTsKIAlicmVhazsKIAkKICAgICBjYXNlIEJ1dHRvblByZXNzOgpAQCAtMjA4LDcgKzIwOSw3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBDb25maWd1cmVOb3RpZnk6Ci0JRVZFTlRfQ29uZmlndXJlTm90aWZ5KCBwV25kLT5od25kU2VsZiwgKFhDb25maWd1cmVFdmVudCopZXZlbnQgKTsKKwlFVkVOVF9Db25maWd1cmVOb3RpZnkoIHBXbmQsIChYQ29uZmlndXJlRXZlbnQqKWV2ZW50ICk7CiAJYnJlYWs7CiAKICAgICBjYXNlIFNlbGVjdGlvblJlcXVlc3Q6CkBAIC00MTQsNiArNDE1LDcgQEAKIAkgIH0KIAogCSAgaWYoIHBXbmQgKQorICAgICAgICAgIHsKICAgICAgICAgICAgIGlmKCAocFEgPSAoTUVTU0FHRVFVRVVFKilHbG9iYWxMb2NrMTYocFduZC0+aG1lbVRhc2tRKSkgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICBwUS0+ZmxhZ3MgfD0gUVVFVUVfRkxBR19YRVZFTlQ7CkBAIC00MjEsOSArNDIzLDkgQEAKIAkgICAgICBYUHV0QmFja0V2ZW50KGRpc3BsYXksICZldmVudCk7CiAgICAgICAgICAgICAgIGJyZWFrOwogCSAgICB9CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBFVkVOVF9Qcm9jZXNzRXZlbnQoICZldmVudCApOworICAgICAgICBlbHNlIEVWRU5UX1Byb2Nlc3NFdmVudCggJmV2ZW50ICk7CiAgICAgfQogICAgIHdoaWxlIChYUGVuZGluZyggZGlzcGxheSApKTsKICAgICByZXR1cm4gVFJVRTsKQEAgLTYxNSw5ICs2MTcsOSBAQAogICoKICAqIEhhbmRsZSBhIFgga2V5IGV2ZW50CiAgKi8KLXN0YXRpYyB2b2lkIEVWRU5UX0tleSggWEtleUV2ZW50ICpldmVudCApCitzdGF0aWMgdm9pZCBFVkVOVF9LZXkoIFdORCAqcFduZCwgWEtleUV2ZW50ICpldmVudCApCiB7Ci0gICAgS0VZQk9BUkRfSGFuZGxlRXZlbnQoIGV2ZW50ICk7CisgICAgS0VZQk9BUkRfSGFuZGxlRXZlbnQoIHBXbmQsIGV2ZW50ICk7CiB9CiAKIApAQCAtNjI3LDggKzYyOSw5IEBACiBzdGF0aWMgdm9pZCBFVkVOVF9Nb3Rpb25Ob3RpZnkoIFdORCAqcFduZCwgWE1vdGlvbkV2ZW50ICpldmVudCApCiB7CiAgICAgaGFyZHdhcmVfZXZlbnQoIFdNX01PVVNFTU9WRSwgRVZFTlRfWFN0YXRlVG9LZXlTdGF0ZSggZXZlbnQtPnN0YXRlICksIDBMLAotCQkgICAgZXZlbnQtPnhfcm9vdCAtIGRlc2t0b3BYLCBldmVudC0+eV9yb290IC0gZGVza3RvcFksCi0JCSAgICBldmVudC0+dGltZSAtIE1TR19XaW5lU3RhcnRUaWNrcywgKERXT1JEKXBXbmQtPmh3bmRTZWxmICk7CisgICAgICAgICAgICAgICAgICAgIHBXbmQtPnJlY3RXaW5kb3cubGVmdCArIGV2ZW50LT54LAorICAgICAgICAgICAgICAgICAgICBwV25kLT5yZWN0V2luZG93LnRvcCArIGV2ZW50LT55LAorICAgICAgICAgICAgICAgICAgICBldmVudC0+dGltZSAtIE1TR19XaW5lU3RhcnRUaWNrcywgcFduZC0+aHduZFNlbGYgKTsKIH0KIAogCkBAIC02NDAsMTQgKzY0MywxNCBAQAogdm9pZCBFVkVOVF9EdW1teU1vdGlvbk5vdGlmeSh2b2lkKQogewogICAgIFdpbmRvdyByb290LCBjaGlsZDsKLSAgICBpbnQgcm9vdFgsIHJvb3RZLCBjaGlsZFgsIGNoaWxkWTsKKyAgICBpbnQgcm9vdFgsIHJvb3RZLCB3aW5YLCB3aW5ZOwogICAgIHVuc2lnbmVkIGludCBzdGF0ZTsKIAogICAgIGlmIChYUXVlcnlQb2ludGVyKCBkaXNwbGF5LCByb290V2luZG93LCAmcm9vdCwgJmNoaWxkLAotICAgICAgICAgICAgICAgICAgICAgICAmcm9vdFgsICZyb290WSwgJmNoaWxkWCwgJmNoaWxkWSwgJnN0YXRlICkpCisgICAgICAgICAgICAgICAgICAgICAgICZyb290WCwgJnJvb3RZLCAmd2luWCwgJndpblksICZzdGF0ZSApKQogICAgIHsKLSAgICAgICAgaGFyZHdhcmVfZXZlbnQoV01fTU9VU0VNT1ZFLCBFVkVOVF9YU3RhdGVUb0tleVN0YXRlKCBzdGF0ZSApLCAwTCwKLSAgICAgICAgICAgICAgICAgICAgICAgcm9vdFggLSBkZXNrdG9wWCwgcm9vdFkgLSBkZXNrdG9wWSwgR2V0VGlja0NvdW50KCksIDAgKTsKKyAgICAgICAgaGFyZHdhcmVfZXZlbnQoIFdNX01PVVNFTU9WRSwgRVZFTlRfWFN0YXRlVG9LZXlTdGF0ZSggc3RhdGUgKSwgMEwsCisgICAgICAgICAgICAgICAgICAgICAgICB3aW5YLCB3aW5ZLCBHZXRUaWNrQ291bnQoKSwgMCApOwogICAgIH0KIH0KIApAQCAtNjY3LDggKzY3MCw5IEBACiAgICAgQXN5bmNNb3VzZUJ1dHRvbnNTdGF0ZXNbYnV0dG9uTnVtXSA9IDB4ODAwMDsKICAgICBoYXJkd2FyZV9ldmVudCggbWVzc2FnZXNbYnV0dG9uTnVtXSwKIAkJICAgIEVWRU5UX1hTdGF0ZVRvS2V5U3RhdGUoIGV2ZW50LT5zdGF0ZSApLCAwTCwKLQkJICAgIGV2ZW50LT54X3Jvb3QgLSBkZXNrdG9wWCwgZXZlbnQtPnlfcm9vdCAtIGRlc2t0b3BZLAotCQkgICAgZXZlbnQtPnRpbWUgLSBNU0dfV2luZVN0YXJ0VGlja3MsIChEV09SRClwV25kLT5od25kU2VsZiApOworICAgICAgICAgICAgICAgICAgICBwV25kLT5yZWN0V2luZG93LmxlZnQgKyBldmVudC0+eCwKKyAgICAgICAgICAgICAgICAgICAgcFduZC0+cmVjdFdpbmRvdy50b3AgKyBldmVudC0+eSwKKwkJICAgIGV2ZW50LT50aW1lIC0gTVNHX1dpbmVTdGFydFRpY2tzLCBwV25kLT5od25kU2VsZiApOwogfQogCiAKQEAgLTY4MywxMSArNjg3LDEyIEBACiAKICAgICBpZiAoYnV0dG9uTnVtID49IE5CX0JVVFRPTlMpIHJldHVybjsgICAgCiAgICAgaWYgKFN3YXBwZWRCdXR0b25zKSBidXR0b25OdW0gPSBOQl9CVVRUT05TIC0gMSAtIGJ1dHRvbk51bTsKLSAgICBNb3VzZUJ1dHRvbnNTdGF0ZXNbYnV0dG9uTnVtXSA9IEZBTFNFOworICAgIE1vdXNlQnV0dG9uc1N0YXRlc1tidXR0b25OdW1dID0gMDsKICAgICBoYXJkd2FyZV9ldmVudCggbWVzc2FnZXNbYnV0dG9uTnVtXSwKIAkJICAgIEVWRU5UX1hTdGF0ZVRvS2V5U3RhdGUoIGV2ZW50LT5zdGF0ZSApLCAwTCwKLQkJICAgIGV2ZW50LT54X3Jvb3QgLSBkZXNrdG9wWCwgZXZlbnQtPnlfcm9vdCAtIGRlc2t0b3BZLAotCQkgICAgZXZlbnQtPnRpbWUgLSBNU0dfV2luZVN0YXJ0VGlja3MsIChEV09SRClwV25kLT5od25kU2VsZiApOworICAgICAgICAgICAgICAgICAgICBwV25kLT5yZWN0V2luZG93LmxlZnQgKyBldmVudC0+eCwKKyAgICAgICAgICAgICAgICAgICAgcFduZC0+cmVjdFdpbmRvdy50b3AgKyBldmVudC0+eSwKKwkJICAgIGV2ZW50LT50aW1lIC0gTVNHX1dpbmVTdGFydFRpY2tzLCBwV25kLT5od25kU2VsZiApOwogfQogCiAKQEAgLTc0NCw4MyArNzQ5LDExOCBAQAogICAgIHJldHVybiBUUlVFOwogfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgRVZFTlRfR2V0R2VvbWV0cnkKKyAqCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIENvbmZpZ3VyZU5vdGlmeSBoYW5kbGluZy4KKyAqIEdldCB0aGUgbmV3IGdlb21ldHJ5IG9mIGEgd2luZG93IHJlbGF0aXZlIHRvIHRoZSByb290IHdpbmRvdy4KKyAqLworc3RhdGljIHZvaWQgRVZFTlRfR2V0R2VvbWV0cnkoIFdpbmRvdyB3aW4sIGludCAqcHgsIGludCAqcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpwd2lkdGgsIHVuc2lnbmVkIGludCAqcGhlaWdodCApCit7CisgICAgV2luZG93IHJvb3QsIHBhcmVudCwgKmNoaWxkcmVuOworICAgIGludCB4cG9zLCB5cG9zOworICAgIHVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIsIGRlcHRoLCBuYl9jaGlsZHJlbjsKKworICAgIGlmICghWEdldEdlb21ldHJ5KCBkaXNwbGF5LCB3aW4sICZyb290LCBweCwgcHksIHB3aWR0aCwgcGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmJvcmRlciwgJmRlcHRoICkpIHJldHVybjsKKyAgICBpZiAod2luID09IHJvb3RXaW5kb3cpCisgICAgeworICAgICAgICAqcHggPSAqcHkgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yICg7OykKKyAgICB7CisgICAgICAgIGlmICghWFF1ZXJ5VHJlZShkaXNwbGF5LCB3aW4sICZyb290LCAmcGFyZW50LCAmY2hpbGRyZW4sICZuYl9jaGlsZHJlbikpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFhGcmVlKCBjaGlsZHJlbiApOworICAgICAgICBpZiAocGFyZW50ID09IHJvb3RXaW5kb3cpIGJyZWFrOworICAgICAgICB3aW4gPSBwYXJlbnQ7CisgICAgICAgIGlmICghWEdldEdlb21ldHJ5KCBkaXNwbGF5LCB3aW4sICZyb290LCAmeHBvcywgJnlwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsICZoZWlnaHQsICZib3JkZXIsICZkZXB0aCApKSByZXR1cm47CisgICAgICAgICpweCArPSB4cG9zOworICAgICAgICAqcHkgKz0geXBvczsKKyAgICB9Cit9CisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICBFVkVOVF9Db25maWd1cmVOb3RpZnkKICAqCi0gKiBUaGUgQ29uZmlndXJlTm90aWZ5IGV2ZW50IGlzIG9ubHkgc2VsZWN0ZWQgb24gdGhlIGRlc2t0b3Agd2luZG93Ci0gKiBhbmQgb24gdG9wLWxldmVsIHdpbmRvd3Mgd2hlbiB0aGUgLW1hbmFnZWQgZmxhZyBpcyB1c2VkLgorICogVGhlIENvbmZpZ3VyZU5vdGlmeSBldmVudCBpcyBvbmx5IHNlbGVjdGVkIG9uIHRvcC1sZXZlbCB3aW5kb3dzCisgKiB3aGVuIHRoZSAtbWFuYWdlZCBmbGFnIGlzIHVzZWQuCiAgKi8KLXN0YXRpYyB2b2lkIEVWRU5UX0NvbmZpZ3VyZU5vdGlmeSggSFdORDMyIGh3bmQsIFhDb25maWd1cmVFdmVudCAqZXZlbnQgKQorc3RhdGljIHZvaWQgRVZFTlRfQ29uZmlndXJlTm90aWZ5KCBXTkQgKnBXbmQsIFhDb25maWd1cmVFdmVudCAqZXZlbnQgKQogewotICAgIC8qIEZJWE1FOiB3aXRoIC1kZXNrdG9wIHh4eCB3ZSBnZXQgdGhpcyBldmVudCBfYmVmb3JlXyBkZXNrdG9wIAotICAgICAqIHdpbmRvdyBzdHJ1Y3R1cmUgaXMgY3JlYXRlZC4gV0lOX0dldERlc2t0b3AoKSBjaGVjayBpcyBhIGhhY2suCi0gICAgICovCisgICAgV0lORE9XUE9TMzIgd2lucG9zOworICAgIFJFQ1QzMiBuZXdXaW5kb3dSZWN0LCBuZXdDbGllbnRSZWN0OworICAgIEhSR04zMiBocmduT2xkUG9zLCBocmduTmV3UG9zOworICAgIFdpbmRvdyBhYm92ZSA9IGV2ZW50LT5hYm92ZTsKKyAgICBpbnQgeCwgeTsKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIGhlaWdodDsKIAotICAgIGlmICggIVdJTl9HZXREZXNrdG9wKCkgfHwgaHduZCA9PSBHZXREZXNrdG9wV2luZG93MzIoKSkKLSAgICB7Ci0gICAgICAgIGRlc2t0b3BYID0gZXZlbnQtPng7Ci0JZGVza3RvcFkgPSBldmVudC0+eTsKLSAgICB9CisgICAgYXNzZXJ0IChwV25kLT5mbGFncyAmIFdJTl9NQU5BR0VEKTsKKworICAgIC8qIFdlIGRvbid0IHJlbHkgb24gdGhlIGV2ZW50IGdlb21ldHJ5IGluZm8sIGJlY2F1c2UgaXQgaXMgcmVsYXRpdmUKKyAgICAgKiB0byBwYXJlbnQgYW5kIG5vdCB0byByb290LCBhbmQgaXQgbWF5IGJlIHdyb25nIChYRnJlZSBzZXRzIHgseSB0byAwLDAKKyAgICAgKiBpZiB0aGUgd2luZG93IGhhc24ndCBtb3ZlZCkuCisgICAgICovCisgICAgRVZFTlRfR2V0R2VvbWV0cnkoIGV2ZW50LT53aW5kb3csICZ4LCAmeSwgJndpZHRoLCAmaGVpZ2h0ICk7CisKKyAgICAvKiBGaWxsIFdJTkRPV1BPUyBzdHJ1Y3QgKi8KKyAgICB3aW5wb3MuZmxhZ3MgPSBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUjsKKyAgICB3aW5wb3MuaHduZCA9IHBXbmQtPmh3bmRTZWxmOworICAgIHdpbnBvcy54ID0geDsKKyAgICB3aW5wb3MueSA9IHk7CisgICAgd2lucG9zLmN4ID0gd2lkdGg7CisgICAgd2lucG9zLmN5ID0gaGVpZ2h0OworCisgICAgLyogQ2hlY2sgZm9yIHVuY2hhbmdlZCBhdHRyaWJ1dGVzICovCisgICAgaWYgKHdpbnBvcy54ID09IHBXbmQtPnJlY3RXaW5kb3cubGVmdCAmJiB3aW5wb3MueSA9PSBwV25kLT5yZWN0V2luZG93LnRvcCkKKyAgICAgICAgd2lucG9zLmZsYWdzIHw9IFNXUF9OT01PVkU7CisgICAgaWYgKCh3aW5wb3MuY3ggPT0gcFduZC0+cmVjdFdpbmRvdy5yaWdodCAtIHBXbmQtPnJlY3RXaW5kb3cubGVmdCkgJiYKKyAgICAgICAgKHdpbnBvcy5jeSA9PSBwV25kLT5yZWN0V2luZG93LmJvdHRvbSAtIHBXbmQtPnJlY3RXaW5kb3cudG9wKSkKKyAgICAgICAgd2lucG9zLmZsYWdzIHw9IFNXUF9OT1NJWkU7CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwotCVdJTkRPV1BPUzMyIHdpbnBvczsKLQlSRUNUMzIgbmV3V2luZG93UmVjdCwgbmV3Q2xpZW50UmVjdDsKLQlIUkdOMzIgaHJnbk9sZFBvcywgaHJnbk5ld1BvczsKLQlXaW5kb3cgYWJvdmUgPSBldmVudC0+YWJvdmU7Ci0KLQlpZiAoIXduZFB0ciB8fCAhKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTUFOQUdFRCkpIHJldHVybjsKLQotCS8qIEZpbGwgV0lORE9XUE9TIHN0cnVjdCAqLwotCXdpbnBvcy5mbGFncyA9IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSOwotCXdpbnBvcy5od25kID0gaHduZDsKLSAgICAgICAgLyogRklYTUU6IHBvc2l0aW9uIHNob3VsZCBiZSByZWxhdGl2ZSB0byByb290IHdpbmRvdyAqLwotCXdpbnBvcy54ID0gZXZlbnQtPng7Ci0Jd2lucG9zLnkgPSBldmVudC0+eTsKLQl3aW5wb3MuY3ggPSBldmVudC0+d2lkdGg7Ci0Jd2lucG9zLmN5ID0gZXZlbnQtPmhlaWdodDsKLQotCS8qIENoZWNrIGZvciB1bmNoYW5nZWQgYXR0cmlidXRlcyAqLwotCWlmKHdpbnBvcy54ID09IHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0ICYmCi0JICAgd2lucG9zLnkgPT0gd25kUHRyLT5yZWN0V2luZG93LnRvcCkKLQkgICAgd2lucG9zLmZsYWdzIHw9IFNXUF9OT01PVkU7Ci0JaWYod2lucG9zLmN4ID09IHduZFB0ci0+cmVjdFdpbmRvdy5yaWdodCAtIHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0ICYmCi0JICAgd2lucG9zLmN5ID09IHduZFB0ci0+cmVjdFdpbmRvdy5ib3R0b20gLSB3bmRQdHItPnJlY3RXaW5kb3cudG9wKQotCSAgICB3aW5wb3MuZmxhZ3MgfD0gU1dQX05PU0laRTsKLQotCS8qIFNlbmQgV01fV0lORE9XUE9TQ0hBTkdJTkcgKi8KLQlTZW5kTWVzc2FnZTMyQSggaHduZCwgV01fV0lORE9XUE9TQ0hBTkdJTkcsIDAsIChMUEFSQU0pJndpbnBvcyApOwotCi0JLyogQ2FsY3VsYXRlIG5ldyBwb3NpdGlvbiBhbmQgc2l6ZSAqLwotCW5ld1dpbmRvd1JlY3QubGVmdCA9IGV2ZW50LT54OwotCW5ld1dpbmRvd1JlY3QucmlnaHQgPSBldmVudC0+eCArIGV2ZW50LT53aWR0aDsKLQluZXdXaW5kb3dSZWN0LnRvcCA9IGV2ZW50LT55OwotCW5ld1dpbmRvd1JlY3QuYm90dG9tID0gZXZlbnQtPnkgKyBldmVudC0+aGVpZ2h0OwotCi0JV0lOUE9TX1NlbmROQ0NhbGNTaXplKCB3aW5wb3MuaHduZCwgVFJVRSwgJm5ld1dpbmRvd1JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnduZFB0ci0+cmVjdFdpbmRvdywgJnduZFB0ci0+cmVjdENsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lucG9zLCAmbmV3Q2xpZW50UmVjdCApOwotCi0gICAgICAgIGhyZ25PbGRQb3MgPSBDcmVhdGVSZWN0UmduSW5kaXJlY3QzMiggJnduZFB0ci0+cmVjdFdpbmRvdyApOwotICAgICAgICBocmduTmV3UG9zID0gQ3JlYXRlUmVjdFJnbkluZGlyZWN0MzIoICZuZXdXaW5kb3dSZWN0ICk7Ci0gICAgICAgIENvbWJpbmVSZ24zMiggaHJnbk9sZFBvcywgaHJnbk9sZFBvcywgaHJnbk5ld1BvcywgUkdOX0RJRkYgKTsKLSAKLQkvKiBTZXQgbmV3IHNpemUgYW5kIHBvc2l0aW9uICovCi0Jd25kUHRyLT5yZWN0V2luZG93ID0gbmV3V2luZG93UmVjdDsKLQl3bmRQdHItPnJlY3RDbGllbnQgPSBuZXdDbGllbnRSZWN0OwotCVNlbmRNZXNzYWdlMzJBKCBod25kLCBXTV9XSU5ET1dQT1NDSEFOR0VELCAwLCAoTFBBUkFNKSZ3aW5wb3MgKTsKLQotCWlmKCBJc1dpbmRvdzMyKCBod25kICkgKQotCSAgICBpZiggYWJvdmUgPT0gTm9uZSApCQkJLyogYWJzb2x1dGUgYm90dG9tICovCi0JICAgIHsKLSAgICAgICAgCVdJTl9VbmxpbmtXaW5kb3coIGh3bmQgKTsKLSAgICAgICAgCVdJTl9MaW5rV2luZG93KCBod25kLCBIV05EX0JPVFRPTSk7Ci0JICAgIH0KLQkgICAgZWxzZSBFVkVOVF9RdWVyeVpPcmRlciggd25kUHRyICk7CS8qIHRyeSB0byBvdXRzbWFydCB3aW5kb3cgbWFuYWdlciAqLwotCi0gICAgICAgIERlbGV0ZU9iamVjdDMyKGhyZ25PbGRQb3MpOwotICAgICAgICBEZWxldGVPYmplY3QzMihocmduTmV3UG9zKTsKKyAgICAgICAgUkVDVDMyIHJlY3QgPSB7IDAsIDAsIHBXbmQtPnJlY3RXaW5kb3cucmlnaHQgLSBwV25kLT5yZWN0V2luZG93LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBwV25kLT5yZWN0V2luZG93LmJvdHRvbSAtIHBXbmQtPnJlY3RXaW5kb3cudG9wIH07CisgICAgICAgIERDRV9JbnZhbGlkYXRlRENFKCBwV25kLCAmcmVjdCApOwogICAgIH0KKworICAgIC8qIFNlbmQgV01fV0lORE9XUE9TQ0hBTkdJTkcgKi8KKyAgICBTZW5kTWVzc2FnZTMyQSggd2lucG9zLmh3bmQsIFdNX1dJTkRPV1BPU0NIQU5HSU5HLCAwLCAoTFBBUkFNKSZ3aW5wb3MgKTsKKworICAgIC8qIENhbGN1bGF0ZSBuZXcgcG9zaXRpb24gYW5kIHNpemUgKi8KKyAgICBuZXdXaW5kb3dSZWN0LmxlZnQgPSB4OworICAgIG5ld1dpbmRvd1JlY3QucmlnaHQgPSB4ICsgd2lkdGg7CisgICAgbmV3V2luZG93UmVjdC50b3AgPSB5OworICAgIG5ld1dpbmRvd1JlY3QuYm90dG9tID0geSArIGhlaWdodDsKKworICAgIFdJTlBPU19TZW5kTkNDYWxjU2l6ZSggd2lucG9zLmh3bmQsIFRSVUUsICZuZXdXaW5kb3dSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBXbmQtPnJlY3RXaW5kb3csICZwV25kLT5yZWN0Q2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpbnBvcywgJm5ld0NsaWVudFJlY3QgKTsKKworICAgIGhyZ25PbGRQb3MgPSBDcmVhdGVSZWN0UmduSW5kaXJlY3QzMiggJnBXbmQtPnJlY3RXaW5kb3cgKTsKKyAgICBocmduTmV3UG9zID0gQ3JlYXRlUmVjdFJnbkluZGlyZWN0MzIoICZuZXdXaW5kb3dSZWN0ICk7CisgICAgQ29tYmluZVJnbjMyKCBocmduT2xkUG9zLCBocmduT2xkUG9zLCBocmduTmV3UG9zLCBSR05fRElGRiApOworICAgIERlbGV0ZU9iamVjdDMyKGhyZ25PbGRQb3MpOworICAgIERlbGV0ZU9iamVjdDMyKGhyZ25OZXdQb3MpOworIAorICAgIC8qIFNldCBuZXcgc2l6ZSBhbmQgcG9zaXRpb24gKi8KKyAgICBwV25kLT5yZWN0V2luZG93ID0gbmV3V2luZG93UmVjdDsKKyAgICBwV25kLT5yZWN0Q2xpZW50ID0gbmV3Q2xpZW50UmVjdDsKKyAgICBTZW5kTWVzc2FnZTMyQSggd2lucG9zLmh3bmQsIFdNX1dJTkRPV1BPU0NIQU5HRUQsIDAsIChMUEFSQU0pJndpbnBvcyApOworCisgICAgaWYgKCFJc1dpbmRvdzMyKCB3aW5wb3MuaHduZCApKSByZXR1cm47CisgICAgaWYoIGFib3ZlID09IE5vbmUgKQkJCS8qIGFic29sdXRlIGJvdHRvbSAqLworICAgIHsKKyAgICAgICAgV0lOX1VubGlua1dpbmRvdyggd2lucG9zLmh3bmQgKTsKKyAgICAgICAgV0lOX0xpbmtXaW5kb3coIHdpbnBvcy5od25kLCBIV05EX0JPVFRPTSk7CisgICAgfQorICAgIGVsc2UgRVZFTlRfUXVlcnlaT3JkZXIoIHBXbmQgKTsJLyogdHJ5IHRvIG91dHNtYXJ0IHdpbmRvdyBtYW5hZ2VyICovCiB9CiAKIApAQCAtMTE4NSw3ICsxMjI1LDcgQEAKICAgICAgKiBTSSA9IG1vdXNlIGV2ZW50IGZsYWdzICg/KQogICAgICAqLwogICAgIFdpbmRvdyByb290LCBjaGlsZDsKLSAgICBpbnQgcm9vdFgsIHJvb3RZLCBjaGlsZFgsIGNoaWxkWTsKKyAgICBpbnQgcm9vdFgsIHJvb3RZLCB3aW5YLCB3aW5ZOwogICAgIHVuc2lnbmVkIGludCBzdGF0ZTsKIAogICAgIGlmIChBWF9yZWcoY29udGV4dCkgJiBNRV9NT1ZFKQpAQCAtMTE5NiwxOSArMTIzNiwxOSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmICghWFF1ZXJ5UG9pbnRlciggZGlzcGxheSwgcm9vdFdpbmRvdywgJnJvb3QsICZjaGlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZyb290WCwgJnJvb3RZLCAmY2hpbGRYLCAmY2hpbGRZLCAmc3RhdGUgKSkgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgJnJvb3RYLCAmcm9vdFksICZ3aW5YLCAmd2luWSwgJnN0YXRlICkpIHJldHVybjsKICAgICBpZiAoQVhfcmVnKGNvbnRleHQpICYgTUVfTERPV04pCi0gICAgICAgIGhhcmR3YXJlX2V2ZW50KCBXTV9MQlVUVE9ORE9XTiwgRVZFTlRfWFN0YXRlVG9LZXlTdGF0ZSggc3RhdGUgKSwgMEwsCi0gICAgICAgICAgICAgICAgICAgICAgICByb290WCAtIGRlc2t0b3BYLCByb290WSAtIGRlc2t0b3BZLCBHZXRUaWNrQ291bnQoKSwgMCk7CisgICAgICAgIGhhcmR3YXJlX2V2ZW50KCBXTV9MQlVUVE9ORE9XTiwgRVZFTlRfWFN0YXRlVG9LZXlTdGF0ZSggc3RhdGUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDBMLCB3aW5YLCB3aW5ZLCBHZXRUaWNrQ291bnQoKSwgMCApOwogICAgIGlmIChBWF9yZWcoY29udGV4dCkgJiBNRV9MVVApCi0gICAgICAgIGhhcmR3YXJlX2V2ZW50KCBXTV9MQlVUVE9OVVAsIEVWRU5UX1hTdGF0ZVRvS2V5U3RhdGUoIHN0YXRlICksIDBMLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFggLSBkZXNrdG9wWCwgcm9vdFkgLSBkZXNrdG9wWSwgR2V0VGlja0NvdW50KCksIDApOworICAgICAgICBoYXJkd2FyZV9ldmVudCggV01fTEJVVFRPTlVQLCBFVkVOVF9YU3RhdGVUb0tleVN0YXRlKCBzdGF0ZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgMEwsIHdpblgsIHdpblksIEdldFRpY2tDb3VudCgpLCAwICk7CiAgICAgaWYgKEFYX3JlZyhjb250ZXh0KSAmIE1FX1JET1dOKQotICAgICAgICBoYXJkd2FyZV9ldmVudCggV01fUkJVVFRPTkRPV04sIEVWRU5UX1hTdGF0ZVRvS2V5U3RhdGUoIHN0YXRlICksIDBMLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFggLSBkZXNrdG9wWCwgcm9vdFkgLSBkZXNrdG9wWSwgR2V0VGlja0NvdW50KCksIDApOworICAgICAgICBoYXJkd2FyZV9ldmVudCggV01fUkJVVFRPTkRPV04sIEVWRU5UX1hTdGF0ZVRvS2V5U3RhdGUoIHN0YXRlICksCisgICAgICAgICAgICAgICAgICAgICAgICAwTCwgd2luWCwgd2luWSwgR2V0VGlja0NvdW50KCksIDAgKTsKICAgICBpZiAoQVhfcmVnKGNvbnRleHQpICYgTUVfUlVQKQotICAgICAgICBoYXJkd2FyZV9ldmVudCggV01fUkJVVFRPTlVQLCBFVkVOVF9YU3RhdGVUb0tleVN0YXRlKCBzdGF0ZSApLCAwTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RYIC0gZGVza3RvcFgsIHJvb3RZIC0gZGVza3RvcFksIEdldFRpY2tDb3VudCgpLCAwKTsKKyAgICAgICAgaGFyZHdhcmVfZXZlbnQoIFdNX1JCVVRUT05VUCwgRVZFTlRfWFN0YXRlVG9LZXlTdGF0ZSggc3RhdGUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDBMLCB3aW5YLCB3aW5ZLCBHZXRUaWNrQ291bnQoKSwgMCApOwogfQogCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZm9jdXMuYyBiL3dpbmRvd3MvZm9jdXMuYwppbmRleCAyOGFhODQ3Li45ZjdiYjliIDEwMDY0NAotLS0gYS93aW5kb3dzL2ZvY3VzLmMKKysrIGIvd2luZG93cy9mb2N1cy5jCkBAIC02OSwxMiArNjksMTUgQEAKICAgICBpZiggIWhGb2N1c1RvIHx8IGhGb2N1c1RvICE9IGh3bmRGb2N1cyApCiAJcmV0dXJuOwogCisgICAgLyogQWNjb3JkaW5nIHRvIEFQSSBkb2NzLCB0aGUgV01fU0VURk9DVVMgbWVzc2FnZSBpcyBzZW50IEFGVEVSIHRoZSB3aW5kb3cKKyAgICAgICBoYXMgcmVjZWl2ZWQgdGhlIGtleWJvYXJkIGZvY3VzLiAqLworICAgIEZPQ1VTX1NldFhGb2N1cyggaEZvY3VzVG8gKTsKKwogI2lmIDAKICAgICBTZW5kTWVzc2FnZTMyQSggaEZvY3VzVG8sIFdNX1NFVEZPQ1VTLCBoRm9jdXNGcm9tLCAwICk7CiAjZWxzZQogICAgIFNlbmRNZXNzYWdlMTYoIGhGb2N1c1RvLCBXTV9TRVRGT0NVUywgaEZvY3VzRnJvbSwgMCApOwogI2VuZGlmCi0gICAgRk9DVVNfU2V0WEZvY3VzKCBoRm9jdXNUbyApOwogfQogCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mva2V5Ym9hcmQuYyBiL3dpbmRvd3Mva2V5Ym9hcmQuYwppbmRleCA2MGM4Y2Q2Li44MzAxMDk0IDEwMDY0NAotLS0gYS93aW5kb3dzL2tleWJvYXJkLmMKKysrIGIvd2luZG93cy9rZXlib2FyZC5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSAic3RkZGVidWcuaCIKIC8qICNkZWZpbmUgREVCVUdfS0VZQk9BUkQgKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImFjY2VsLmgiCiAjaW5jbHVkZSAic3RydWN0MzIuaCIKIAogQk9PTDMyIE1vdXNlQnV0dG9uc1N0YXRlc1szXTsKQEAgLTMwOSw3ICszMDgsOCBAQAogCiBzdGF0aWMgQk9PTDMyIE51bVN0YXRlPUZBTFNFLCBDYXBzU3RhdGU9RkFMU0U7CiAKLXZvaWQgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFdPUkQgdmtleSwgaW50IEV2dHlwZSwgWEtleUV2ZW50ICogZXZlbnQsIEtFWUxQIGxvY2Fsa2V5bHAgKQordm9pZCBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggV09SRCB2a2V5LCBpbnQgRXZ0eXBlLCBJTlQzMiBldmVudF94LCBJTlQzMiBldmVudF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZXZlbnRfdGltZSwgS0VZTFAgbG9jYWxrZXlscCApCiB7CiAgIEJPT0wzMiAqIFN0YXRlID0gKHZrZXk9PVZLX05VTUxPQ0s/ICZOdW1TdGF0ZSA6ICZDYXBzU3RhdGUpOwogCkBAIC0zMjgsMTAgKzMyOCwxMCBAQAogCQlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiT04gKyBLZXlSZWxlYXNlID0+IGdlbmVyYXRpbmcgRE9XTiBhbmQgVVAgbWVzc2FnZXMuXG4iKTsKIAkJbG9jYWxrZXlscC5scDEucHJldmlvdXMgPSAwOyAvKiA/ICovCiAJCWxvY2Fsa2V5bHAubHAxLnRyYW5zaXRpb24gPSAwOwotCQloYXJkd2FyZV9ldmVudCggV01fS0VZRE9XTiwgdmtleSwgbG9jYWxrZXlscC5scDIsIGV2ZW50LT54X3Jvb3QgLSBkZXNrdG9wWCwKLQkJCQlldmVudC0+eV9yb290IC0gZGVza3RvcFksIGV2ZW50LT50aW1lIC0gTVNHX1dpbmVTdGFydFRpY2tzLCAwKTsKLQkJaGFyZHdhcmVfZXZlbnQoIFdNX0tFWVVQLCB2a2V5LCBsb2NhbGtleWxwLmxwMiwgZXZlbnQtPnhfcm9vdCAtIGRlc2t0b3BYLAotCQkJCWV2ZW50LT55X3Jvb3QgLSBkZXNrdG9wWSwgZXZlbnQtPnRpbWUgLSBNU0dfV2luZVN0YXJ0VGlja3MsIDApOworCQloYXJkd2FyZV9ldmVudCggV01fS0VZRE9XTiwgdmtleSwgbG9jYWxrZXlscC5scDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3gsIGV2ZW50X3ksIGV2ZW50X3RpbWUsIDAgKTsKKwkJaGFyZHdhcmVfZXZlbnQoIFdNX0tFWVVQLCB2a2V5LCBsb2NhbGtleWxwLmxwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfeCwgZXZlbnRfeSwgZXZlbnRfdGltZSwgMCApOwogCQkqU3RhdGU9RkFMU0U7CiAJCUlucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSAmPSB+MHgwMTsgLyogVG9nZ2xlIHN0YXRlIHRvIG9mZi4gKi8gCiAJICAgICAgfSAKQEAgLTM0MCwxMiArMzQwLDEyIEBACiAJICBpZiAoRXZ0eXBlPT1LZXlQcmVzcykKIAkgICAgewogCSAgICAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJPRkYgKyBLZXlwcmVzcyA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7Ci0JICAgICAgaGFyZHdhcmVfZXZlbnQoIFdNX0tFWURPV04sIHZrZXksIGxvY2Fsa2V5bHAubHAyLCBldmVudC0+eF9yb290IC0gZGVza3RvcFgsCi0JCQkgICAgICBldmVudC0+eV9yb290IC0gZGVza3RvcFksIGV2ZW50LT50aW1lIC0gTVNHX1dpbmVTdGFydFRpY2tzLCAwKTsKKwkgICAgICBoYXJkd2FyZV9ldmVudCggV01fS0VZRE9XTiwgdmtleSwgbG9jYWxrZXlscC5scDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF94LCBldmVudF95LCBldmVudF90aW1lLCAwICk7CiAJICAgICAgbG9jYWxrZXlscC5scDEucHJldmlvdXMgPSAxOwogCSAgICAgIGxvY2Fsa2V5bHAubHAxLnRyYW5zaXRpb24gPSAxOwotCSAgICAgIGhhcmR3YXJlX2V2ZW50KCBXTV9LRVlVUCwgdmtleSwgbG9jYWxrZXlscC5scDIsIGV2ZW50LT54X3Jvb3QgLSBkZXNrdG9wWCwKLQkJCSAgICAgIGV2ZW50LT55X3Jvb3QgLSBkZXNrdG9wWSwgZXZlbnQtPnRpbWUgLSBNU0dfV2luZVN0YXJ0VGlja3MsIDApOworCSAgICAgIGhhcmR3YXJlX2V2ZW50KCBXTV9LRVlVUCwgdmtleSwgbG9jYWxrZXlscC5scDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF94LCBldmVudF95LCBldmVudF90aW1lLCAwICk7CiAJICAgICAgKlN0YXRlPVRSVUU7IC8qIEdvZXMgdG8gaW50ZXJtZWRpYXJ5IHN0YXRlIGJlZm9yZSBnb2luZyB0byBPTiAqLwogCSAgICAgIElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSB8PSAweDAxOyAvKiBUb2dnbGUgc3RhdGUgdG8gb24uICovCiAJICAgIH0KQEAgLTM1Nyw3ICszNTcsNyBAQAogICoKICAqIEhhbmRsZSBhIFgga2V5IGV2ZW50CiAgKi8KLXZvaWQgS0VZQk9BUkRfSGFuZGxlRXZlbnQoIFhLZXlFdmVudCAqZXZlbnQgKQordm9pZCBLRVlCT0FSRF9IYW5kbGVFdmVudCggV05EICpwV25kLCBYS2V5RXZlbnQgKmV2ZW50ICkKIHsKICAgICBjaGFyIFN0clsyNF07IAogICAgIFhDb21wb3NlU3RhdHVzIGNzOyAKQEAgLTM2OCwxNyArMzY4LDIxIEBACiAKICAgICBpbnQgYXNjaWlfY2hhcnMgPSBYTG9va3VwU3RyaW5nKGV2ZW50LCBTdHIsIDEsICZrZXlzeW0sICZjcyk7CiAKKyAgICBJTlQzMiBldmVudF94ID0gcFduZC0+cmVjdFdpbmRvdy5sZWZ0ICsgZXZlbnQtPng7CisgICAgSU5UMzIgZXZlbnRfeSA9IHBXbmQtPnJlY3RXaW5kb3cudG9wICsgZXZlbnQtPnk7CisgICAgRFdPUkQgZXZlbnRfdGltZSA9IGV2ZW50LT50aW1lIC0gTVNHX1dpbmVTdGFydFRpY2tzOworCiAgICAgZHByaW50Zl9rZXkoc3RkZGViLCAiRVZFTlRfa2V5IDogc3RhdGUgPSAlWFxuIiwgZXZlbnQtPnN0YXRlKTsKICAgICBpZiAoa2V5c3ltID09IFhLX01vZGVfc3dpdGNoKQogCXsKIAlkcHJpbnRmX2tleShzdGRkZWIsICJBbHQgR3Iga2V5IGV2ZW50IHJlY2VpdmVkXG4iKTsKIAlldmVudC0+a2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZXZlbnQtPmRpc3BsYXksIFhLX0NvbnRyb2xfTCk7CiAJZHByaW50Zl9rZXkoc3RkZGViLCAiQ29udHJvbF9MIGlzIGtleWNvZGUgMHgleFxuIiwgZXZlbnQtPmtleWNvZGUpOwotCUtFWUJPQVJEX0hhbmRsZUV2ZW50KGV2ZW50KTsKKwlLRVlCT0FSRF9IYW5kbGVFdmVudCggcFduZCwgZXZlbnQgKTsKIAlldmVudC0+a2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZXZlbnQtPmRpc3BsYXksIFhLX0FsdF9MKTsKIAlkcHJpbnRmX2tleShzdGRkZWIsICJBbHRfTCBpcyBrZXljb2RlIDB4JXhcbiIsIGV2ZW50LT5rZXljb2RlKTsKIAlmb3JjZV9leHRlbmRlZCA9IFRSVUU7Ci0JS0VZQk9BUkRfSGFuZGxlRXZlbnQoZXZlbnQpOworCUtFWUJPQVJEX0hhbmRsZUV2ZW50KCBwV25kLCBldmVudCApOwogCWZvcmNlX2V4dGVuZGVkID0gRkFMU0U7CiAJcmV0dXJuOwogCX0KQEAgLTQxNiwxMCArNDIwLDEzIEBACiAgICAgc3dpdGNoKHZrZXkpCiAgICAgewogICAgIGNhc2UgVktfTlVNTE9DSzogICAgCi0gICAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyhWS19OVU1MT0NLLGV2ZW50LT50eXBlLGV2ZW50LGtleWxwKTsgYnJlYWs7CisgICAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfTlVNTE9DSywgZXZlbnQtPnR5cGUsIGV2ZW50X3gsIGV2ZW50X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdGltZSwga2V5bHApOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBWS19DQVBJVEFMOgogICAgICAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIkNhcHMgTG9jayBldmVudC4gKHR5cGUgJWQpLiBTdGF0ZSBiZWZvcmUgOiAlIy4yeFxuIixldmVudC0+dHlwZSxJbnB1dEtleVN0YXRlVGFibGVbdmtleV0pOwotICAgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coVktfQ0FQSVRBTCxldmVudC0+dHlwZSxldmVudCxrZXlscCk7IAorICAgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX0NBUElUQUwsIGV2ZW50LT50eXBlLCBldmVudF94LCBldmVudF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RpbWUsIGtleWxwICk7IAogICAgICAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIlN0YXRlIGFmdGVyIDogJSMuMnhcbiIsSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CkBAIC00NTIsMTQgKzQ1OSwxOCBAQAogCWlmICghKElucHV0S2V5U3RhdGVUYWJsZVtWS19OVU1MT0NLXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTnVtTG9ja01hc2spKQogCSAgeyAKIAkgICAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIkFkanVzdGluZyBOdW1Mb2NrIHN0YXRlLiBcbiIpOwotCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyhWS19OVU1MT0NLLEtleVByZXNzLGV2ZW50LGtleWxwKTsKLQkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coVktfTlVNTE9DSyxLZXlSZWxlYXNlLGV2ZW50LGtleWxwKTsKKwkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIEtleVByZXNzLCBldmVudF94LCBldmVudF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RpbWUsIGtleWxwICk7CisJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19OVU1MT0NLLCBLZXlSZWxlYXNlLCBldmVudF94LCBldmVudF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RpbWUsIGtleWxwICk7CiAJICB9CiAJaWYgKCEoSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX0NBUElUQUxdICYgMHgwMSkgIT0gIShldmVudC0+c3RhdGUgJiBMb2NrTWFzaykpCiAJICB7CiAJICAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJBZGp1c3RpbmcgQ2FwcyBMb2NrIHN0YXRlLiBTdGF0ZSBiZWZvcmUgJSMuMnggXG4iLElucHV0S2V5U3RhdGVUYWJsZVtWS19DQVBJVEFMXSk7Ci0JICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKFZLX0NBUElUQUwsS2V5UHJlc3MsZXZlbnQsa2V5bHApOwotCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyhWS19DQVBJVEFMLEtleVJlbGVhc2UsZXZlbnQsa2V5bHApOworCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfQ0FQSVRBTCwgS2V5UHJlc3MsIGV2ZW50X3gsIGV2ZW50X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdGltZSwga2V5bHAgKTsKKwkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX0NBUElUQUwsIEtleVJlbGVhc2UsIGV2ZW50X3gsIGV2ZW50X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdGltZSwga2V5bHAgKTsKIAkgICAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIlN0YXRlIGFmdGVyICUjLjJ4IFxuIixJbnB1dEtleVN0YXRlVGFibGVbVktfQ0FQSVRBTF0pOwogCSAgfQogCS8qIEVuZCBvZiBpbnRlcm1lZGlhcnkgc3RhdGVzLiAqLwpAQCAtNDcxLDggKzQ4Miw4IEBACiAJZHByaW50Zl9rZXkoc3RkZGViLCIgICAgICAgICAgICBJbnB1dEtleVN0YXRlPSVYXG4iLAogCQkgICAgSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKIAotCWhhcmR3YXJlX2V2ZW50KCBtZXNzYWdlLCB2a2V5LCBrZXlscC5scDIsIGV2ZW50LT54X3Jvb3QgLSBkZXNrdG9wWCwKLQkJCWV2ZW50LT55X3Jvb3QgLSBkZXNrdG9wWSwgZXZlbnQtPnRpbWUgLSBNU0dfV2luZVN0YXJ0VGlja3MsIDAgKTsKKwloYXJkd2FyZV9ldmVudCggbWVzc2FnZSwgdmtleSwga2V5bHAubHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfeCwgZXZlbnRfeSwgZXZlbnRfdGltZSwgMCApOwogICAgICAgfQogICAgIH0KICAgIH0KQEAgLTgzMSw3ICs4NDIsNyBAQAogCSAgICAgIGluZGV4IDogMSAgICAgYWRkcyAweDAxMDAgKHNoaWZ0KQogCSAgICAgIGluZGV4IDogPyAgICAgYWRkcyAweDAyMDAgKGN0cmwpCiAJICAgICAgaW5kZXggOiAyICAgICBhZGRzIDB4MDYwMCAoY3RybCthbHQpCi0JICAgICAgaW5kZXggOiA/ICAgICBhZGRzIDB4MDcwMCAoY3RybCthbHQrc2hpdCAodXNlZD8pKQorCSAgICAgIGluZGV4IDogPyAgICAgYWRkcyAweDA3MDAgKGN0cmwrYWx0K3NoaWZ0ICh1c2VkPykpCiAJICAgICAqLwogCSAgfQogCWRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCIgLi4uIHJldHVybmluZyAlIy4yeFxuIiwga2V5YzJ2a2V5W2tleWNvZGVdK2hpZ2hieXRlKTsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWRpLmMgYi93aW5kb3dzL21kaS5jCmluZGV4IGNjYzRiY2YuLjU0YmFiZTAgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbWRpLmMKKysrIGIvd2luZG93cy9tZGkuYwpAQCAtMzcsNTggKzM3LDM4IEBACiBEV09SRCBTQ1JPTExfU2V0TkNTYlN0YXRlKFdORCosaW50LGludCxpbnQsaW50LGludCxpbnQpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLSBkZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIE1ESV9VcGRhdGVGcmFtZVRleHQoV05EICosIEhXTkQxNiwgQk9PTDMyLCBMUENTVFIpOwotc3RhdGljIEJPT0wzMiBNRElfQXVnbWVudEZyYW1lTWVudShNRElDTElFTlRJTkZPKiwgV05EICosIEhXTkQxNik7Ci1zdGF0aWMgQk9PTDMyIE1ESV9SZXN0b3JlRnJhbWVNZW51KFdORCAqLCBIV05EMTYpOworc3RhdGljIHZvaWQgTURJX1VwZGF0ZUZyYW1lVGV4dChXTkQgKiwgSFdORDMyLCBCT09MMzIsIExQQ1NUUik7CitzdGF0aWMgQk9PTDMyIE1ESV9BdWdtZW50RnJhbWVNZW51KE1ESUNMSUVOVElORk8qLCBXTkQgKiwgSFdORDMyKTsKK3N0YXRpYyBCT09MMzIgTURJX1Jlc3RvcmVGcmFtZU1lbnUoV05EICosIEhXTkQzMik7CiAKLXN0YXRpYyBMT05HIE1ESV9DaGlsZEFjdGl2YXRlKFdORCogLEhXTkQxNiApOworc3RhdGljIExPTkcgTURJX0NoaWxkQWN0aXZhdGUoIFdORCosIEhXTkQzMiApOwogCiAvKiAtLS0tLS0tLSBNaXNjZWxsYW5lb3VzIHNlcnZpY2UgZnVuY3Rpb25zIC0tLS0tLS0tLS0KICAqCiAgKgkJCU1ESV9HZXRDaGlsZEJ5SUQKICAqLwogCi1zdGF0aWMgSFdORDE2IE1ESV9HZXRDaGlsZEJ5SUQoV05EKiB3bmRQdHIsaW50IGlkKQorc3RhdGljIEhXTkQzMiBNRElfR2V0Q2hpbGRCeUlEKFdORCogd25kUHRyLCBJTlQzMiBpZCkKIHsKICAgICBmb3IgKHduZFB0ciA9IHduZFB0ci0+Y2hpbGQ7IHduZFB0cjsgd25kUHRyID0gd25kUHRyLT5uZXh0KQogICAgICAgICBpZiAod25kUHRyLT53SURtZW51ID09IGlkKSByZXR1cm4gd25kUHRyLT5od25kU2VsZjsKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgTURJX1Bvc3RVcGRhdGUoSFdORDE2IGh3bmQsIE1ESUNMSUVOVElORk8qIGNpLCBXT1JEIHJlY2FsYykKK3N0YXRpYyB2b2lkIE1ESV9Qb3N0VXBkYXRlKEhXTkQzMiBod25kLCBNRElDTElFTlRJTkZPKiBjaSwgV09SRCByZWNhbGMpCiB7CiAgICAgaWYoICEoY2ktPm1kaUZsYWdzICYgTURJRl9ORUVEVVBEQVRFKSApCiAgICAgewogCWNpLT5tZGlGbGFncyB8PSBNRElGX05FRURVUERBVEU7Ci0JUG9zdE1lc3NhZ2UxNiggaHduZCwgV01fTURJQ0FMQ0NISUxEU0NST0xMLCAwLCAwKTsKKwlQb3N0TWVzc2FnZTMyQSggaHduZCwgV01fTURJQ0FMQ0NISUxEU0NST0xMLCAwLCAwKTsKICAgICB9CiAgICAgY2ktPnNiUmVjYWxjID0gcmVjYWxjOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQlNRElfTWVudUFwcGVuZEl0ZW0KLSAqLwotI2lmZGVmIFNVUEVSRkxVT1VTX0ZVTkNUSU9OUwotc3RhdGljIEJPT0wzMiBNRElfTWVudUFwcGVuZEl0ZW0oV05EICpjbGllbnRXbmQsIEhXTkQxNiBoV25kQ2hpbGQpCi17Ci0gY2hhciBidWZmZXJbMTI4XTsKLSBNRElDTElFTlRJTkZPICAqY2xpZW50SW5mbyA9IChNRElDTElFTlRJTkZPKiljbGllbnRXbmQtPndFeHRyYTsKLSBXTkQJCSp3bmRQdHIgICAgID0gV0lOX0ZpbmRXbmRQdHIoaFduZENoaWxkKTsKLSBpbnQgCQkgbiAgICAgICAgICA9IHNwcmludGYoYnVmZmVyLCAiJWQgIiwgCi0JCQkJICAgICAgY2xpZW50SW5mby0+bkFjdGl2ZUNoaWxkcmVuKTsKLQotIGlmKCAhY2xpZW50SW5mby0+aFdpbmRvd01lbnUgKSByZXR1cm4gMDsgCi0gICAgCi0gaWYgKHduZFB0ci0+dGV4dCkgc3RybmNweShidWZmZXIgKyBuLCB3bmRQdHItPnRleHQsIHNpemVvZihidWZmZXIpIC0gbiAtIDEpOwotIHJldHVybiBBcHBlbmRNZW51MzJBKCBjbGllbnRJbmZvLT5oV2luZG93TWVudSwgTUZfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICB3bmRQdHItPndJRG1lbnUsIGJ1ZmZlciApOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCU1ESV9NZW51TW9kaWZ5SXRlbQogICovCi1zdGF0aWMgQk9PTDMyIE1ESV9NZW51TW9kaWZ5SXRlbShXTkQqIGNsaWVudFduZCwgSFdORDE2IGhXbmRDaGlsZCApCitzdGF0aWMgQk9PTDMyIE1ESV9NZW51TW9kaWZ5SXRlbShXTkQqIGNsaWVudFduZCwgSFdORDMyIGhXbmRDaGlsZCApCiB7CiAgICAgY2hhciAgICAgICAgICAgIGJ1ZmZlclsxMjhdOwogICAgIE1ESUNMSUVOVElORk8gICpjbGllbnRJbmZvID0gKE1ESUNMSUVOVElORk8qKWNsaWVudFduZC0+d0V4dHJhOwpAQCAtMTExLDcgKzkxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCU1ESV9NZW51RGVsZXRlSXRlbQogICovCi1zdGF0aWMgQk9PTDMyIE1ESV9NZW51RGVsZXRlSXRlbShXTkQqIGNsaWVudFduZCwgSFdORDE2IGhXbmRDaGlsZCApCitzdGF0aWMgQk9PTDMyIE1ESV9NZW51RGVsZXRlSXRlbShXTkQqIGNsaWVudFduZCwgSFdORDMyIGhXbmRDaGlsZCApCiB7CiAgICAgY2hhciAgICAJIGJ1ZmZlclsxMjhdOwogICAgIE1ESUNMSUVOVElORk8gKmNsaWVudEluZm8gPSAoTURJQ0xJRU5USU5GTyopY2xpZW50V25kLT53RXh0cmE7CkBAIC0xNTYsNyArMTM2LDggQEAKICAqCiAgKiByZXR1cm5zICJhY3RpdmF0ZWFibGUiIGNoaWxkIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IG9yIHplcm8KICAqLwotc3RhdGljIEhXTkQxNiBNRElfR2V0V2luZG93KFdORCAqY2xpZW50V25kLCBIV05EMTYgaFduZCwgQk9PTDE2IGJOZXh0LCBEV09SRCBkd1N0eWxlTWFzayApCitzdGF0aWMgSFdORDMyIE1ESV9HZXRXaW5kb3coV05EICpjbGllbnRXbmQsIEhXTkQzMiBoV25kLCBCT09MMzIgYk5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdTdHlsZU1hc2sgKQogewogICAgIE1ESUNMSUVOVElORk8gKmNsaWVudEluZm8gPSAoTURJQ0xJRU5USU5GTyopY2xpZW50V25kLT53RXh0cmE7CiAgICAgV05EICp3bmRQdHIsICpwV25kLCAqcFduZExhc3QgPSBOVUxMOwpAQCAtMTg2LDcgKzE2Nyw3IEBACiAgKgogICogIEl0IHNlZW1zIHRoYXQgdGhlIGRlZmF1bHQgaGVpZ2h0IGlzIGFib3V0IDIvMyBvZiB0aGUgY2xpZW50IHJlY3QKICAqLwotc3RhdGljIHZvaWQgTURJX0NhbGNEZWZhdWx0Q2hpbGRQb3MoIFdORCogdywgV09SRCBuLCBMUFBPSU5UMTYgbHBQb3MsCitzdGF0aWMgdm9pZCBNRElfQ2FsY0RlZmF1bHRDaGlsZFBvcyggV05EKiB3LCBXT1JEIG4sIExQUE9JTlQzMiBscFBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBkZWx0YSkKIHsKICAgICBJTlQzMiAgbnN0YWdnZXI7CkBAIC0yMDYsODQgKzE4Nyw2OCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgTURJU2V0TWVudQogICovCi1zdGF0aWMgSE1FTlUxNiBNRElTZXRNZW51KEhXTkQxNiBod25kLCBCT09MMzIgZlJlZnJlc2gsIEhNRU5VMTYgaG1lbnVGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSE1FTlUxNiBobWVudVdpbmRvdykKK3N0YXRpYyBMUkVTVUxUIE1ESVNldE1lbnUoIEhXTkQzMiBod25kLCBITUVOVTMyIGhtZW51RnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBITUVOVTMyIGhtZW51V2luZG93KQogewotICAgIFdORCAgICAgICAgICAgKncgICAgICAgICA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworICAgIFdORCAqdyA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwogICAgIE1ESUNMSUVOVElORk8gKmNpOworICAgIEhXTkQzMiBod25kRnJhbWUgPSBHZXRQYXJlbnQzMihod25kKTsKKyAgICBITUVOVTMyIG9sZEZyYW1lTWVudSA9IEdldE1lbnUzMihod25kRnJhbWUpOwogCi0gICAgZHByaW50Zl9tZGkoc3RkZGViLCAiV01fTURJU0VUTUVOVTogJTA0eCAlMDR4ICUwNHggJTA0eFxuIiwKLSAgICAgICAgICAgICAgICBod25kLCBmUmVmcmVzaCwgaG1lbnVGcmFtZSwgaG1lbnVXaW5kb3cpOworICAgIGRwcmludGZfbWRpKHN0ZGRlYiwgIldNX01ESVNFVE1FTlU6ICUwNHggJTA0eCAlMDR4XG4iLAorICAgICAgICAgICAgICAgIGh3bmQsIGhtZW51RnJhbWUsIGhtZW51V2luZG93KTsKIAogICAgIGNpID0gKE1ESUNMSUVOVElORk8gKikgdy0+d0V4dHJhOwogCi0gICAgaWYgKCFmUmVmcmVzaCkgCisgICAgaWYoIGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQgJiYgaG1lbnVGcmFtZSAmJiBobWVudUZyYW1lIT1vbGRGcmFtZU1lbnUgKQorICAgICAgICBNRElfUmVzdG9yZUZyYW1lTWVudSh3LT5wYXJlbnQsIGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQgKTsKKworICAgIGlmKCBobWVudVdpbmRvdyAmJiBobWVudVdpbmRvdyE9Y2ktPmhXaW5kb3dNZW51ICkKICAgICB7Ci0JSFdORDE2IGh3bmRGcmFtZSA9IEdldFBhcmVudDE2KGh3bmQpOwotCUhNRU5VMzIgb2xkRnJhbWVNZW51ID0gR2V0TWVudTMyKGh3bmRGcmFtZSk7Ci0gICAgICAgIAotCWlmKCBjaS0+aHduZENoaWxkTWF4aW1pemVkICYmIGhtZW51RnJhbWUgJiYgaG1lbnVGcmFtZSE9b2xkRnJhbWVNZW51ICkKLQkgICAgTURJX1Jlc3RvcmVGcmFtZU1lbnUody0+cGFyZW50LCBjaS0+aHduZENoaWxkTWF4aW1pemVkICk7CisgICAgICAgIC8qIGRlbGV0ZSBtZW51IGl0ZW1zIGZyb20gY2ktPmhXaW5kb3dNZW51IAorICAgICAgICAgKiBhbmQgYWRkIHRoZW0gdG8gaG1lbnVXaW5kb3cgKi8KIAotCWlmKCBobWVudVdpbmRvdyAmJiBobWVudVdpbmRvdyE9Y2ktPmhXaW5kb3dNZW51ICkKLQl7Ci0JICAgIC8qIGRlbGV0ZSBtZW51IGl0ZW1zIGZyb20gY2ktPmhXaW5kb3dNZW51IAotCSAgICAgKiBhbmQgYWRkIHRoZW0gdG8gaG1lbnVXaW5kb3cgKi8KKyAgICAgICAgSU5UMzIgaSA9IEdldE1lbnVJdGVtQ291bnQzMihjaS0+aFdpbmRvd01lbnUpIC0gMTsKKyAgICAgICAgSU5UMzIgcG9zID0gR2V0TWVudUl0ZW1Db3VudDMyKGhtZW51V2luZG93KSArIDE7CiAKLSAgICAgICAgICAgIElOVDMyIGkgPSBHZXRNZW51SXRlbUNvdW50MzIoY2ktPmhXaW5kb3dNZW51KSAtIDE7Ci0JICAgIElOVDMyIHBvcyA9IEdldE1lbnVJdGVtQ291bnQzMihobWVudVdpbmRvdykgKyAxOworICAgICAgICBBcHBlbmRNZW51MzJBKCBobWVudVdpbmRvdywgTUZfU0VQQVJBVE9SLCAwLCBOVUxMKTsKIAotICAgICAgICAgICAgQXBwZW5kTWVudTMyQSggaG1lbnVXaW5kb3csIE1GX1NFUEFSQVRPUiwgMCwgTlVMTCk7CisgICAgICAgIGlmKCBjaS0+bkFjdGl2ZUNoaWxkcmVuICkKKyAgICAgICAgeworICAgICAgICAgICAgSU5UMzIgaiA9IGkgLSBjaS0+bkFjdGl2ZUNoaWxkcmVuICsgMTsKKyAgICAgICAgICAgIGNoYXIgYnVmZmVyWzEwMF07CisgICAgICAgICAgICBVSU5UMzIgaWQsc3RhdGU7CiAKLQkgICAgaWYoIGNpLT5uQWN0aXZlQ2hpbGRyZW4gKQotCSAgICB7Ci0JICAgICAgICBJTlQzMiBqID0gaSAtIGNpLT5uQWN0aXZlQ2hpbGRyZW4gKyAxOwotCQljaGFyIGJ1ZmZlclsxMDBdOwotCQlVSU5UMzIgaWQsc3RhdGU7CisgICAgICAgICAgICBmb3IoIDsgaSA+PSBqIDsgaS0tICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZCA9IEdldE1lbnVJdGVtSUQzMihjaS0+aFdpbmRvd01lbnUsaSApOworICAgICAgICAgICAgICAgIHN0YXRlID0gR2V0TWVudVN0YXRlMzIoY2ktPmhXaW5kb3dNZW51LGksTUZfQllQT1NJVElPTik7IAogCi0JCWZvciggOyBpID49IGogOyBpLS0gKQotCQl7Ci0JCSAgICAgaWQgPSBHZXRNZW51SXRlbUlEMzIoY2ktPmhXaW5kb3dNZW51LGkgKTsKLQkJICAgICBzdGF0ZSA9IEdldE1lbnVTdGF0ZTMyKGNpLT5oV2luZG93TWVudSxpLE1GX0JZUE9TSVRJT04pOyAKKyAgICAgICAgICAgICAgICBHZXRNZW51U3RyaW5nMzJBKGNpLT5oV2luZG93TWVudSwgaSwgYnVmZmVyLCAxMDAsIE1GX0JZUE9TSVRJT04pOwogCi0JCSAgICAgR2V0TWVudVN0cmluZzMyQShjaS0+aFdpbmRvd01lbnUsIGksIGJ1ZmZlciwgMTAwLCBNRl9CWVBPU0lUSU9OKTsKKyAgICAgICAgICAgICAgICBEZWxldGVNZW51MzIoY2ktPmhXaW5kb3dNZW51LCBpICwgTUZfQllQT1NJVElPTik7CisgICAgICAgICAgICAgICAgSW5zZXJ0TWVudTMyQShobWVudVdpbmRvdywgcG9zLCBNRl9CWVBPU0lUSU9OIHwgTUZfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgQ2hlY2tNZW51SXRlbTMyKGhtZW51V2luZG93ICxwb3MgLCBNRl9CWVBPU0lUSU9OIHwgKHN0YXRlICYgTUZfQ0hFQ0tFRCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJICAgICBEZWxldGVNZW51MzIoY2ktPmhXaW5kb3dNZW51LCBpICwgTUZfQllQT1NJVElPTik7Ci0JCSAgICAgSW5zZXJ0TWVudTMyQShobWVudVdpbmRvdywgcG9zLCBNRl9CWVBPU0lUSU9OIHwgTUZfU1RSSU5HLAotCQkJCQkgICAgIGlkLCBidWZmZXIpOwotCQkgICAgIENoZWNrTWVudUl0ZW0zMihobWVudVdpbmRvdyAscG9zICwgTUZfQllQT1NJVElPTiB8IChzdGF0ZSAmIE1GX0NIRUNLRUQpKTsKLQkJfQotCSAgICB9CisgICAgICAgIC8qIHJlbW92ZSBzZXBhcmF0b3IgKi8KKyAgICAgICAgRGVsZXRlTWVudTMyKGNpLT5oV2luZG93TWVudSwgaSwgTUZfQllQT1NJVElPTik7IAogCi0JICAgIC8qIHJlbW92ZSBzZXBhcmF0b3IgKi8KLQkgICAgRGVsZXRlTWVudTMyKGNpLT5oV2luZG93TWVudSwgaSwgTUZfQllQT1NJVElPTik7IAorICAgICAgICBjaS0+aFdpbmRvd01lbnUgPSBobWVudVdpbmRvdzsKKyAgICB9IAogCi0JICAgIGNpLT5oV2luZG93TWVudSA9IGhtZW51V2luZG93OwotCX0gCi0KLQlpZiggaG1lbnVGcmFtZSAmJiBobWVudUZyYW1lIT1vbGRGcmFtZU1lbnUpCi0JewotCSAgICBTZXRNZW51MzIoaHduZEZyYW1lLCBobWVudUZyYW1lKTsKLQkgICAgaWYoIGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQgKQotCSAgICAgICAgTURJX0F1Z21lbnRGcmFtZU1lbnUoY2ksIHctPnBhcmVudCwgY2ktPmh3bmRDaGlsZE1heGltaXplZCApOwotCSAgICByZXR1cm4gb2xkRnJhbWVNZW51OwotCX0KLQorICAgIGlmKCBobWVudUZyYW1lICYmIGhtZW51RnJhbWUhPW9sZEZyYW1lTWVudSkKKyAgICB7CisgICAgICAgIFNldE1lbnUzMihod25kRnJhbWUsIGhtZW51RnJhbWUpOworICAgICAgICBpZiggY2ktPmh3bmRDaGlsZE1heGltaXplZCApCisgICAgICAgICAgICBNRElfQXVnbWVudEZyYW1lTWVudShjaSwgdy0+cGFyZW50LCBjaS0+aHduZENoaWxkTWF4aW1pemVkICk7CisgICAgICAgIHJldHVybiBvbGRGcmFtZU1lbnU7CiAgICAgfQogICAgIHJldHVybiAwOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICBNRElJY29uQXJyYW5nZQotICovCi1zdGF0aWMgV09SRCBNRElJY29uQXJyYW5nZShIV05EMTYgcGFyZW50KQotewotICByZXR1cm4gQXJyYW5nZUljb25pY1dpbmRvd3MxNihwYXJlbnQpOwkvKiBBbnkgcmVhc29uIHdoeSB0aGUgICAgKi8KLQkJCQkJCS8qIGV4aXN0aW5nIGljb24gYXJyYW5nZSAqLwotCQkJCQkJLyogY2FuJ3QgYmUgdXNlZCBoZXJlPwkgKi8KLQkJCQkJCS8qIC1EUlAJCQkgKi8KLX0KLQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0gTURJIGNoaWxkIHdpbmRvdyBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0yOTEsMjYgKzI1NiwyNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCQlNRElDcmVhdGVDaGlsZAogICovCi1zdGF0aWMgSFdORDE2IE1ESUNyZWF0ZUNoaWxkKCBXTkQgKncsIE1ESUNMSUVOVElORk8gKmNpLCBIV05EMTYgcGFyZW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQTURJQ1JFQVRFU1RSVUNUMTYgY3MsIExQQVJBTSBsUGFyYW0gKQorc3RhdGljIEhXTkQzMiBNRElDcmVhdGVDaGlsZCggV05EICp3LCBNRElDTElFTlRJTkZPICpjaSwgSFdORDMyIHBhcmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUE1ESUNSRUFURVNUUlVDVDMyQSBjcyApCiB7Ci0gICAgUE9JTlQxNiAgICAgICAgICBwb3NbMl07IAorICAgIFBPSU5UMzIgICAgICAgICAgcG9zWzJdOyAKICAgICBEV09SRAkgICAgIHN0eWxlID0gY3MtPnN0eWxlIHwgKFdTX0NISUxEIHwgV1NfQ0xJUFNJQkxJTkdTKTsKLSAgICBIV05EMTYgCSAgICAgaHduZCwgaHduZE1heCA9IDA7CisgICAgSFdORDMyIAkgICAgIGh3bmQsIGh3bmRNYXggPSAwOwogICAgIFdPUkQJICAgICB3SURtZW51ID0gY2ktPmlkRmlyc3RDaGlsZCArIGNpLT5uQWN0aXZlQ2hpbGRyZW47CiAgICAgY2hhcgkgICAgIGxwc3RyRGVmW109Imp1bmshIjsKIAogICAgIGRwcmludGZfbWRpKHN0ZG5pbXAsIk1ESUNyZWF0ZUNoaWxkOiBvcmlnaW4gJWksJWkgLSBkaW0gJWksJWksIHN0eWxlICUwOHhcbiIsIAotCQkJCQkgY3MtPngsIGNzLT55LCBjcy0+Y3gsIGNzLT5jeSwgKHVuc2lnbmVkKWNzLT5zdHlsZSk7ICAgIAorICAgICAgICAgICAgICAgIGNzLT54LCBjcy0+eSwgY3MtPmN4LCBjcy0+Y3ksICh1bnNpZ25lZCljcy0+c3R5bGUpOyAgICAKICAgICAvKiBjYWxjdWxhdGUgcGxhY2VtZW50ICovCiAgICAgTURJX0NhbGNEZWZhdWx0Q2hpbGRQb3ModywgY2ktPm5Ub3RhbENyZWF0ZWQrKywgcG9zLCAwKTsKIAotICAgIGlmKCBjcy0+Y3ggPT0gQ1dfVVNFREVGQVVMVDE2IHx8ICFjcy0+Y3ggKQotICAgICAgICBjcy0+Y3ggPSBwb3NbMV0ueDsKLSAgICBpZiggY3MtPmN5ID09IENXX1VTRURFRkFVTFQxNiB8fCAhY3MtPmN5ICkKLSAgICAgICAgY3MtPmN5ID0gcG9zWzFdLnk7CisgICAgaWYgKGNzLT5jeCA9PSBDV19VU0VERUZBVUxUMzIgfHwgIWNzLT5jeCkgY3MtPmN4ID0gcG9zWzFdLng7CisgICAgaWYgKGNzLT5jeSA9PSBDV19VU0VERUZBVUxUMzIgfHwgIWNzLT5jeSkgY3MtPmN5ID0gcG9zWzFdLnk7CiAKLSAgICBpZiggY3MtPnggPT0gQ1dfVVNFREVGQVVMVDE2ICkKKyAgICBpZiggY3MtPnggPT0gQ1dfVVNFREVGQVVMVDMyICkKICAgICB7CiAgCWNzLT54ID0gcG9zWzBdLng7CiAJY3MtPnkgPSBwb3NbMF0ueTsKQEAgLTMyMCwxMSArMjgzLDExIEBACiAgICAgaWYoIHN0eWxlICYgV1NfVklTSUJMRSAmJiBjaS0+aHduZENoaWxkTWF4aW1pemVkICkKICAgICB7CiAJaWYoIHN0eWxlICYgV1NfTUFYSU1JWkUgKQotCSAgICBTZW5kTWVzc2FnZTE2KHctPmh3bmRTZWxmLCBXTV9TRVRSRURSQVcsIEZBTFNFLCAwTCApOworCSAgICBTZW5kTWVzc2FnZTMyQSh3LT5od25kU2VsZiwgV01fU0VUUkVEUkFXLCBGQUxTRSwgMEwgKTsKIAlod25kTWF4ID0gY2ktPmh3bmRDaGlsZE1heGltaXplZDsKLQlTaG93V2luZG93MTYoIGh3bmRNYXgsIFNXX1NIT1dOT0FDVElWQVRFICk7CisJU2hvd1dpbmRvdzMyKCBod25kTWF4LCBTV19TSE9XTk9BQ1RJVkFURSApOwogCWlmKCBzdHlsZSAmIFdTX01BWElNSVpFICkKLQkgICAgU2VuZE1lc3NhZ2UxNih3LT5od25kU2VsZiwgV01fU0VUUkVEUkFXLCBUUlVFLCAwTCApOworCSAgICBTZW5kTWVzc2FnZTMyQSh3LT5od25kU2VsZiwgV01fU0VUUkVEUkFXLCBUUlVFLCAwTCApOwogICAgIH0KIAogICAgIC8qIHRoaXMgbWVudSBpcyBuZWVkZWQgdG8gc2V0IGEgY2hlY2sgbWFyayBpbiBNRElfQ2hpbGRBY3RpdmF0ZSAqLwpAQCAtMzQyLDI0ICszMDUsMzAgQEAKIAogICAgIGlmKCB3LT5mbGFncyAmIFdJTl9JU1dJTjMyICkKICAgICB7Ci0gICAgCU1ESUNSRUFURVNUUlVDVDMyQSBjczMyYTsKLQotCVNUUlVDVDMyX01ESUNSRUFURVNUUlVDVDE2dG8zMkEoY3MsJmNzMzJhKTsKLQljczMyYS5zelRpdGxlID0gKExQQ1NUUilQVFJfU0VHX1RPX0xJTihjcy0+c3pUaXRsZSk7Ci0JY3MzMmEuc3pDbGFzcyA9IChMUENTVFIpUFRSX1NFR19UT19MSU4oY3MtPnN6Q2xhc3MpOwotCi0JaHduZCA9IENyZWF0ZVdpbmRvdzMyQShjczMyYS5zekNsYXNzLGNzMzJhLnN6VGl0bGUsIHN0eWxlLCAKLQkJCSAgICAgICBjcy0+eCwgY3MtPnksIGNzLT5jeCwgY3MtPmN5LCBwYXJlbnQsIAotCQkJICAgICAgIChITUVOVTE2KXdJRG1lbnUsIGNzLT5oT3duZXIsCi0JCQkgICAgICAgKExQVk9JRCkmY3MzMmEpOwotCVNUUlVDVDMyX01ESUNSRUFURVNUUlVDVDMyQXRvMTYoJmNzMzJhLGNzKTsKKwlod25kID0gQ3JlYXRlV2luZG93MzJBKCBjcy0+c3pDbGFzcywgY3MtPnN6VGl0bGUsIHN0eWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3MtPngsIGNzLT55LCBjcy0+Y3gsIGNzLT5jeSwgcGFyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhNRU5VMTYpd0lEbWVudSwgY3MtPmhPd25lciwgY3MgKTsKICAgICB9CiAgICAgZWxzZQotCWh3bmQgPSBDcmVhdGVXaW5kb3cxNiggKExQQ1NUUilQVFJfU0VHX1RPX0xJTihjcy0+c3pDbGFzcyksCi0JCQkgICAgICAgKExQQ1NUUilQVFJfU0VHX1RPX0xJTihjcy0+c3pUaXRsZSksIHN0eWxlLCAKLQkJCSAgICAgICBjcy0+eCwgY3MtPnksIGNzLT5jeCwgY3MtPmN5LCBwYXJlbnQsIAotCQkJICAgICAgIChITUVOVTMyKXdJRG1lbnUsIGNzLT5oT3duZXIsCi0JCQkgICAgICAgKExQVk9JRClsUGFyYW0pOworICAgIHsKKyAgICAJTURJQ1JFQVRFU1RSVUNUMTYgKmNzMTY7CisgICAgICAgIExQU1RSIHRpdGxlLCBjbHM7CisKKyAgICAgICAgY3MxNiA9IFNFR1BUUl9ORVcoTURJQ1JFQVRFU1RSVUNUMTYpOworICAgICAgICBTVFJVQ1QzMl9NRElDUkVBVEVTVFJVQ1QzMkF0bzE2KCBjcywgY3MxNiApOworICAgICAgICB0aXRsZSA9IFNFR1BUUl9TVFJEVVAoIGNzLT5zelRpdGxlICk7CisgICAgICAgIGNscyAgID0gU0VHUFRSX1NUUkRVUCggY3MtPnN6Q2xhc3MgKTsKKyAgICAgICAgY3MxNi0+c3pUaXRsZSA9IFNFR1BUUl9HRVQodGl0bGUpOworICAgICAgICBjczE2LT5zekNsYXNzID0gU0VHUFRSX0dFVChjbHMpOworCisJaHduZCA9IENyZWF0ZVdpbmRvdzE2KCBjcy0+c3pDbGFzcywgY3MtPnN6VGl0bGUsIHN0eWxlLCAKKwkJCSAgICAgICBjczE2LT54LCBjczE2LT55LCBjczE2LT5jeCwgY3MxNi0+Y3ksIHBhcmVudCwgCisJCQkgICAgICAgKEhNRU5VMzIpd0lEbWVudSwgY3MxNi0+aE93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpU0VHUFRSX0dFVChjczE2KSApOworICAgICAgICBTRUdQVFJfRlJFRSggdGl0bGUgKTsKKyAgICAgICAgU0VHUFRSX0ZSRUUoIGNscyApOworICAgICAgICBTRUdQVFJfRlJFRSggY3MxNiApOworICAgIH0KIAogICAgIC8qIE1ESSB3aW5kb3dzIGFyZSBXU19DSElMRCBzbyB0aGV5IHdvbid0IGJlIGFjdGl2YXRlZCBieSBDcmVhdGVXaW5kb3cgKi8KIApAQCAtMzY5LDcgKzMzOCw3IEBACiAKIAlNRElfTWVudU1vZGlmeUl0ZW0odyAsaHduZCk7IAogCWlmKCB3bmQtPmR3U3R5bGUgJiBXU19NSU5JTUlaRSAmJiBjaS0+aHduZEFjdGl2ZUNoaWxkICkKLQkgICAgU2hvd1dpbmRvdzE2KCBod25kLCBTV19TSE9XTUlOTk9BQ1RJVkUgKTsKKwkgICAgU2hvd1dpbmRvdzMyKCBod25kLCBTV19TSE9XTUlOTk9BQ1RJVkUgKTsKIAllbHNlCiAJewogCSAgICBTZXRXaW5kb3dQb3MzMiggaHduZCwgMCwgMCwgMCwgMCwgMCwgU1dQX1NIT1dXSU5ET1cgfCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSApOwpAQCAtNDA0LDcgKzM3Myw3IEBACiAgKiBOb3RlOiBUaGUgcnVsZSBoZXJlIGlzIHRoYXQgY2xpZW50IHJlY3Qgb2YgdGhlIG1heGltaXplZCBNREkgY2hpbGQgCiAgKgkgaXMgZXF1YWwgdG8gdGhlIGNsaWVudCByZWN0IG9mIHRoZSBNREkgY2xpZW50IHdpbmRvdy4KICAqLwotc3RhdGljIHZvaWQgTURJX0NoaWxkR2V0TWluTWF4SW5mbyggV05EKiBjbGllbnRXbmQsIEhXTkQxNiBod25kLAorc3RhdGljIHZvaWQgTURJX0NoaWxkR2V0TWluTWF4SW5mbyggV05EKiBjbGllbnRXbmQsIEhXTkQzMiBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOTUFYSU5GTzE2KiBscE1pbk1heCApCiB7CiAgICAgV05EKgljaGlsZFduZCA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwpAQCAtNDMwLDEyICszOTksMTIgQEAKICAqIE5vdGU6IFNldFdpbmRvd1BvcyBzZW5kcyBXTV9DSElMREFDVElWQVRFIHRvIHRoZSBjaGlsZCB3aW5kb3cgdGhhdCBpcwogICogICAgICAgYmVpbmcgYWN0aXZhdGVkIAogICovCi1zdGF0aWMgdm9pZCBNRElfU3dpdGNoQWN0aXZlQ2hpbGQoIEhXTkQxNiBjbGllbnRId25kLCBIV05EMTYgY2hpbGRId25kLAorc3RhdGljIHZvaWQgTURJX1N3aXRjaEFjdGl2ZUNoaWxkKCBIV05EMzIgY2xpZW50SHduZCwgSFdORDMyIGNoaWxkSHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIGJOZXh0V2luZG93ICkKIHsKICAgICBXTkQJCSAgKncJICAgICA9IFdJTl9GaW5kV25kUHRyKGNsaWVudEh3bmQpOwotICAgIEhXTkQxNgkgICBod25kVG8gICAgPSAwOwotICAgIEhXTkQxNgkgICBod25kUHJldiAgPSAwOworICAgIEhXTkQzMgkgICBod25kVG8gICAgPSAwOworICAgIEhXTkQzMgkgICBod25kUHJldiAgPSAwOwogICAgIE1ESUNMSUVOVElORk8gKmNpOwogCiAgICAgaHduZFRvID0gTURJX0dldFdpbmRvdyh3LCBjaGlsZEh3bmQsIGJOZXh0V2luZG93LCAwKTsKQEAgLTQ2NSw3ICs0MzQsNyBAQAogCSAgICBTZXRXaW5kb3dQb3MzMiggaHduZFByZXYsIEhXTkRfQk9UVE9NLCAwLCAwLCAwLCAwLCAKIAkJICAJICAgIFNXUF9OT01PVkUgfCBTV1BfTk9TSVpFIHwgU1dQX05PQUNUSVZBVEUgKTsKIAlpZiggYk9wdGltaXplICkKLQkgICAgU2hvd1dpbmRvdzE2KCBjbGllbnRId25kLCBTV19TSE9XICk7CisJICAgIFNob3dXaW5kb3czMiggY2xpZW50SHduZCwgU1dfU0hPVyApOwogICAgIH0KIH0KIApAQCAtNDczLDggKzQ0Miw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ESURlc3Ryb3lDaGlsZAogICovCi1zdGF0aWMgSFdORDE2IE1ESURlc3Ryb3lDaGlsZCggV05EICp3X3BhcmVudCwgTURJQ0xJRU5USU5GTyAqY2ksIEhXTkQxNiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdORDE2IGNoaWxkLCBCT09MMzIgZmxhZ0Rlc3Ryb3kgKQorc3RhdGljIExSRVNVTFQgTURJRGVzdHJveUNoaWxkKCBXTkQgKndfcGFyZW50LCBNRElDTElFTlRJTkZPICpjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdORDMyIHBhcmVudCwgSFdORDMyIGNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgZmxhZ0Rlc3Ryb3kgKQogewogICAgIFdORCAgICAgICAgICpjaGlsZFB0ciA9IFdJTl9GaW5kV25kUHRyKGNoaWxkKTsKIApAQCAtNDg2LDcgKzQ1Niw3IEBACiAKIAkgICAgaWYoIGNoaWxkID09IGNpLT5od25kQWN0aXZlQ2hpbGQgKQogCSAgICB7Ci0JCVNob3dXaW5kb3cxNiggY2hpbGQsIFNXX0hJREUpOworCQlTaG93V2luZG93MzIoIGNoaWxkLCBTV19ISURFKTsKIAkJaWYoIGNoaWxkID09IGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQgKQogCQl7CiAJCSAgICBNRElfUmVzdG9yZUZyYW1lTWVudSh3X3BhcmVudC0+cGFyZW50LCBjaGlsZCk7CkBAIC01MDUsNyArNDc1LDcgQEAKIAogICAgICAgICBpZiAoZmxhZ0Rlc3Ryb3kpCiAJewotCSAgICBNRElfUG9zdFVwZGF0ZShHZXRQYXJlbnQxNihjaGlsZCksIGNpLCBTQl9CT1RIKzEpOworCSAgICBNRElfUG9zdFVwZGF0ZShHZXRQYXJlbnQzMihjaGlsZCksIGNpLCBTQl9CT1RIKzEpOwogICAgICAgICAgICAgRGVzdHJveVdpbmRvdzMyKGNoaWxkKTsKIAl9CiAgICAgfQpAQCAtNTE5LDEwICs0ODksMTAgQEAKICAqCiAgKiBOb3RlOiBoV25kQ2hpbGQgaXMgTlVMTCB3aGVuIGxhc3QgY2hpbGQgaXMgYmVpbmcgZGVzdHJveWVkCiAgKi8KLXN0YXRpYyBMT05HIE1ESV9DaGlsZEFjdGl2YXRlKCBXTkQgKmNsaWVudFB0ciwgSFdORDE2IGhXbmRDaGlsZCApCitzdGF0aWMgTE9ORyBNRElfQ2hpbGRBY3RpdmF0ZSggV05EICpjbGllbnRQdHIsIEhXTkQzMiBoV25kQ2hpbGQgKQogewogICAgIE1ESUNMSUVOVElORk8gICAgICAgKmNsaWVudEluZm8gPSAoTURJQ0xJRU5USU5GTyopY2xpZW50UHRyLT53RXh0cmE7IAotICAgIEhXTkQxNiAgICAgICAgICAgICAgICAgcHJldkFjdGl2ZVduZCA9IGNsaWVudEluZm8tPmh3bmRBY3RpdmVDaGlsZDsKKyAgICBIV05EMzIgICAgICAgICAgICAgICBwcmV2QWN0aXZlV25kID0gY2xpZW50SW5mby0+aHduZEFjdGl2ZUNoaWxkOwogICAgIFdORCAgICAgICAgICAgICAgICAgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBoV25kQ2hpbGQgKTsKICAgICBXTkQJCQkqd25kUHJldiA9IFdJTl9GaW5kV25kUHRyKCBwcmV2QWN0aXZlV25kICk7CiAgICAgQk9PTDMyCQkgaXNBY3RpdmVGcmFtZVduZCA9IDA7CSAKQEAgLTU0Miw3ICs1MTIsNyBAQAogICAgIHsKIAl3bmRQcmV2LT5kd1N0eWxlIHw9IFdTX1NZU01FTlU7CiAJU2VuZE1lc3NhZ2UzMkEoIHByZXZBY3RpdmVXbmQsIFdNX05DQUNUSVZBVEUsIEZBTFNFLCAwTCApOwotICAgICAgICBTZW5kTWVzc2FnZTMyQSggcHJldkFjdGl2ZVduZCwgV01fTURJQUNUSVZBVEUsIChXUEFSQU0zMilwcmV2QWN0aXZlV25kLCAKKyAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIHByZXZBY3RpdmVXbmQsIFdNX01ESUFDVElWQVRFLCAoV1BBUkFNMzIpcHJldkFjdGl2ZVduZCwKICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0paFduZENoaWxkKTsKICAgICAgICAgLyogdW5jaGVjayBtZW51IGl0ZW0gKi8KICAgICAgICAJaWYoIGNsaWVudEluZm8tPmhXaW5kb3dNZW51ICkKQEAgLTU1NiwxMSArNTI2LDEwIEBACiAgICAgICAgIGlmKCBoV25kQ2hpbGQgKQogCXsKIAkJICBjbGllbnRJbmZvLT5od25kQWN0aXZlQ2hpbGQgPSBoV25kQ2hpbGQ7Ci0JCSAgU2hvd1dpbmRvdzE2KCBoV25kQ2hpbGQsIFNXX1NIT1dNQVhJTUlaRUQpOworCQkgIFNob3dXaW5kb3czMiggaFduZENoaWxkLCBTV19TSE9XTUFYSU1JWkVEKTsKIAl9CiAJZWxzZQotCQlTaG93V2luZG93MTYoIGNsaWVudEluZm8tPmh3bmRBY3RpdmVDaGlsZCwgCi0JCQkgICAgU1dfU0hPV05PUk1BTCApOworCQlTaG93V2luZG93MzIoIGNsaWVudEluZm8tPmh3bmRBY3RpdmVDaGlsZCwgU1dfU0hPV05PUk1BTCApOwogCiAgICAgY2xpZW50SW5mby0+aHduZEFjdGl2ZUNoaWxkID0gaFduZENoaWxkOwogCkBAIC01ODIsMTAgKzU1MSwxMCBAQAogCiAgICAgaWYoIGlzQWN0aXZlRnJhbWVXbmQgKQogICAgIHsKLQkgICAgU2VuZE1lc3NhZ2UxNiggaFduZENoaWxkLCBXTV9OQ0FDVElWQVRFLCBUUlVFLCAwTCk7CisJICAgIFNlbmRNZXNzYWdlMzJBKCBoV25kQ2hpbGQsIFdNX05DQUNUSVZBVEUsIFRSVUUsIDBMKTsKIAkgICAgaWYoIEdldEZvY3VzMzIoKSA9PSBjbGllbnRJbmZvLT5zZWxmICkKLQkJU2VuZE1lc3NhZ2UxNiggY2xpZW50SW5mby0+c2VsZiwgV01fU0VURk9DVVMsIAotCQkJICAgIChXUEFSQU0xNiljbGllbnRJbmZvLT5zZWxmLCAwTCApOworCQlTZW5kTWVzc2FnZTMyQSggY2xpZW50SW5mby0+c2VsZiwgV01fU0VURk9DVVMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMzIpY2xpZW50SW5mby0+c2VsZiwgMEwgKTsKIAkgICAgZWxzZQogCQlTZXRGb2N1czMyKCBjbGllbnRJbmZvLT5zZWxmICk7CiAgICAgfQpAQCAtNjQ5LDggKzYxOCw4IEBACiAJV05EKioJaGVhcFB0ciA9IHBwV25kOwogCWlmKCB0b3RhbCApCiAJewotCSAgICBJTlQxNglkZWx0YSA9IDAsIG4gPSAwOwotCSAgICBQT0lOVDE2CXBvc1syXTsKKwkgICAgSU5UMzIJZGVsdGEgPSAwLCBuID0gMDsKKwkgICAgUE9JTlQzMglwb3NbMl07CiAJICAgIGlmKCB0b3RhbCA8IGNpLT5uQWN0aXZlQ2hpbGRyZW4gKQogCQlkZWx0YSA9IFNZU01FVFJJQ1NfQ1lJQ09OU1BBQ0lORyArIFNZU01FVFJJQ1NfQ1lJQ09OOwogCkBAIC02NjEsMzAgKzYzMCwzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcHBXbmQpLT5od25kU2VsZiwgcG9zWzBdLngsIHBvc1swXS55LCBwb3NbMV0ueCwgcG9zWzFdLnkpOwogCiAJCU1ESV9DYWxjRGVmYXVsdENoaWxkUG9zKGNsaWVudFduZCwgbisrLCBwb3MsIGRlbHRhKTsKLQkJU2V0V2luZG93UG9zMzIoKCpwcFduZCktPmh3bmRTZWxmLCAwLCBwb3NbMF0ueCwgcG9zWzBdLnksIHBvc1sxXS54LCBwb3NbMV0ueSwKLQkJCQkJICAgICAgU1dQX0RSQVdGUkFNRSB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSKTsKKwkJU2V0V2luZG93UG9zMzIoICgqcHBXbmQpLT5od25kU2VsZiwgMCwgcG9zWzBdLngsIHBvc1swXS55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NbMV0ueCwgcG9zWzFdLnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXUF9EUkFXRlJBTUUgfCBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUik7CiAJCXBwV25kKys7CiAJICAgIH0KIAl9CiAJSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGhlYXBQdHIgKTsKICAgICB9CiAKLSAgICBpZiggdG90YWwgPCBjaS0+bkFjdGl2ZUNoaWxkcmVuICkgQXJyYW5nZUljb25pY1dpbmRvd3MzMiggY2xpZW50V25kLT5od25kU2VsZiApOworICAgIGlmKCB0b3RhbCA8IGNpLT5uQWN0aXZlQ2hpbGRyZW4gKQorICAgICAgICBBcnJhbmdlSWNvbmljV2luZG93czMyKCBjbGllbnRXbmQtPmh3bmRTZWxmICk7CiAgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJTURJVGlsZQogICovCi1zdGF0aWMgTE9ORyBNRElUaWxlKFdORCogd25kQ2xpZW50LCBNRElDTElFTlRJTkZPICpjaSxXT1JEIHdQYXJhbSkKK3N0YXRpYyB2b2lkIE1ESVRpbGUoIFdORCogd25kQ2xpZW50LCBNRElDTElFTlRJTkZPICpjaSwgV1BBUkFNMzIgd1BhcmFtICkKIHsKICAgICBXTkQqKglwcFduZDsKICAgICBVSU5UMzIJdG90YWwgPSAwOwogCiAgICAgaWYgKGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQpCi0JU2hvd1dpbmRvdzE2KGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQsIFNXX05PUk1BTCk7CisJU2hvd1dpbmRvdzMyKGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQsIFNXX05PUk1BTCk7CiAKLSAgICBpZiAoY2ktPm5BY3RpdmVDaGlsZHJlbiA9PSAwKSByZXR1cm4gMDsKKyAgICBpZiAoY2ktPm5BY3RpdmVDaGlsZHJlbiA9PSAwKSByZXR1cm47CiAKICAgICBwcFduZCA9IFdJTl9CdWlsZFdpbkFycmF5KHduZENsaWVudCwgQldBX1NLSVBISURERU4gfCBCV0FfU0tJUE9XTkVEIHwgQldBX1NLSVBJQ09OSUMgfAogCSAgICAoKHdQYXJhbSAmIE1ESVRJTEVfU0tJUERJU0FCTEVEKT8gQldBX1NLSVBESVNBQkxFRCA6IDApLCAmdG90YWwgKTsKQEAgLTc0NCw3ICs3MTUsNiBAQAogICAgIH0KICAgCiAgICAgaWYoIHRvdGFsIDwgY2ktPm5BY3RpdmVDaGlsZHJlbiApIEFycmFuZ2VJY29uaWNXaW5kb3dzMzIoIHduZENsaWVudC0+aHduZFNlbGYgKTsKLSAgICByZXR1cm4gMDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnJhbWUgd2luZG93IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTc1NCwxMCArNzI0LDEwIEBACiAgKgkJCQkJTURJX0F1Z21lbnRGcmFtZU1lbnUKICAqLwogc3RhdGljIEJPT0wzMiBNRElfQXVnbWVudEZyYW1lTWVudSggTURJQ0xJRU5USU5GTyogY2ksIFdORCAqZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV05EMTYgaENoaWxkICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTkQzMiBoQ2hpbGQgKQogewogICAgIFdORCoJY2hpbGQgPSBXSU5fRmluZFduZFB0cihoQ2hpbGQpOwotICAgIEhNRU5VMTYgIAloU3lzUG9wdXAgPSAwOworICAgIEhNRU5VMzIgIAloU3lzUG9wdXAgPSAwOwogCiAgICAgZHByaW50Zl9tZGkoc3RkZGViLCJNRElfQXVnbWVudEZyYW1lTWVudTogZnJhbWUgJXAsY2hpbGQgJTA0eFxuIixmcmFtZSxoQ2hpbGQpOwogCkBAIC03OTcsNyArNzY3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJTURJX1Jlc3RvcmVGcmFtZU1lbnUKICAqLwotc3RhdGljIEJPT0wzMiBNRElfUmVzdG9yZUZyYW1lTWVudSggV05EICpmcmFtZVduZCwgSFdORDE2IGhDaGlsZCApCitzdGF0aWMgQk9PTDMyIE1ESV9SZXN0b3JlRnJhbWVNZW51KCBXTkQgKmZyYW1lV25kLCBIV05EMzIgaENoaWxkICkKIHsKICAgICBJTlQzMiBuSXRlbXMgPSBHZXRNZW51SXRlbUNvdW50MzIoZnJhbWVXbmQtPndJRG1lbnUpIC0gMTsKIApAQCAtODIxLDcgKzc5MSw3IEBACiAgKgogICogTm90ZTogbHBUaXRsZSBjYW4gYmUgTlVMTAogICovCi1zdGF0aWMgdm9pZCBNRElfVXBkYXRlRnJhbWVUZXh0KCBXTkQgKmZyYW1lV25kLCBIV05EMTYgaENsaWVudCwKK3N0YXRpYyB2b2lkIE1ESV9VcGRhdGVGcmFtZVRleHQoIFdORCAqZnJhbWVXbmQsIEhXTkQzMiBoQ2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIHJlcGFpbnQsIExQQ1NUUiBscFRpdGxlICkKIHsKICAgICBjaGFyICAgbHBCdWZmZXJbTURJX01BWFRJVExFTEVOR1RIKzFdOwpAQCAtODMwLDYgKzgwMCwxMiBAQAogCiAgICAgZHByaW50Zl9tZGkoc3RkZGViLCAiTURJOiByZXBhaW50ICVpLCBmcmFtZVRleHQgJXNcbiIsIHJlcGFpbnQsIChscFRpdGxlKT9scFRpdGxlOiJOVUxMIik7CiAKKyAgICBpZiAoIWNsaWVudFduZCkKKyAgICAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFjaSkKKyAgICAgICAgICAgcmV0dXJuOworCiAgICAgLyogc3RvcmUgbmV3ICJkZWZhdWx0IiB0aXRsZSBpZiBscFRpdGxlIGlzIG5vdCBOVUxMICovCiAgICAgaWYgKGxwVGl0bGUpIAogICAgIHsKQEAgLTg5MiwxMCArODY4LDEwIEBACiAgKgogICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGFsbCBNREkgcmVxdWVzdHMuCiAgKi8KLUxSRVNVTFQgV0lOQVBJIE1ESUNsaWVudFduZFByb2MoSFdORDE2IGh3bmQsIFVJTlQxNiBtZXNzYWdlLCBXUEFSQU0xNiB3UGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0pCitMUkVTVUxUIFdJTkFQSSBNRElDbGllbnRXbmRQcm9jKCBIV05EMzIgaHduZCwgVUlOVDMyIG1lc3NhZ2UsIFdQQVJBTTMyIHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKQogewotICAgIExQQ1JFQVRFU1RSVUNUMTYgICAgIGNzOworICAgIExQQ1JFQVRFU1RSVUNUMzJBICAgIGNzOwogICAgIE1ESUNMSUVOVElORk8gICAgICAgKmNpOwogICAgIFJFQ1QzMgkJIHJlY3Q7CiAgICAgV05EICAgICAgICAgICAgICAgICAqdyAJICA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwpAQCAtOTA4LDcgKzg4NCw3IEBACiAgICAgewogICAgICAgY2FzZSBXTV9DUkVBVEU6CiAKLQljcyA9IChMUENSRUFURVNUUlVDVDE2KSBQVFJfU0VHX1RPX0xJTihsUGFyYW0pOworCWNzID0gKExQQ1JFQVRFU1RSVUNUMzJBKWxQYXJhbTsKIAogCS8qIFRyYW5zbGF0aW9uIGxheWVyIGRvZXNuJ3Qga25vdyB3aGF0J3MgaW4gdGhlIGNzLT5scENyZWF0ZVBhcmFtcwogCSAqIHNvIHdlIGhhdmUgdG8ga2VlcCB0cmFjayBvZiB3aGF0IGVudmlyb25tZW50IHdlJ3JlIGluLiAqLwpAQCAtOTY2LDUyICs5NDIsNDYgQEAKIAlyZXR1cm4gMDsKIAogICAgICAgY2FzZSBXTV9NRElBQ1RJVkFURToKLSAgICAgICAgaWYoIGNpLT5od25kQWN0aXZlQ2hpbGQgIT0gKEhXTkQxNil3UGFyYW0gKQotCSAgICBTZXRXaW5kb3dQb3MzMigoSFdORDMyKXdQYXJhbSwgMCwwLDAsMCwwLCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSApOyAKKyAgICAgICAgaWYoIGNpLT5od25kQWN0aXZlQ2hpbGQgIT0gKEhXTkQzMil3UGFyYW0gKQorCSAgICBTZXRXaW5kb3dQb3MzMigoSFdORDMyKXdQYXJhbSwgMCwwLDAsMCwwLCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSk7CiAJcmV0dXJuIDA7CiAKICAgICAgIGNhc2UgV01fTURJQ0FTQ0FERToKIAlyZXR1cm4gTURJQ2FzY2FkZSh3LCBjaSk7CiAKICAgICAgIGNhc2UgV01fTURJQ1JFQVRFOgotICAgICAgICBpZiggbFBhcmFtICkKLQl7Ci0JICAgIE1ESUNSRUFURVNUUlVDVDE2KiBjcyA9IChNRElDUkVBVEVTVFJVQ1QxNiopIFBUUl9TRUdfVE9fTElOKGxQYXJhbSk7Ci0JICAgIHJldHVybiAoTE9ORylNRElDcmVhdGVDaGlsZCh3LCBjaSwgaHduZCwgY3MsIGxQYXJhbSApOwotCX0KKyAgICAgICAgaWYgKGxQYXJhbSkgcmV0dXJuIE1ESUNyZWF0ZUNoaWxkKCB3LCBjaSwgaHduZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTURJQ1JFQVRFU1RSVUNUMzJBKilsUGFyYW0gKTsKIAlyZXR1cm4gMDsKIAogICAgICAgY2FzZSBXTV9NRElERVNUUk9ZOgotCXJldHVybiAoTE9ORylNRElEZXN0cm95Q2hpbGQodywgY2ksIGh3bmQsIChIV05EMzIpd1BhcmFtLCBUUlVFKTsKKwlyZXR1cm4gTURJRGVzdHJveUNoaWxkKCB3LCBjaSwgaHduZCwgKEhXTkQzMil3UGFyYW0sIFRSVUUgKTsKIAogICAgICAgY2FzZSBXTV9NRElHRVRBQ1RJVkU6Ci0JcmV0dXJuICgoTE9ORykgY2ktPmh3bmRBY3RpdmVDaGlsZCB8IAotCQkoKExPTkcpIChjaS0+aHduZENoaWxkTWF4aW1pemVkPjApIDw8IDE2KSk7CisgICAgICAgICAgaWYgKGxQYXJhbSkgKihCT09MMzIgKilsUGFyYW0gPSAoY2ktPmh3bmRDaGlsZE1heGltaXplZCA+IDApOworICAgICAgICAgIHJldHVybiBjaS0+aHduZEFjdGl2ZUNoaWxkOwogCiAgICAgICBjYXNlIFdNX01ESUlDT05BUlJBTkdFOgogCWNpLT5tZGlGbGFncyB8PSBNRElGX05FRURVUERBVEU7Ci0JTURJSWNvbkFycmFuZ2UoaHduZCk7CisgICAgICAgIEFycmFuZ2VJY29uaWNXaW5kb3dzMzIoaHduZCk7CiAJY2ktPnNiUmVjYWxjID0gU0JfQk9USCsxOwotCVNlbmRNZXNzYWdlMTYoaHduZCwgV01fTURJQ0FMQ0NISUxEU0NST0xMLCAwLCAwTCk7CisJU2VuZE1lc3NhZ2UzMkEoaHduZCwgV01fTURJQ0FMQ0NISUxEU0NST0xMLCAwLCAwTCk7CiAJcmV0dXJuIDA7CiAJCiAgICAgICBjYXNlIFdNX01ESU1BWElNSVpFOgotCVNob3dXaW5kb3cxNigoSFdORDE2KXdQYXJhbSwgU1dfTUFYSU1JWkUpOworCVNob3dXaW5kb3czMiggKEhXTkQzMil3UGFyYW0sIFNXX01BWElNSVpFICk7CiAJcmV0dXJuIDA7CiAKICAgICAgIGNhc2UgV01fTURJTkVYVDogLyogbFBhcmFtICE9IDAgbWVhbnMgcHJldmlvdXMgd2luZG93ICovCi0JTURJX1N3aXRjaEFjdGl2ZUNoaWxkKGh3bmQsIChIV05EMTYpd1BhcmFtLCAobFBhcmFtKT8gRkFMU0UgOiBUUlVFICk7CisJTURJX1N3aXRjaEFjdGl2ZUNoaWxkKGh3bmQsIChIV05EMzIpd1BhcmFtLCAobFBhcmFtKT8gRkFMU0UgOiBUUlVFICk7CiAJYnJlYWs7CiAJCiAgICAgICBjYXNlIFdNX01ESVJFU1RPUkU6Ci0JU2hvd1dpbmRvdzE2KCAoSFdORDE2KXdQYXJhbSwgU1dfTk9STUFMKTsKKwlTaG93V2luZG93MzIoIChIV05EMzIpd1BhcmFtLCBTV19OT1JNQUwpOwogCXJldHVybiAwOwogCiAgICAgICBjYXNlIFdNX01ESVNFVE1FTlU6Ci0gICAgICAgICAgLyogaWYgV2luZWxpYjMyOgotICAgICAgICAgICAqIHJldHVybiAoTFJFU1VMVClNRElTZXRNZW51KGh3bmQsIEZBTFNFLCAoSE1FTlUxNil3UGFyYW0sIChITUVOVTE2KWxQYXJhbSk7Ci0gICAgICAgICAgICovCi0gICAgICAgICAgcmV0dXJuIChMUkVTVUxUKU1ESVNldE1lbnUoaHduZCwgd1BhcmFtLCBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkpOworICAgICAgICAgIHJldHVybiBNRElTZXRNZW51KCBod25kLCAoSE1FTlUzMil3UGFyYW0sIChITUVOVTMyKWxQYXJhbSApOwogCQogICAgICAgY2FzZSBXTV9NRElUSUxFOgogCWNpLT5tZGlGbGFncyB8PSBNRElGX05FRURVUERBVEU7CkBAIC0xMDM4LDE5ICsxMDA4LDE4IEBACiAJCiAgICAgICBjYXNlIFdNX05DQUNUSVZBVEU6CiAgICAgICAgIGlmKCBjaS0+aHduZEFjdGl2ZUNoaWxkICkKLQkgICAgIFNlbmRNZXNzYWdlMTYoY2ktPmh3bmRBY3RpdmVDaGlsZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOworCSAgICAgU2VuZE1lc3NhZ2UzMkEoY2ktPmh3bmRBY3RpdmVDaGlsZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwogCWJyZWFrOwogCQogICAgICAgY2FzZSBXTV9QQVJFTlROT1RJRlk6Ci0gICAgICAgIGlmKCB3UGFyYW0gPT0gV01fTEJVVFRPTkRPV04gKQorICAgICAgICBpZiAoTE9XT1JEKHdQYXJhbSkgPT0gV01fTEJVVFRPTkRPV04pCiAgICAgICAgIHsKICAgICAgICAgICAgIFBPSU5UMTYgIHB0ID0gTUFLRVBPSU5UMTYobFBhcmFtKTsKICAgICAgICAgICAgIEhXTkQxNiBjaGlsZCA9IENoaWxkV2luZG93RnJvbVBvaW50MTYoaHduZCwgcHQpOwogCiAJICAgIGRwcmludGZfbWRpKHN0ZGRlYiwiTURJQ2xpZW50OiBub3RpZmljYXRpb24gZnJvbSAlMDR4ICglaSwlaSlcbiIsY2hpbGQscHQueCxwdC55KTsKIAotICAgICAgICAgICAgaWYoIGNoaWxkICYmIGNoaWxkICE9IGh3bmQgJiYKLQkJCSBjaGlsZCAhPSBjaS0+aHduZEFjdGl2ZUNoaWxkICkKKyAgICAgICAgICAgIGlmKCBjaGlsZCAmJiBjaGlsZCAhPSBod25kICYmIGNoaWxkICE9IGNpLT5od25kQWN0aXZlQ2hpbGQgKQogICAgICAgICAgICAgICAgIFNldFdpbmRvd1BvczMyKGNoaWxkLCAwLDAsMCwwLDAsIFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFICk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CkBAIC0xMDU5LDEwICsxMDI4LDEwIEBACiAgICAgICAgIGlmKCBjaS0+aHduZENoaWxkTWF4aW1pemVkICkKIAl7CiAJICAgIFdORCoJY2hpbGQgPSBXSU5fRmluZFduZFB0cihjaS0+aHduZENoaWxkTWF4aW1pemVkKTsKLQkgICAgUkVDVDE2CXJlY3QgID0geyAwLCAwLCBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkgfTsKKwkgICAgUkVDVDMyCXJlY3QgID0geyAwLCAwLCBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkgfTsKIAotCSAgICBBZGp1c3RXaW5kb3dSZWN0RXgxNigmcmVjdCwgY2hpbGQtPmR3U3R5bGUsIDAsIGNoaWxkLT5kd0V4U3R5bGUpOwotCSAgICBNb3ZlV2luZG93MTYoY2ktPmh3bmRDaGlsZE1heGltaXplZCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwKKwkgICAgQWRqdXN0V2luZG93UmVjdEV4MzIoJnJlY3QsIGNoaWxkLT5kd1N0eWxlLCAwLCBjaGlsZC0+ZHdFeFN0eWxlKTsKKwkgICAgTW92ZVdpbmRvdzMyKGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQsIHJlY3QubGVmdCwgcmVjdC50b3AsCiAJCQkgcmVjdC5yaWdodCAtIHJlY3QubGVmdCwgcmVjdC5ib3R0b20gLSByZWN0LnRvcCwgMSk7CiAJfQogCWVsc2UKQEAgLTEwODAsNyArMTA0OSw3IEBACiAJcmV0dXJuIDA7CiAgICAgfQogICAgIAotICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMTYoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOworICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMzJBKCBod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOwogfQogCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvbm9uY2xpZW50LmMgYi93aW5kb3dzL25vbmNsaWVudC5jCmluZGV4IDM2MzhlYmMuLjkyMzU4MzYgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvbm9uY2xpZW50LmMKKysrIGIvd2luZG93cy9ub25jbGllbnQuYwpAQCAtNSw2ICs1LDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgInZlcnNpb24uaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJtZXNzYWdlLmgiCiAjaW5jbHVkZSAic3lzbWV0cmljcy5oIgpAQCAtMTMzMiwyMiArMTMzMyw2IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE5DX1RyYWNrU3lzTWVudQotICoKLSAqIFRyYWNrIGEgbW91c2UgYnV0dG9uIHByZXNzIG9uIHRoZSBzeXN0ZW0gbWVudS4KLSAqIFRPRE86IFVuaWZ5IHdpdGggTkNfVHJhY2tNaW5NYXhCb3goKSAoYW5kIHdpdGhvdXQgSW50ZXJuYWxHZXRNZXNzYWdlKCkgY2FsbHMpLgotICovCi1zdGF0aWMgdm9pZCBOQ19UcmFja1N5c01lbnUoIEhXTkQzMiBod25kLCBQT0lOVDE2IHB0ICkKLXsKLSAgICBXTkQqCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7Ci0gICAgCi0gICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1NZU01FTlUpCi0JU2VuZE1lc3NhZ2UxNiggaHduZCwgV01fU1lTQ09NTUFORCwgCi0JCVNDX01PVVNFTUVOVSArIEhUU1lTTUVOVSwgKigoTFBBUkFNKikmcHQpKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBOQ19TdGFydFNpemVNb3ZlCiAgKgogICogSW5pdGlhbGlzYXRpb24gb2YgYSBtb3ZlIG9yIHJlc2l6ZSwgd2hlbiBpbml0aWF0aWVkIGZyb20gYSBtZW51IGNob2ljZS4KQEAgLTE0NTAsNyArMTQzNSw3IEBACiAgICAgV05EICogICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAgICAgQk9PTDMyICAgIHRoaWNrZnJhbWUgPSBIQVNfVEhJQ0tGUkFNRSggd25kUHRyLT5kd1N0eWxlICk7CiAgICAgQk9PTDMyICAgIGljb25pYyA9IHduZFB0ci0+ZHdTdHlsZSAmIFdTX01JTklNSVpFOwotICAgIGludCAgICAgICBtb3ZlZCA9IDA7CisgICAgQk9PTDMyICAgIG1vdmVkID0gRkFMU0U7CiAKICAgICBpZiAoSXNab29tZWQzMihod25kKSB8fCAhSXNXaW5kb3dWaXNpYmxlMzIoaHduZCkgfHwKICAgICAgICAgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTUFOQUdFRCkpIHJldHVybjsKQEAgLTE1MjEsMTkgKzE1MDYsMTIgQEAKIAlpZiAocm9vdFdpbmRvdyA9PSBEZWZhdWx0Um9vdFdpbmRvdyhkaXNwbGF5KSkgWEdyYWJTZXJ2ZXIoIGRpc3BsYXkgKTsKICAgICB9CiAKLSAgICBpZiggaWNvbmljICkKKyAgICBpZiggaWNvbmljICkgLyogY3JlYXRlIGEgY3Vyc29yIGZvciBkcmFnZ2luZyAqLwogICAgIHsKLQlISUNPTjE2IGhJY29uID0gKHduZFB0ci0+Y2xhc3MtPmhJY29uKQotICAgICAgICAgICAgICAgICAgICAgID8gd25kUHRyLT5jbGFzcy0+aEljb24KKwlISUNPTjE2IGhJY29uID0gKHduZFB0ci0+Y2xhc3MtPmhJY29uKSA/IHduZFB0ci0+Y2xhc3MtPmhJY29uCiAgICAgICAgICAgICAgICAgICAgICAgOiAoSElDT04xNilTZW5kTWVzc2FnZTE2KCBod25kLCBXTV9RVUVSWURSQUdJQ09OLCAwLCAwTCk7Ci0JaWYoIGhJY29uICkKLQl7Ci0JICAgIGhEcmFnQ3Vyc29yID0gIENVUlNPUklDT05fSWNvblRvQ3Vyc29yKCBoSWNvbiwgVFJVRSApOwotCSAgICBoT2xkQ3Vyc29yID0gU2V0Q3Vyc29yMzIoaERyYWdDdXJzb3IpOwotCSAgICBTaG93Q3Vyc29yMzIoIFRSVUUgKTsKLQl9IAotCWVsc2UgaWNvbmljID0gRkFMU0U7Ci0JV0lOUE9TX1Nob3dJY29uVGl0bGUoIHduZFB0ciwgRkFMU0UgKTsKKwlpZiggaEljb24gKSBoRHJhZ0N1cnNvciA9ICBDVVJTT1JJQ09OX0ljb25Ub0N1cnNvciggaEljb24sIFRSVUUgKTsKKwlpZiggIWhEcmFnQ3Vyc29yICkgaWNvbmljID0gRkFMU0U7CiAgICAgfQogCiAgICAgaWYoICFpY29uaWMgKSBOQ19EcmF3TW92aW5nRnJhbWUoIGhkYywgJnNpemluZ1JlY3QsIHRoaWNrZnJhbWUgKTsKQEAgLTE1NzQsNyArMTU1MiwxNyBAQAogCiAJaWYgKGR4IHx8IGR5KQogCXsKLSAgICAgICAgICAgIG1vdmVkID0gMTsKKwkgICAgaWYoICFtb3ZlZCApCisJICAgIHsKKwkJbW92ZWQgPSBUUlVFOworICAgICAgICAJaWYoIGljb25pYyApIC8qIG9rLCBubyBzeXN0ZW0gcG9wdXAgdHJhY2tpbmcgKi8KKwkJeworCQkgICAgaE9sZEN1cnNvciA9IFNldEN1cnNvcjMyKGhEcmFnQ3Vyc29yKTsKKwkJICAgIFNob3dDdXJzb3IzMiggVFJVRSApOworCQkgICAgV0lOUE9TX1Nob3dJY29uVGl0bGUoIHduZFB0ciwgRkFMU0UgKTsKKwkJfQorCSAgICB9CisKIAkgICAgaWYgKG1zZy5tZXNzYWdlID09IFdNX0tFWURPV04pIFNldEN1cnNvclBvczMyKCBwdC54LCBwdC55ICk7CiAJICAgIGVsc2UKIAkgICAgewpAQCAtMTU5OSw5ICsxNTg3LDEyIEBACiAgICAgUmVsZWFzZUNhcHR1cmUoKTsKICAgICBpZiggaWNvbmljICkKICAgICB7Ci0JU2hvd0N1cnNvcjMyKCBGQUxTRSApOwotCVNldEN1cnNvcjMyKGhPbGRDdXJzb3IpOwotCWlmKCBoRHJhZ0N1cnNvciApIERlc3Ryb3lDdXJzb3IzMiggaERyYWdDdXJzb3IgKTsKKwlpZiggbW92ZWQgKSAvKiByZXN0b3JlIGN1cnNvcnMsIHNob3cgaWNvbiB0aXRsZSBsYXRlciBvbiAqLworCXsKKwkgICAgU2hvd0N1cnNvcjMyKCBGQUxTRSApOworCSAgICBTZXRDdXJzb3IzMiggaE9sZEN1cnNvciApOworCX0KKyAgICAgICAgRGVzdHJveUN1cnNvcjMyKCBoRHJhZ0N1cnNvciApOwogICAgIH0KICAgICBlbHNlCiAJTkNfRHJhd01vdmluZ0ZyYW1lKCBoZGMsICZzaXppbmdSZWN0LCB0aGlja2ZyYW1lICk7CkBAIC0xNjE2LDQwICsxNjA3LDQzIEBACiAKICAgICBpZiAoSE9PS19Jc0hvb2tlZCggV0hfQ0JUICkpCiAgICAgewotICAgICAgIFJFQ1QxNiogcHIgPSBTRUdQVFJfTkVXKFJFQ1QxNik7Ci0gICAgICAgaWYoIHByICkKLSAgICAgICB7Ci0gICAgICAgICAgIENPTlZfUkVDVDMyVE8xNiggJnNpemluZ1JlY3QsIHByICk7Ci0JICBpZiggSE9PS19DYWxsSG9va3MxNiggV0hfQ0JULCBIQ0JUX01PVkVTSVpFLCBod25kLAorCVJFQ1QxNiogcHIgPSBTRUdQVFJfTkVXKFJFQ1QxNik7CisJaWYoIHByICkKKwl7CisgICAgICAgICAgICBDT05WX1JFQ1QzMlRPMTYoICZzaXppbmdSZWN0LCBwciApOworCSAgICBpZiggSE9PS19DYWxsSG9va3MxNiggV0hfQ0JULCBIQ0JUX01PVkVTSVpFLCBod25kLAogCQkJICAgICAgICAoTFBBUkFNKVNFR1BUUl9HRVQocHIpKSApCi0JICAgICAgc2l6aW5nUmVjdCA9IHduZFB0ci0+cmVjdFdpbmRvdzsKLQkgIGVsc2UKLQkgICAgICBDT05WX1JFQ1QxNlRPMzIoIHByLCAmc2l6aW5nUmVjdCApOwotCSAgU0VHUFRSX0ZSRUUocHIpOwotICAgICAgIH0KKwkJc2l6aW5nUmVjdCA9IHduZFB0ci0+cmVjdFdpbmRvdzsKKwkgICAgZWxzZQorCQlDT05WX1JFQ1QxNlRPMzIoIHByLCAmc2l6aW5nUmVjdCApOworCSAgICBTRUdQVFJfRlJFRShwcik7CisJfQogICAgIH0KICAgICBTZW5kTWVzc2FnZTE2KCBod25kLCBXTV9FWElUU0laRU1PVkUsIDAsIDAgKTsKICAgICBTZW5kTWVzc2FnZTE2KCBod25kLCBXTV9TRVRWSVNJQkxFLCAhSXNJY29uaWMxNihod25kKSwgMEwpOwogCi0gICAgLyogU2luZ2xlIGNsaWNrIGJyaW5ncyB1cCB0aGUgc3lzdGVtIG1lbnUgd2hlbiBpY29uaXplZCAqLwotCi0gICAgaWYoIG1vdmVkICkKKyAgICBpZiggbW92ZWQgJiYgISgobXNnLm1lc3NhZ2UgPT0gV01fS0VZRE9XTikgJiYgKG1zZy53UGFyYW0gPT0gVktfRVNDQVBFKSkgKQogICAgIHsKLQlpZiAoKG1zZy5tZXNzYWdlID09IFdNX0tFWURPV04pICYmIChtc2cud1BhcmFtID09IFZLX0VTQ0FQRSkpIHJldHVybjsKLQogCS8qIE5PVEU6IFNXUF9OT0FDVElWQVRFIHByZXZlbnRzIGRvY3VtZW50IHdpbmRvdyBhY3RpdmF0aW9uIGluIFdvcmQgNiAqLwogCVNldFdpbmRvd1BvczMyKCBod25kLCAwLCBzaXppbmdSZWN0LmxlZnQsIHNpemluZ1JlY3QudG9wLAogCQkJc2l6aW5nUmVjdC5yaWdodCAtIHNpemluZ1JlY3QubGVmdCwKIAkJCXNpemluZ1JlY3QuYm90dG9tIC0gc2l6aW5nUmVjdC50b3AsCiAJCSAgICAgICggaGl0dGVzdCA9PSBIVENBUFRJT04gKSA/IFNXUF9OT1NJWkUgOiAwICk7CiAgICAgfQotICAgIGlmKCB3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSApCi0gICAgewotCVdJTlBPU19TaG93SWNvblRpdGxlKCB3bmRQdHIsIFRSVUUgKTsKLQlpZiAoIW1vdmVkICYmICh3bmRQdHItPmR3U3R5bGUgJiBXU19TWVNNRU5VKSkKLSAgICAgICAgICAgIFNlbmRNZXNzYWdlMTYoIGh3bmQsIFdNX1NZU0NPTU1BTkQsIFNDX01PVVNFTUVOVSArIEhUU1lTTUVOVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMUEFSQU0oIHB0LngsIHB0LnkgKSApOwotICAgIH0KKworICAgIGlmKCBJc1dpbmRvdzMyKGh3bmQpICkKKwlpZiggd25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUgKQorCXsKKwkgICAgLyogU2luZ2xlIGNsaWNrIGJyaW5ncyB1cCB0aGUgc3lzdGVtIG1lbnUgd2hlbiBpY29uaXplZCAqLworCisJICAgIGlmKCAhbW92ZWQgKSAKKwkgICAgeworCQkgaWYoIHduZFB0ci0+ZHdTdHlsZSAmIFdTX1NZU01FTlUgKSAKKwkJICAgICBTZW5kTWVzc2FnZTE2KCBod25kLCBXTV9TWVNDT01NQU5ELAorCQkJCSAgICBTQ19NT1VTRU1FTlUgKyBIVFNZU01FTlUsICooKExQQVJBTSopJnB0KSk7CisJICAgIH0KKwkgICAgZWxzZSBXSU5QT1NfU2hvd0ljb25UaXRsZSggd25kUHRyLCBUUlVFICk7CisJfQogfQogCiAKQEAgLTE2NjMsMTggKzE2NTcsMTUgQEAKICAgICBNU0cxNiBtc2c7CiAgICAgSERDMzIgaGRjID0gR2V0V2luZG93REMzMiggaHduZCApOwogICAgIEJPT0wzMiBwcmVzc2VkID0gVFJVRTsKKyAgICB2b2lkICAoKnBhaW50QnV0dG9uKShIV05EMzIsIEhEQzE2LCBCT09MMzIpOwogCiAgICAgU2V0Q2FwdHVyZTMyKCBod25kICk7CiAgICAgaWYgKHdQYXJhbSA9PSBIVE1JTkJVVFRPTikKLQlpZihUV0VBS19XaW45NUxvb2spCi0JICAgIE5DX0RyYXdNaW5CdXR0b245NSggaHduZCwgaGRjLCBUUlVFICk7Ci0JZWxzZQotCSAgICBOQ19EcmF3TWluQnV0dG9uKCBod25kLCBoZGMsIFRSVUUgKTsKKwlwYWludEJ1dHRvbiA9IChUV0VBS19XaW45NUxvb2spID8gJk5DX0RyYXdNaW5CdXR0b245NSA6ICZOQ19EcmF3TWluQnV0dG9uOwogICAgIGVsc2UKLQlpZihUV0VBS19XaW45NUxvb2spCi0JICAgIE5DX0RyYXdNYXhCdXR0b245NSggaHduZCwgaGRjLCBUUlVFICk7Ci0JZWxzZQotCSAgICBOQ19EcmF3TWF4QnV0dG9uKCBod25kLCBoZGMsIFRSVUUgKTsKKwlwYWludEJ1dHRvbiA9IChUV0VBS19XaW45NUxvb2spID8gJk5DX0RyYXdNYXhCdXR0b245NSA6ICZOQ19EcmF3TWF4QnV0dG9uOworCisgICAgKCpwYWludEJ1dHRvbikoIGh3bmQsIGhkYywgVFJVRSApOwogCiAgICAgZG8KICAgICB7CkBAIC0xNjgzLDMwICsxNjc0LDEwIEBACiAKIAlwcmVzc2VkID0gKE5DX0hhbmRsZU5DSGl0VGVzdCggaHduZCwgbXNnLnB0ICkgPT0gd1BhcmFtKTsKIAlpZiAocHJlc3NlZCAhPSBvbGRzdGF0ZSkKLQl7Ci0JICAgIGlmICh3UGFyYW0gPT0gSFRNSU5CVVRUT04pCi0JCWlmKFRXRUFLX1dpbjk1TG9vaykKLQkJICAgIE5DX0RyYXdNaW5CdXR0b245NSggaHduZCwgaGRjLCBwcmVzc2VkICk7Ci0JCWVsc2UKLQkJICAgIE5DX0RyYXdNaW5CdXR0b24oIGh3bmQsIGhkYywgcHJlc3NlZCApOwotCSAgICBlbHNlCi0JCWlmKFRXRUFLX1dpbjk1TG9vaykKLQkJICAgIE5DX0RyYXdNYXhCdXR0b245NSggaHduZCwgaGRjLCBwcmVzc2VkICk7Ci0JCWVsc2UKLQkJICAgIE5DX0RyYXdNYXhCdXR0b24oIGh3bmQsIGhkYywgcHJlc3NlZCApOwotCX0KKwkgICAoKnBhaW50QnV0dG9uKSggaHduZCwgaGRjLCBwcmVzc2VkICk7CiAgICAgfSB3aGlsZSAobXNnLm1lc3NhZ2UgIT0gV01fTEJVVFRPTlVQKTsKIAotICAgIGlmICh3UGFyYW0gPT0gSFRNSU5CVVRUT04pCi0JaWYoVFdFQUtfV2luOTVMb29rKQotCSAgICBOQ19EcmF3TWluQnV0dG9uOTUoIGh3bmQsIGhkYywgRkFMU0UgKTsKLQllbHNlCi0JICAgIE5DX0RyYXdNaW5CdXR0b24oIGh3bmQsIGhkYywgRkFMU0UgKTsKLSAgICBlbHNlCi0JaWYoVFdFQUtfV2luOTVMb29rKQotCSAgICBOQ19EcmF3TWF4QnV0dG9uOTUoIGh3bmQsIGhkYywgRkFMU0UgKTsKLQllbHNlCi0JICAgIE5DX0RyYXdNYXhCdXR0b24oIGh3bmQsIGhkYywgRkFMU0UgKTsKKyAgICAoKnBhaW50QnV0dG9uKSggaHduZCwgaGRjLCBGQUxTRSApOwogCiAgICAgUmVsZWFzZUNhcHR1cmUoKTsKICAgICBSZWxlYXNlREMzMiggaHduZCwgaGRjICk7CkBAIC0xNzgxLDIwICsxNzUyLDM0IEBACiAgKgogICogSGFuZGxlIGEgV01fTkNMQlVUVE9ORE9XTiBtZXNzYWdlLiBDYWxsZWQgZnJvbSBEZWZXaW5kb3dQcm9jKCkuCiAgKi8KLUxPTkcgTkNfSGFuZGxlTkNMQnV0dG9uRG93biggSFdORDMyIGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCitMT05HIE5DX0hhbmRsZU5DTEJ1dHRvbkRvd24oIFdORCogcFduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKIHsKKyAgICBIV05EMzIgaHduZCA9IHBXbmQtPmh3bmRTZWxmOworCiAgICAgc3dpdGNoKHdQYXJhbSkgIC8qIEhpdCB0ZXN0ICovCiAgICAgewogICAgIGNhc2UgSFRDQVBUSU9OOgorCSBod25kID0gV0lOX0dldFRvcFBhcmVudChod25kKTsKIAotCWlmKCBXSU5QT1NfU2V0QWN0aXZlV2luZG93KFdJTl9HZXRUb3BQYXJlbnQoaHduZCksIFRSVUUsIFRSVUUpCi0JICAgIHx8IChHZXRBY3RpdmVXaW5kb3czMigpID09IFdJTl9HZXRUb3BQYXJlbnQoaHduZCkpICkKLQkJU2VuZE1lc3NhZ2UxNiggaHduZCwgV01fU1lTQ09NTUFORCwgU0NfTU9WRSArIEhUQ0FQVElPTiwgbFBhcmFtICk7Ci0JYnJlYWs7CisJIGlmKCBXSU5QT1NfU2V0QWN0aXZlV2luZG93KGh3bmQsIFRSVUUsIFRSVUUpIHx8IChHZXRBY3RpdmVXaW5kb3czMigpID09IGh3bmQpICkKKwkJU2VuZE1lc3NhZ2UxNiggcFduZC0+aHduZFNlbGYsIFdNX1NZU0NPTU1BTkQsIFNDX01PVkUgKyBIVENBUFRJT04sIGxQYXJhbSApOworCSBicmVhazsKIAogICAgIGNhc2UgSFRTWVNNRU5VOgotCVNlbmRNZXNzYWdlMTYoIGh3bmQsIFdNX1NZU0NPTU1BTkQsIFNDX01PVVNFTUVOVSArIEhUU1lTTUVOVSwgbFBhcmFtICk7Ci0JYnJlYWs7CisJIGlmKCBwV25kLT5kd1N0eWxlICYgV1NfU1lTTUVOVSApCisJIHsKKwkgICAgIGlmKCAhKHBXbmQtPmR3U3R5bGUgJiBXU19NSU5JTUlaRSkgKQorCSAgICAgeworCQlIREMzMiBoREMgPSBHZXRXaW5kb3dEQzMyKGh3bmQpOworCQlpZiggVFdFQUtfV2luOTVMb29rKQorCQkgICAgTkNfRHJhd1N5c0J1dHRvbjk1KCBod25kLCBoREMsIFRSVUUgKTsKKwkJZWxzZQorCQkgICAgTkNfRHJhd1N5c0J1dHRvbiggaHduZCwgaERDLCBUUlVFICk7CisJCVJlbGVhc2VEQzMyKCBod25kLCBoREMgKTsKKwkgICAgIH0KKwkgICAgIFNlbmRNZXNzYWdlMTYoIGh3bmQsIFdNX1NZU0NPTU1BTkQsIFNDX01PVVNFTUVOVSArIEhUU1lTTUVOVSwgbFBhcmFtICk7CisJIH0KKwkgYnJlYWs7CiAKICAgICBjYXNlIEhUTUVOVToKIAlTZW5kTWVzc2FnZTE2KCBod25kLCBXTV9TWVNDT01NQU5ELCBTQ19NT1VTRU1FTlUsIGxQYXJhbSApOwpAQCAtMTg2NiwxMiArMTg1MSwxMiBAQAogCiAgICAgY2FzZSBIVEhTQ1JPTEw6CiAJU2VuZE1lc3NhZ2UxNiggcFduZC0+aHduZFNlbGYsIFdNX1NZU0NPTU1BTkQsIFNDX0hTQ1JPTEwgKyBIVEhTQ1JPTEwsCi0gICAgICAgICAgICBsUGFyYW0gKTsKKwkJICAgICAgIGxQYXJhbSApOwogCWJyZWFrOwogCiAgICAgY2FzZSBIVFZTQ1JPTEw6CiAJU2VuZE1lc3NhZ2UxNiggcFduZC0+aHduZFNlbGYsIFdNX1NZU0NPTU1BTkQsIFNDX1ZTQ1JPTEwgKyBIVFZTQ1JPTEwsCi0gICAgICAgICAgICBsUGFyYW0gKTsKKwkJICAgICAgIGxQYXJhbSApOwogCWJyZWFrOwogICAgIH0KICAgICByZXR1cm4gMDsKQEAgLTE5MzgsMTAgKzE5MjMsNyBAQAogCiAgICAgY2FzZSBTQ19TQ1JFRU5TQVZFOgogCWlmICh3UGFyYW0gPT0gU0NfQUJPVVRXSU5FKQotCXsgICAKLSAgICAgICAgICAgIGV4dGVybiBjb25zdCBjaGFyIHBlb3BsZVtdOwotICAgICAgICAgICAgU2hlbGxBYm91dDMyQShod25kLCJXaW5lIixwZW9wbGUsMCk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIFNoZWxsQWJvdXQzMkEoaHduZCwiV2luZSIsIFdJTkVfUkVMRUFTRV9JTkZPLCAwKTsKIAlicmVhazsKICAgCiAgICAgY2FzZSBTQ19IT1RLRVk6CmRpZmYgLS1naXQgYS93aW5kb3dzL3BhaW50aW5nLmMgYi93aW5kb3dzL3BhaW50aW5nLmMKaW5kZXggNzdhMzc0OC4uODY5OWMyZSAxMDA2NDQKLS0tIGEvd2luZG93cy9wYWludGluZy5jCisrKyBiL3dpbmRvd3MvcGFpbnRpbmcuYwpAQCAtMjA4LDMxICsyMDgsNTAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICAgUEFJTlRfR2V0Q29udHJvbEJydXNoCisgKi8KK3N0YXRpYyBIQlJVU0gxNiBQQUlOVF9HZXRDb250cm9sQnJ1c2goIEhXTkQzMiBoUGFyZW50LCBIV05EMzIgaFduZCwgSERDMTYgaERDLCBVSU5UMTYgY3RsVHlwZSApCit7CisgICAgSEJSVVNIMTYgYmtnQnJ1c2ggPSAoSEJSVVNIMTYpU2VuZE1lc3NhZ2UzMkEoIGhQYXJlbnQsIFdNX0NUTENPTE9STVNHQk9YICsgY3RsVHlwZSwgCisJCQkJCQkJICAgICAoV1BBUkFNMzIpaERDLCAoTFBBUkFNKWhXbmQgKTsKKyAgICBpZiggIUlzR0RJT2JqZWN0KGJrZ0JydXNoKSApCisJYmtnQnJ1c2ggPSBERUZXTkRfQ29udHJvbENvbG9yKCBoREMsIGN0bFR5cGUgKTsKKyAgICByZXR1cm4gYmtnQnJ1c2g7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgUGFpbnRSZWN0ICAgIChVU0VSLjMyNSkKICAqLwogdm9pZCBXSU5BUEkgUGFpbnRSZWN0KCBIV05EMTYgaHduZFBhcmVudCwgSFdORDE2IGh3bmQsIEhEQzE2IGhkYywKICAgICAgICAgICAgICAgICAgICAgICAgSEJSVVNIMTYgaGJydXNoLCBjb25zdCBSRUNUMTYgKnJlY3QpCiB7Ci0gICAgICAvKiBTZW5kIFdNX0NUTENPTE9SIG1lc3NhZ2UgaWYgbmVlZGVkICovCi0KLSAgICBpZiAoKFVJTlQzMiloYnJ1c2ggPD0gQ1RMQ09MT1JfTUFYKQotICAgIHsKLQlpZiAoIWh3bmRQYXJlbnQpIHJldHVybjsKLQloYnJ1c2ggPSAoSEJSVVNIMTYpU2VuZE1lc3NhZ2UzMkEoIGh3bmRQYXJlbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdNX0NUTENPTE9STVNHQk9YICsgKFVJTlQzMiloYnJ1c2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTMyKWhkYywgKExQQVJBTSlod25kICk7Ci0gICAgfQotICAgIGlmIChoYnJ1c2gpIEZpbGxSZWN0MTYoIGhkYywgcmVjdCwgaGJydXNoICk7CisgICAgaWYoIGhicnVzaCA8PSBDVExDT0xPUl9NQVggKSAKKwlpZiggaHduZFBhcmVudCApCisJICAgIGhicnVzaCA9IFBBSU5UX0dldENvbnRyb2xCcnVzaCggaHduZFBhcmVudCwgaHduZCwgaGRjLCAoVUlOVDE2KWhicnVzaCApOworCWVsc2UgCisJICAgIHJldHVybjsKKyAgICBpZiggaGJydXNoICkgCisJRmlsbFJlY3QxNiggaGRjLCByZWN0LCBoYnJ1c2ggKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRDb250cm9sQnJ1c2ggICAgKFVTRVIuMzI2KQogICovCi1IQlJVU0gxNiBXSU5BUEkgR2V0Q29udHJvbEJydXNoKCBIV05EMTYgaHduZCwgSERDMTYgaGRjLCBVSU5UMTYgY29udHJvbCApCitIQlJVU0gxNiBXSU5BUEkgR2V0Q29udHJvbEJydXNoKCBIV05EMTYgaHduZCwgSERDMTYgaGRjLCBVSU5UMTYgY3RsVHlwZSApCiB7Ci0gICAgcmV0dXJuIChIQlJVU0gxNilTZW5kTWVzc2FnZTMyQSggR2V0UGFyZW50MzIoaHduZCksIFdNX0NUTENPTE9SK2NvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTMyKWhkYywgKExQQVJBTSlod25kICk7CisgICAgV05EKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOworCisgICAgaWYoKGN0bFR5cGUgPD0gQ1RMQ09MT1JfTUFYKSAmJiB3bmRQdHIgKQorICAgIHsKKwlXTkQqIHBhcmVudDsKKwlpZiggd25kUHRyLT5kd1N0eWxlICYgV1NfUE9QVVAgKSBwYXJlbnQgPSB3bmRQdHItPm93bmVyOworCWVsc2UgcGFyZW50ID0gd25kUHRyLT5wYXJlbnQ7CisJaWYoICFwYXJlbnQgKSBwYXJlbnQgPSB3bmRQdHI7CisJcmV0dXJuIChIQlJVU0gxNilQQUlOVF9HZXRDb250cm9sQnJ1c2goIHBhcmVudC0+aHduZFNlbGYsIGh3bmQsIGhkYywgY3RsVHlwZSApOworICAgIH0KKyAgICByZXR1cm4gKEhCUlVTSDE2KTA7CiB9CiAKIApAQCAtMjQwLDcgKzI1OSw5IEBACiAgKiAgICAgICAgICAgUEFJTlRfUmVkcmF3V2luZG93CiAgKgogICogRklYTUU6IFdpbmRvd3MgdXNlcyBXTV9TWU5DUEFJTlQgdG8gY3V0IGRvd24gdGhlIG51bWJlciBvZiBpbnRlcnRhc2sKLSAqIFNlbmRNZXNzYWdlKCkgY2FsbHMuIEZyb20gU0RLOgorICogU2VuZE1lc3NhZ2UoKSBjYWxscy4gVGhpcyBpcyBhIGNvbW1lbnQgaW5zaWRlIERlZldpbmRvd1Byb2MoKSBzb3VyY2UgCisgKiBmcm9tIDE2LWJpdCBTREs6CisgKgogICogICBUaGlzIG1lc3NhZ2UgYXZvaWRzIGxvdHMgb2YgaW50ZXItYXBwIG1lc3NhZ2UgdHJhZmZpYwogICogICBieSBzd2l0Y2hpbmcgdG8gdGhlIG90aGVyIHRhc2sgYW5kIGNvbnRpbnVpbmcgdGhlCiAgKiAgIHJlY3Vyc2lvbiB0aGVyZS4KZGlmZiAtLWdpdCBhL3dpbmRvd3MvcXVldWUuYyBiL3dpbmRvd3MvcXVldWUuYwppbmRleCBmOTUzNGNkLi5lY2M2ZjMwIDEwMDY0NAotLS0gYS93aW5kb3dzL3F1ZXVlLmMKKysrIGIvd2luZG93cy9xdWV1ZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSAicXVldWUuaCIKICNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAid2luLmgiCisjaW5jbHVkZSAiY2xpcGJvYXJkLmgiCiAjaW5jbHVkZSAiaG9vay5oIgogI2luY2x1ZGUgInRocmVhZC5oIgogI2luY2x1ZGUgInByb2Nlc3MuaCIKQEAgLTc2Miw2ICs3NjMsNyBAQAogICAgICAgIGlmKCBXSU5fR2V0RGVza3RvcCgpLT5obWVtVGFza1EgPT0gaFF1ZXVlICkKIAkgICBXSU5fR2V0RGVza3RvcCgpLT5obWVtVGFza1EgPSBoTmV3UXVldWU7CiAgICAgICAgV0lOX1Jlc2V0UXVldWVXaW5kb3dzKCBXSU5fR2V0RGVza3RvcCgpLCBoUXVldWUsIGhOZXdRdWV1ZSApOworICAgICAgIENMSVBCT0FSRF9SZXNldExvY2soIGhRdWV1ZSwgaE5ld1F1ZXVlICk7CiAgICAgICAgUVVFVUVfRGVsZXRlTXNnUXVldWUoIGhRdWV1ZSApOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvd2luZG93cy91c2VyLmMgYi93aW5kb3dzL3VzZXIuYwppbmRleCBkZGExYTI4Li5mNzkxYjAwIDEwMDY0NAotLS0gYS93aW5kb3dzL3VzZXIuYworKysgYi93aW5kb3dzL3VzZXIuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJxdWV1ZS5oIgogI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgImNsaXBib2FyZC5oIgogI2luY2x1ZGUgImhvb2suaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInRvb2xoZWxwLmgiCkBAIC0xODEsNiArMTgyLDcgQEAKIAogICAgIFFVRVVFX1NldEV4aXRpbmdRdWV1ZSggaFF1ZXVlICk7CiAgICAgV0lOX1Jlc2V0UXVldWVXaW5kb3dzKCBkZXNrdG9wLCBoUXVldWUsIChIUVVFVUUxNikwKTsKKyAgICBDTElQQk9BUkRfUmVzZXRMb2NrKCBoUXVldWUsIDAgKTsKICAgICBRVUVVRV9TZXRFeGl0aW5nUXVldWUoIDAgKTsKIAogICAgIC8qIEZyZWUgdGhlIG1lc3NhZ2UgcXVldWUgKi8KZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2luLmMgYi93aW5kb3dzL3dpbi5jCmluZGV4IDU4NTY2MDYuLjExYzQ1YjggMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2luLmMKKysrIGIvd2luZG93cy93aW4uYwpAQCAtMzMwLDYgKzMzMCw3IEBACiAJICAgIH0KIAkgICAgUVVFVUVfUmVtb3ZlTXNnKG1zZ1EsIHBvcyk7CiAJfQorCS8qIHJlcG9zdCBXTV9RVUlUIHRvIG1ha2Ugc3VyZSB0aGlzIGFwcCBleGl0cyBpdHMgbWVzc2FnZSBsb29wICovCiAJaWYoIGJQb3N0UXVpdCApIFBvc3RRdWl0TWVzc2FnZTMyKHdRdWl0UGFyYW0pOwogCXduZFB0ci0+aG1lbVRhc2tRID0gMDsKICAgICB9CkBAIC02NTMsNyArNjU0LDcgQEAKIAkgICAgd2luX2F0dHIuZXZlbnRfbWFzayA9IEV4cG9zdXJlTWFzayB8IEtleVByZXNzTWFzayB8CiAJICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlSZWxlYXNlTWFzayB8IFBvaW50ZXJNb3Rpb25NYXNrIHwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvblByZXNzTWFzayB8IEJ1dHRvblJlbGVhc2VNYXNrIHwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIEZvY3VzQ2hhbmdlTWFzayB8IFN0cnVjdHVyZU5vdGlmeU1hc2s7CisJICAgICAgICAgICAgICAgICAgICAgICAgICBGb2N1c0NoYW5nZU1hc2s7CiAgICAgICAgICAgICB3aW5fYXR0ci5vdmVycmlkZV9yZWRpcmVjdCA9IFRSVUU7CiAJfQogICAgICAgICB3aW5fYXR0ci5jb2xvcm1hcCAgICAgID0gQ09MT1JfR2V0Q29sb3JtYXAoKTsKQEAgLTkzNiw4ICs5MzcsOCBAQAogICovCiBzdGF0aWMgdm9pZCBXSU5fQ2hlY2tGb2N1cyggV05EKiBwV25kICkKIHsKLSAgaWYoIEdldEZvY3VzMTYoKSA9PSBwV25kLT5od25kU2VsZiApCi0gICAgICBTZXRGb2N1czE2KCAocFduZC0+ZHdTdHlsZSAmIFdTX0NISUxEKSA/IHBXbmQtPnBhcmVudC0+aHduZFNlbGYgOiAwICk7IAorICAgIGlmKCBHZXRGb2N1czE2KCkgPT0gcFduZC0+aHduZFNlbGYgKQorCVNldEZvY3VzMTYoIChwV25kLT5kd1N0eWxlICYgV1NfQ0hJTEQpID8gcFduZC0+cGFyZW50LT5od25kU2VsZiA6IDAgKTsgCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTQ1LDI4ICs5NDYsMjUgQEAKICAqLwogc3RhdGljIHZvaWQgV0lOX1NlbmREZXN0cm95TXNnKCBXTkQqIHBXbmQgKQogewotICBXTkQqCXBDaGlsZDsKKyAgICBXSU5fQ2hlY2tGb2N1cyhwV25kKTsKIAotICBXSU5fQ2hlY2tGb2N1cyhwV25kKTsKLQotICBpZiggQ0FSRVRfR2V0SHduZCgpID09IHBXbmQtPmh3bmRTZWxmICkgRGVzdHJveUNhcmV0MzIoKTsKLSAgaWYoICFwV25kLT53aW5kb3cgKSBDTElQQk9BUkRfRGlzT3duKCBwV25kICk7IAorICAgIGlmKCBDQVJFVF9HZXRId25kKCkgPT0gcFduZC0+aHduZFNlbGYgKSBEZXN0cm95Q2FyZXQzMigpOworICAgIGlmKCAhcFduZC0+d2luZG93ICkgQ0xJUEJPQVJEX1Jlc2V0T3duZXIoIHBXbmQgKTsgCiAgIAotICBTZW5kTWVzc2FnZTMyQSggcFduZC0+aHduZFNlbGYsIFdNX0RFU1RST1ksIDAsIDApOworICAgIFNlbmRNZXNzYWdlMzJBKCBwV25kLT5od25kU2VsZiwgV01fREVTVFJPWSwgMCwgMCk7CiAKLSAgaWYoICFJc1dpbmRvdzMyKHBXbmQtPmh3bmRTZWxmKSApCi0gIHsKLSAgICBkcHJpbnRmX3dpbihzdGRkZWIsIlx0ZGVzdHJveWVkIGl0c2VsZiB3aGlsZSBpbiBXTV9ERVNUUk9ZIVxuIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcENoaWxkID0gcFduZC0+Y2hpbGQ7Ci0gIHdoaWxlKCBwQ2hpbGQgKQotICB7IAotICAgIFdJTl9TZW5kRGVzdHJveU1zZyggcENoaWxkICk7Ci0gICAgcENoaWxkID0gcENoaWxkLT5uZXh0OwotICB9Ci0gIFdJTl9DaGVja0ZvY3VzKHBXbmQpOworICAgIGlmKCBJc1dpbmRvdzMyKHBXbmQtPmh3bmRTZWxmKSApCisgICAgeworCVdORCogcENoaWxkID0gcFduZC0+Y2hpbGQ7CisJd2hpbGUoIHBDaGlsZCApCisJeworCSAgICBXSU5fU2VuZERlc3Ryb3lNc2coIHBDaGlsZCApOworCSAgICBwQ2hpbGQgPSBwQ2hpbGQtPm5leHQ7CisJfQorCVdJTl9DaGVja0ZvY3VzKHBXbmQpOworICAgIH0KKyAgICBlbHNlCisJZHByaW50Zl93aW4oc3RkZGViLCJcdGRlc3Ryb3llZCBpdHNlbGYgd2hpbGUgaW4gV01fREVTVFJPWSFcbiIpOwogfQogCiAKQEAgLTEwMTMsNyArMTAxMSw3IEBACiAJICAgIGlmKCAhSXNXaW5kb3czMihod25kKSApIHJldHVybiBUUlVFOwogCX0KIAotICAgIGlmKCB3bmRQdHItPndpbmRvdyApIENMSVBCT0FSRF9EaXNPd24oIHduZFB0ciApOyAvKiBiZWZvcmUgd2luZG93IGlzIHVubWFwcGVkICovCisgICAgaWYoIHduZFB0ci0+d2luZG93ICkgQ0xJUEJPQVJEX1Jlc2V0T3duZXIoIHduZFB0ciApOyAvKiBiZWZvcmUgdGhlIHdpbmRvdyBpcyB1bm1hcHBlZCAqLwogCiAgICAgICAvKiBIaWRlIHRoZSB3aW5kb3cgKi8KIApkaWZmIC0tZ2l0IGEvd2luZG93cy93aW5wb3MuYyBiL3dpbmRvd3Mvd2lucG9zLmMKaW5kZXggYjkxNmQ5MC4uMWYyOGY1ZiAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5wb3MuYworKysgYi93aW5kb3dzL3dpbnBvcy5jCkBAIC0yMjYsNyArMjI2LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRXaW5kb3dSZWN0MzIgICAoVVNFUi4zMikKKyAqICAgICAgICAgICBHZXRXaW5kb3dSZWN0MzIgICAoVVNFUjMyLjMwOCkKICAqLwogdm9pZCBXSU5BUEkgR2V0V2luZG93UmVjdDMyKCBIV05EMzIgaHduZCwgTFBSRUNUMzIgcmVjdCApIAogewpAQCAtMjIwMiw3ICsyMjAyLDkgQEAKIAkJCQkgICAgbmV3Q2xpZW50UmVjdC50b3AgIT0gd25kUHRyLT5yZWN0Q2xpZW50LnRvcCkgKQogCSAgICB3aW5wb3MuZmxhZ3MgJj0gflNXUF9OT0NMSUVOVE1PVkU7CiAKLSAgICAvKiBVcGRhdGUgYWN0aXZlIERDRXMgKi8KKyAgICAvKiBVcGRhdGUgYWN0aXZlIERDRXMgCisgICAgICogVE9ETzogT3B0aW1pemUgY29uZGl0aW9ucyB0aGF0IHRyaWdnZXIgRENFIHVwZGF0ZS4KKyAgICAgKi8KIAogICAgIGlmKCAoKCh3aW5wb3MuZmxhZ3MgJiBTV1BfQUdHX05PUE9TQ0hBTkdFKSAhPSBTV1BfQUdHX05PUE9TQ0hBTkdFKSAmJiAKIAkJCQkJIHduZFB0ci0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUpIHx8IApAQCAtMjIxMSw3ICsyMjEzLDcgQEAKICAgICAgICAgUkVDVDMyIHJlY3Q7CiAKICAgICAgICAgVW5pb25SZWN0MzIoJnJlY3QsICZuZXdXaW5kb3dSZWN0LCAmd25kUHRyLT5yZWN0V2luZG93KTsKLSAgICAgICAgRENFX0ludmFsaWRhdGVEQ0Uod25kUHRyLT5wYXJlbnQsICZyZWN0KTsKKwlEQ0VfSW52YWxpZGF0ZURDRSh3bmRQdHItPnBhcmVudCwgJnJlY3QpOwogICAgIH0KIAogICAgIC8qIGNoYW5nZSBnZW9tZXRyeSAqLwpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW5wcm9jLmMgYi93aW5kb3dzL3dpbnByb2MuYwppbmRleCBlNTk2MGJiLi4yNTliMzg0IDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbnByb2MuYworKysgYi93aW5kb3dzL3dpbnByb2MuYwpAQCAtODksOCArODksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgbXNnLCBXUEFSQU0zMiB3UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKTsKIAotZXh0ZXJuIHZvaWQgQ2FsbEZyb20xNl9sb25nX3d3d2xsKHZvaWQpOwotCiBzdGF0aWMgSEFORExFMzIgV2luUHJvY0hlYXA7CiAKIApAQCAtMjExLDggKzIwOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSlXSU5QUk9DX0NhbGxQcm9jMTZUbzMyQSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSlXSU5QUk9DX0NhbGxQcm9jMTZUbzMyVzsKICAgICAgICAgICAgIHByb2MtPnRodW5rLnRfZnJvbTE2LmxjYWxsICAgICAgID0gMHg5YTsgICAvKiBsY2FsbCBjczpyZWxheSAqLwotICAgICAgICAgICAgcHJvYy0+dGh1bmsudF9mcm9tMTYucmVsYXkgICAgICAgPSBDYWxsRnJvbTE2X2xvbmdfd3d3bGw7Ci0gICAgICAgICAgICBwcm9jLT50aHVuay50X2Zyb20xNi5jcyAgICAgICAgICA9IFdJTkVfQ09ERV9TRUxFQ1RPUjsKKyAgICAgICAgICAgIHByb2MtPnRodW5rLnRfZnJvbTE2LnJlbGF5ICAgICAgID0gQ2FsbGJhY2tzLT5DYWxsRnJvbTE2V25kUHJvYzsKKyAgICAgICAgICAgIEdFVF9DUyhwcm9jLT50aHVuay50X2Zyb20xNi5jcyk7CiAgICAgICAgICAgICBwcm9jLT5qbXAuam1wICA9IDB4ZTk7CiAgICAgICAgICAgICAvKiBGaXh1cCByZWxhdGl2ZSBqdW1wICovCiAgICAgICAgICAgICBwcm9jLT5qbXAucHJvYyA9IChXTkRQUk9DMzIpKChEV09SRClmdW5jIC0K