From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Geoffrey D. Bennett" Subject: [PATCH RFC V3] ALSA: usb-audio: Scarlett Gen 2 mixer interface Date: Mon, 1 Jul 2019 00:30:25 +0930 Message-ID: <20190630150025.GA12073@b4.vu> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from b4.vu (b4.vu [203.16.231.147]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id B069BF80CC4 for ; Sun, 30 Jun 2019 17:00:31 +0200 (CEST) Content-Disposition: inline List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" To: alsa-devel@alsa-project.org Cc: Takashi Iwai List-Id: alsa-devel@alsa-project.org QWRkIG1peGVyIHF1aXJrIGZvciB0aGUgRm9jdXNyaXRlIFNjYXJsZXR0IDZpNiwgMThpOCwgYW5k IDE4aTIwIEdlbiAyCmF1ZGlvIGludGVyZmFjZXMuIEFsdGhvdWdoIHRoZSBpbnRlcmZhY2VzIGFy ZSBVU0IgY29tcGxpYW50LAphZGRpdGlvbmFsIGlucHV0L291dHB1dCBsZXZlbCBjb250cm9scyBh bmQgaGFyZHdhcmUgcm91dGluZy9taXhpbmcKZnVuY3Rpb25hbGl0eSBhcmUgYXZhaWxhYmxlIHVz aW5nIHByb3ByaWV0YXJ5IFVTQiByZXF1ZXN0cy4KClNpZ25lZC1vZmYtYnk6IEdlb2ZmcmV5IEQu IEJlbm5ldHQgPGdAYjQudnU+Ci0tLQpIaSBhbGwsCgpUaGlzIHBhdGNoIGFkZHMgdGhlIGZvbGxv d2luZyBjb250cm9scyBmb3IgdGhlIFNjYXJsZXR0IDZpNiwgMThpOCwgYW5kCjE4aTIwIEdlbiAy OgotIE1hc3RlciB2b2x1bWUga25vYiBpbmRpY2F0b3IgKDE4aTIwIG9ubHkpCi0gTXV0ZSBhbmQg ZGltIHN3aXRjaGVzICgxOGkyMCBvbmx5KQotIFZvbHVtZSBjb250cm9scyBmb3IgdGhlIGFuYWxv Z3VlIEhXIG91dHB1dHMKLSBIVy9TVyB2b2x1bWUgc3dpdGNoZXMgZm9yIHRoZSAxMCBhbmFsb2d1 ZSBIVyBvdXRwdXRzICgxOGkyMCBvbmx5KQotIExpbmUgTGV2ZWwvSW5zdHJ1bWVudCBMZXZlbCBh bmQgUGFkIGNvbnRyb2xzICg2aTYgYW5kIDE4aTggb25seSkKLSBPdXRwdXQgbXV4ICh3aGVyZSB0 aGUgc291bmQgZm9yIHRoZSBIVyBvdXRwdXRzIGNvbWVzIGZyb207IGRlZmF1bHRzCiAgdG8gUENN IG91dHB1dHMpCi0gQ2FwdHVyZSBtdXggKHdoZXJlIHRoZSBzb3VuZCBmb3IgUENNIHJlY29yZGlu ZyBjb21lcyBmcm9tOyBkZWZhdWx0cwogIHRvIEhXIGlucHV0cykKLSBNYXRyaXggbXV4ICh3aGVy ZSB0aGUgc291bmQgZ29pbmcgaW50byB0aGUgbWl4ZXIgY29tZXMgZnJvbTsgMTgKICBpbnB1dHMg ZGVmYXVsdCBvZmYpCi0gTWl4ZXIgbWF0cml4ICgxOCBpbnB1dHMgKiAxMCBvdXRwdXRzID0gMTgw IGNvbnRyb2xzKQotIExldmVsIG1ldGVycwoKQ2hhbmdlcyBzaW5jZSB2MToKLSBBZGQgc3VwcG9y dCBmb3IgdGhlIFNjYXJsZXR0IDE4aTggR2VuIDIKLSBTYXZlIGNvbmZpZ3VyYXRpb24gcGFyYW1l dGVycyB0byBOVlJBTQotIEltcGxlbWVudGVkIGZlZWRiYWNrIGZyb20gVGFrYXNoaSdzIGVtYWls IDI0L0Fwci8yMDE5Ci0gTW92ZWQgcHJpdmF0ZSBmaWVsZCBmcm9tIHN0cnVjdCBzbmRfdXNiX2F1 ZGlvIHRvIHN0cnVjdAogIHVzYl9taXhlcl9pbnRlcmZhY2UKLSBBZGRlZCB0aW1lciBhbmQgYnVm ZmVyIGZpZWxkcyB0byBzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZQotIE90aGVyIHNtYWxsIGNv ZGUgZml4ZXMvY2xlYW51cHMvaW1wcm92ZW1lbnRzCgpDaGFuZ2VzIHNpbmNlIHYyOgotIEFkZCBz dXBwb3J0IGZvciB0aGUgU2NhcmxldHQgNmk2IEdlbiAyCi0gQWRkIHN1cHBvcnQgZm9yIGNvbnRy b2xsaW5nIHRoZSBtdXRlL2RpbSBzd2l0Y2hlcyAoMThpMjAgb25seSkKLSBJbXBsZW1lbnRlZCBm ZWVkYmFjayBmcm9tIFRha2FzaGkncyBlbWFpbCAyOS9BcHIvMjAxOTogT25lIHBvaW50ZXIKICBm aWVsZCBwcml2YXRlX2RhdGEgYW5kIG9uZSBmdW5jdGlvbiBwb2ludGVyIHByaXZhdGVfZnJlZS4g UmVwbGFjZWQKICB0aW1lciB3aXRoIGRlbGF5ZWQgd29yayAodGhhbmtzIGZvciB0aGF0IHN1Z2dl c3Rpb247IGl0IG1ha2VzIHRoZQogIGNvZGUgYSAqbG90KiBzaW1wbGVyISkuCi0gVGhlIG5ldyBm dW5jdGlvbmFsaXR5IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYXMgdGhlcmUgd2VyZSByZXBvcnRz CiAgb2Ygc29tZSBHZW4gMiBkZXZpY2VzIG5vdCByZXNwb25kaW5nIHRvIHRoZSBpbml0aWFsaXNh dGlvbiBzZXF1ZW5jZQogIGFuZCBoYW5naW5nLiBBZGRlZCBtb2R1bGUgcGFyYW1ldGVyICJzY2Fy bGV0dF9nZW4yX21peGVyX2VuYWJsZSIuCiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHNldCwg bG9ncyBhIG1lc3NhZ2UgIkZvY3Vzcml0ZSBTY2FybGV0dCBHZW4KICAyIE1peGVyIERyaXZlciBk aXNhYmxlZDsgdXNlIG9wdGlvbnMgc25kX3VzYl9hdWRpbwogIHNjYXJsZXR0X2dlbjJfbWl4ZXJf ZW5hYmxlPTEgdG8gZW5hYmxlIGFuZCByZXBvcnQgYW55IGlzc3VlcyB0bwogIGdAYjQudnUiLgoK T3V0c3RhbmRpbmcgaXNzdWVzL3F1ZXN0aW9uczoKCi0gVGFrYXNoaSwgeW91IHdyb3RlIGxhc3Qg dGltZSAiQWxzbywgdGhlIGRlbGF5ZWQgd29yayBuZWVkcyB0byBiZQogIGNhbmNlbGVkIG9yIGZs dXNoZWQgYXQgUE0gc3VzcGVuZCBjYWxsYmFjayBhcyB3ZWxsIGFzCiAgZGlzY29ubmVjdGluZy4i IEknbSBub3Qgc3VyZSB3aHkgaXQgc2hvdWxkIGJlIGNhbmNlbGxlZDsgaXMgaXQgbm90CiAgb2th eSB0byBkbyBvbiByZXN1bWU/IEJ1dCBJIHRlc3RlZCBzdXNwZW5kaW5nIHdoaWxlIHRoZSBkZWxh eWVkIHdvcmsKICB3YXMgd2FpdGluZyBhbmQgaXQgc2VlbWVkIGxpa2UgdGhlIGRlbGF5ZWQgd29y ayB3YXMgY2FuY2VsbGVkCiAgYW55d2F5LiBQcm9iYWJseSBiZXR0ZXIgdG8gZG8gYSBmbHVzaCBv biBzdXNwZW5kIHRob3VnaDsgc2hvdWxkIHRoaXMKICBiZSBkb25lIHRocm91Z2ggYSBob29rIGxp a2U6CgpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL21peGVyLmMgYi9zb3VuZC91c2IvbWl4ZXIuYwpp bmRleCAyNDQ0NzM3YTE0YjIuLjE1NzJhODkyNjdjNiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL21p eGVyLmMKKysrIGIvc291bmQvdXNiL21peGVyLmMKQEAgLTM1NDcsNiArMzU0Nyw4IEBAIHN0YXRp YyBpbnQgc25kX3VzYl9taXhlcl9hY3RpdmF0ZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAq bWl4ZXIpCiBpbnQgc25kX3VzYl9taXhlcl9zdXNwZW5kKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJm YWNlICptaXhlcikKIHsKICAgICAgICBzbmRfdXNiX21peGVyX2luYWN0aXZhdGUobWl4ZXIpOwor ICAgICAgIGlmIChtaXhlci0+cHJpdmF0ZV9zdXNwZW5kKQorICAgICAgICAgICAgICAgbWl4ZXIt PnByaXZhdGVfc3VzcGVuZChtaXhlcik7CiAgICAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdp dCBhL3NvdW5kL3VzYi9taXhlci5oIGIvc291bmQvdXNiL21peGVyLmgKaW5kZXggZmE2ZTIxNmEw NmYwLi5kOTRjNjg4YzY1ZjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXhlci5oCisrKyBiL3Nv dW5kL3VzYi9taXhlci5oCkBAIC0yOCw2ICsyOCw3IEBAIHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJm YWNlIHsKIAogICAgICAgIHZvaWQgKnByaXZhdGVfZGF0YTsKICAgICAgICB2b2lkICgqcHJpdmF0 ZV9mcmVlKShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqcHJpdmF0ZV9kYXRhKTsKKyAgICAg ICB2b2lkICgqcHJpdmF0ZV9zdXNwZW5kKShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqKTsK IH07CiAKICNkZWZpbmUgTUFYX0NIQU5ORUxTICAgMTYgICAgICAvKiBtYXggbG9naWNhbCBjaGFu bmVscyAqLwoKICA/CgpUaGFua3MsCkdlb2ZmcmV5LgoKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9N YWtlZmlsZSBiL3NvdW5kL3VzYi9NYWtlZmlsZQppbmRleCBkMzMwZjc0YzkwZTYuLjhjZjcwODFl MTdjYiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL01ha2VmaWxlCisrKyBiL3NvdW5kL3VzYi9NYWtl ZmlsZQpAQCAtMTEsNiArMTEsNyBAQCBzbmQtdXNiLWF1ZGlvLW9ianMgOj0gCWNhcmQubyBcCiAJ CQltaXhlci5vIFwKIAkJCW1peGVyX3F1aXJrcy5vIFwKIAkJCW1peGVyX3NjYXJsZXR0Lm8gXAor CQkJbWl4ZXJfc2NhcmxldHRfZ2VuMi5vIFwKIAkJCW1peGVyX3VzMTZ4MDgubyBcCiAJCQlwY20u byBcCiAJCQlwb3dlci5vIFwKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9taXhlci5jIGIvc291bmQv dXNiL21peGVyLmMKaW5kZXggNTNkY2NiZmUzOTJiLi4yNDQ0NzM3YTE0YjIgMTAwNjQ0Ci0tLSBh L3NvdW5kL3VzYi9taXhlci5jCisrKyBiL3NvdW5kL3VzYi9taXhlci5jCkBAIC0zNTE4LDYgKzM1 MTgsOCBAQCB2b2lkIHNuZF91c2JfbWl4ZXJfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX21peGVyX2lu dGVyZmFjZSAqbWl4ZXIpCiAJCXVzYl9raWxsX3VyYihtaXhlci0+dXJiKTsKIAlpZiAobWl4ZXIt PnJjX3VyYikKIAkJdXNiX2tpbGxfdXJiKG1peGVyLT5yY191cmIpOworCWlmIChtaXhlci0+cHJp dmF0ZV9mcmVlKQorCQltaXhlci0+cHJpdmF0ZV9mcmVlKG1peGVyKTsKIAltaXhlci0+ZGlzY29u bmVjdGVkID0gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL21peGVyLmggYi9zb3Vu ZC91c2IvbWl4ZXIuaAppbmRleCAzZDEyYWY4YmYxOTEuLmZhNmUyMTZhMDZmMCAxMDA2NDQKLS0t IGEvc291bmQvdXNiL21peGVyLmgKKysrIGIvc291bmQvdXNiL21peGVyLmgKQEAgLTI1LDYgKzI1 LDkgQEAgc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgewogCXU4IHJjX2J1ZmZlcls2XTsKIAog CWJvb2wgZGlzY29ubmVjdGVkOworCisJdm9pZCAqcHJpdmF0ZV9kYXRhOworCXZvaWQgKCpwcml2 YXRlX2ZyZWUpKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICopOwogfTsKIAogI2RlZmluZSBN QVhfQ0hBTk5FTFMJMTYJLyogbWF4IGxvZ2ljYWwgY2hhbm5lbHMgKi8KZGlmZiAtLWdpdCBhL3Nv dW5kL3VzYi9taXhlcl9xdWlya3MuYyBiL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYwppbmRleCBh NzUxYTE4Y2E0YzIuLjFhZTAwYTFlNmM0NyAxMDA2NDQKLS0tIGEvc291bmQvdXNiL21peGVyX3F1 aXJrcy5jCisrKyBiL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYwpAQCAtNDUsNiArNDUsNyBAQAog I2luY2x1ZGUgIm1peGVyLmgiCiAjaW5jbHVkZSAibWl4ZXJfcXVpcmtzLmgiCiAjaW5jbHVkZSAi bWl4ZXJfc2NhcmxldHQuaCIKKyNpbmNsdWRlICJtaXhlcl9zY2FybGV0dF9nZW4yLmgiCiAjaW5j bHVkZSAibWl4ZXJfdXMxNngwOC5oIgogI2luY2x1ZGUgImhlbHBlci5oIgogCkBAIC0yMjcxLDYg KzIyNzIsMTIgQEAgaW50IHNuZF91c2JfbWl4ZXJfYXBwbHlfY3JlYXRlX3F1aXJrKHN0cnVjdCB1 c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKIAkJZXJyID0gc25kX3NjYXJsZXR0X2NvbnRyb2xz X2NyZWF0ZShtaXhlcik7CiAJCWJyZWFrOwogCisJY2FzZSBVU0JfSUQoMHgxMjM1LCAweDgyMDMp OiAvKiBGb2N1c3JpdGUgU2NhcmxldHQgNmk2IDJuZCBHZW4gKi8KKwljYXNlIFVTQl9JRCgweDEy MzUsIDB4ODIwNCk6IC8qIEZvY3Vzcml0ZSBTY2FybGV0dCAxOGk4IDJuZCBHZW4gKi8KKwljYXNl IFVTQl9JRCgweDEyMzUsIDB4ODIwMSk6IC8qIEZvY3Vzcml0ZSBTY2FybGV0dCAxOGkyMCAybmQg R2VuICovCisJCWVyciA9IHNuZF9zY2FybGV0dF9nZW4yX2NvbnRyb2xzX2NyZWF0ZShtaXhlcik7 CisJCWJyZWFrOworCiAJY2FzZSBVU0JfSUQoMHgwNDFlLCAweDMyM2IpOiAvKiBDcmVhdGl2ZSBT b3VuZCBCbGFzdGVyIEUxICovCiAJCWVyciA9IHNuZF9zb3VuZGJsYXN0ZXJfZTFfc3dpdGNoX2Ny ZWF0ZShtaXhlcik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL21peGVyX3NjYXJs ZXR0X2dlbjIuYyBiL3NvdW5kL3VzYi9taXhlcl9zY2FybGV0dF9nZW4yLmMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi4wNWE4ZTQ3YTg1ZjQKLS0tIC9kZXYvbnVsbAor KysgYi9zb3VuZC91c2IvbWl4ZXJfc2NhcmxldHRfZ2VuMi5jCkBAIC0wLDAgKzEsMjA3OCBAQAor Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiAgIEZvY3Vzcml0ZSBT Y2FybGV0dCA2aTYvMThpOC8xOGkyMCBHZW4gMiBEcml2ZXIgZm9yIEFMU0EKKyAqCisgKiAgIENv cHlyaWdodCAoYykgMjAxOC0yMDE5IGJ5IEdlb2ZmcmV5IEQuIEJlbm5ldHQgPGcgYXQgYjQudnU+ CisgKgorICogICBCYXNlZCBvbiB0aGUgU2NhcmxldHQgKEdlbiAxKSBEcml2ZXIgZm9yIEFMU0E6 CisgKgorICogICBDb3B5cmlnaHQgKGMpIDIwMTMgYnkgVG9iaWFzIEhvZmZtYW5uCisgKiAgIENv cHlyaWdodCAoYykgMjAxMyBieSBSb2JpbiBHYXJldXMgPHJvYmluIGF0IGdhcmV1cy5vcmc+Cisg KiAgIENvcHlyaWdodCAoYykgMjAwMiBieSBUYWthc2hpIEl3YWkgPHRpd2FpIGF0IHN1c2UuZGU+ CisgKiAgIENvcHlyaWdodCAoYykgMjAxNCBieSBDaHJpcyBKIEFyZ2VzIDxjaHJpcy5qLmFyZ2Vz IGF0IGNhbm9uaWNhbC5jb20+CisgKgorICogICBNYW55IGNvZGVzIGJvcnJvd2VkIGZyb20gYXVk aW8uYyBieQorICogICAgIEFsYW4gQ294IChhbGFuIGF0IGx4b3JndWsudWt1dS5vcmcudWspCisg KiAgICAgVGhvbWFzIFNhaWxlciAoc2FpbGVyIGF0IGlmZS5lZS5ldGh6LmNoKQorICoKKyAqICAg Q29kZSBjbGVhbnVwOgorICogICBEYXZpZCBIZW5uaW5nc3NvbiA8ZGF2aWQuaGVubmluZ3Nzb24g YXQgY2Fub25pY2FsLmNvbT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2Yg dGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisvKiBNaXhlciBJ bnRlcmZhY2UgZm9yIHRoZSBGb2N1c3JpdGUgU2NhcmxldHQgNmk2LzE4aTgvMThpMjAgR2VuIDIg YXVkaW8KKyAqIGludGVyZmFjZS4gQmFzZWQgb24gdGhlIEdlbiAxIGRyaXZlciBhbmQgcmV3cml0 dGVuLgorICovCisKKy8qIFRoZSBwcm90b2NvbCB3YXMgcmV2ZXJzZSBlbmdpbmVlcmVkIGJ5IGxv b2tpbmcgYXQgdGhlIGNvbW11bmljYXRpb24KKyAqIGJldHdlZW4gRm9jdXNyaXRlIENvbnRyb2wg Mi4zLjQgYW5kIHRoZSBGb2N1c3JpdGUoUikgU2NhcmxldHQgMThpMjAKKyAqIChmaXJtd2FyZSAx MDgzKSB1c2luZyB1c2Jtb24gaW4gSnVseS1BdWd1c3QgMjAxOC4KKyAqCisgKiBTY2FybGV0dCAx OGk4IHN1cHBvcnQgYWRkZWQgaW4gQXByaWwgMjAxOS4KKyAqCisgKiBTY2FybGV0dCA2aTYgc3Vw cG9ydCBhZGRlZCBpbiBKdW5lIDIwMTkgKHRoYW5rcyB0byBNYXJ0aW4gV2l0dG1hbm4KKyAqIGZv ciBwcm92aWRpbmcgdXNibW9uIG91dHB1dCBhbmQgdGVzdGluZykuCisgKgorICogVGhpcyBBTFNB IG1peGVyIGdpdmVzIGFjY2VzcyB0bzoKKyAqICAtIGlucHV0LCBvdXRwdXQsIG1peGVyLW1hdHJp eCBtdXhlcworICogIC0gMTh4MTAgbWl4ZXItbWF0cml4IGdhaW4gc3RhZ2VzCisgKiAgLSBnYWlu L3ZvbHVtZSBjb250cm9scworICogIC0gbGV2ZWwgbWV0ZXJzCisgKiAgLSBsaW5lL2luc3QgbGV2 ZWwgYW5kIHBhZCBjb250cm9scworICoKKyAqIDxkaXRhYT4KKyAqICAgIC8tLS0tLS0tLS0tLS0t LVwgICAgMThjaG4gICAgICAgICAgICAyMGNobiAgICAgLy0tLS0tLS0tLS0tLS0tXAorICogICAg fCBIYXJkd2FyZSAgaW4gKy0tKy0tLS0tLVwgICAgLy0tLS0tLS0tLS0tLS0rLS0rIEFMU0EgUENN IG91dCB8CisgKiAgICBcLS0tLS0tLS0tLS0tLS0vICB8ICAgICAgfCAgICB8ICAgICAgICAgICAg IHwgIFwtLS0tLS0tLS0tLS0tLS8KKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAg IHwgICAgLy0tLS0tXCAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgfCAg ICB8ICAgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgdiAgICB2ICAgIHYg ICAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICArLS0tLS0tLS0tLS0tLS0tKyAg fCAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICBcIE1hdHJpeCAgTXV4IC8gICB8ICB8 CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICArLS0tLS0rLS0tLS0rICAgIHwgIHwKKyAq ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgfCAgfAorICogICAg ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfDE4Y2huICAgICB8ICB8CisgKiAgICAgICAg ICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAg ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgIDEwY2hufCAgfAorICogICAgICAgICAgICAgICAg ICAgICAgfCAgICAgICAgICAgdiAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAg ICB8ICAgICArLS0tLS0tLS0tLS0tKyAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwg ICAgIHwgTWl4ZXIgICAgICB8ICAgfCAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAg fCAgICAgTWF0cml4IHwgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8ICAg ICAgICAgICAgfCAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgMTh4MTAg R2FpbiB8ICAgfCAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAgIHN0YWdlcyAg IHwgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICArLS0tLS0rLS0tLS0tKyAg IHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgfCAg fAorICogICAgICAgICAgICAgICAgICAgICAgfDE4Y2huICAgICAgfDEwY2huICAgICB8ICB8MjBj aG4KKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgfCAgfAor ICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgKy0tLS0tLS0tLS0vICB8CisgKiAg ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgIHwKKyAqICAgICAg ICAgICAgICAgICAgICAgIHYgICAgICAgICAgIHYgICAgICAgICAgICAgdgorICogICAgICAgICAg ICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgICAgICAgICAg ICstLS0tLS0tLS0tLS0tLS0rICAgICAgICstLeKAlC0tLS0tLS0tLS0tLSsKKyAqICAgICAgICAg ICAgICAgIFwgT3V0cHV0ICBNdXggLyAgICAgICAgIFwgQ2FwdHVyZSBNdXggLworICogICAgICAg ICAgICAgICAgICstLS0rLS0tKy0tLSsgICAgICAgICAgICstLS0tLSstLS0tLSsKKyAqICAgICAg ICAgICAgICAgICAgICAgfCAgIHwgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAg ICAgICAxMGNobnwgICB8ICAgICAgICAgICAgICAgICAgICAgfDE4Y2huCisgKiAgICAgICAgICAg ICAgICAgICAgIHwgICB8ICAgICAgICAgICAgICAgICAgICAgfAorICogIC8tLS0tLS0tLS0tLS0t LVwgICB8ICAgfCAgICAgICAgICAgICAgICAgICAgIHwgICAvLS0tLS0tLS0tLS0tLS1cCisgKiAg fCBTL1BESUYsIEFEQVQgfDwtLS8gICB8MTBjaG4gICAgICAgICAgICAgICAgXC0tPnwgQUxTQSBQ Q00gaW4gIHwKKyAqICB8IEhhcmR3YXJlIG91dCB8ICAgICAgIHwgICAgICAgICAgICAgICAgICAg ICAgICAgXC0tLS0tLS0tLS0tLS0tLworICogIFwtLS0tLS0tLS0tLS0tLS8gICAgICAgfAorICog ICAgICAgICAgICAgICAgICAgICAgICAgdgorICogICAgICAgICAgICAgICAgICArLS0tLS0tLS0t LS0tLSsgICAgU29mdHdhcmUgZ2FpbiBwZXIgY2hhbm5lbC4KKyAqICAgICAgICAgICAgICAgICAg fCBNYXN0ZXIgR2FpbiB8PC0tIDE4aTIwIG9ubHk6IFN3aXRjaCBwZXIgY2hhbm5lbAorICogICAg ICAgICAgICAgICAgICArLS0tLS0tKy0tLS0tLSsgICAgdG8gc2VsZWN0IEhXIG9yIFNXIGdhaW4g Y29udHJvbC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAg ICAgICAgICAgIHwxMGNobgorICogIC8tLS0tLS0tLS0tLS0tLVwgICAgICAgfAorICogIHwgQW5h bG9ndWUgICAgIHw8LS0tLS0tLworICogIHwgSGFyZHdhcmUgb3V0IHwKKyAqICBcLS0tLS0tLS0t LS0tLS0vCisgKiA8L2RpdGFhPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgor I2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisK KyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNp bmNsdWRlICJ1c2JhdWRpby5oIgorI2luY2x1ZGUgIm1peGVyLmgiCisjaW5jbHVkZSAiaGVscGVy LmgiCisKKyNpbmNsdWRlICJtaXhlcl9zY2FybGV0dF9nZW4yLmgiCisKK3N0YXRpYyBpbnQgc2Nh cmxldHRfZ2VuMl9taXhlcl9lbmFibGUgPSAwOworbW9kdWxlX3BhcmFtKHNjYXJsZXR0X2dlbjJf bWl4ZXJfZW5hYmxlLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhzY2FybGV0dF9nZW4y X21peGVyX2VuYWJsZSwKKwkJICJGb2N1c3JpdGUgU2NhcmxldHQgR2VuIDIgTWl4ZXIgRHJpdmVy IEVuYWJsZSIpOworCisvKiBzb21lIGd1aSBtaXhlcnMgY2FuJ3QgaGFuZGxlIG5lZ2F0aXZlIGN0 bCB2YWx1ZXMgKi8KKyNkZWZpbmUgU0NBUkxFVFRfVk9MVU1FX0JJQVMgMTI3CisKKy8qIG1peGVy IHJhbmdlIGZyb20gLTgwZEIgdG8gKzZkQiBpbiAwLjVkQiBzdGVwcyAqLworI2RlZmluZSBTQ0FS TEVUVF9NSVhFUl9NSU5fREIgLTgwCisjZGVmaW5lIFNDQVJMRVRUX01JWEVSX0JJQVMgKC1TQ0FS TEVUVF9NSVhFUl9NSU5fREIgKiAyKQorI2RlZmluZSBTQ0FSTEVUVF9NSVhFUl9NQVhfREIgNgor I2RlZmluZSBTQ0FSTEVUVF9NSVhFUl9NQVhfVkFMVUUgXAorCSgoU0NBUkxFVFRfTUlYRVJfTUFY X0RCIC0gU0NBUkxFVFRfTUlYRVJfTUlOX0RCKSAqIDIpCisKKy8qIG1hcCBmcm9tIChkQiArIDgw KSAqIDIgdG8gbWl4ZXIgdmFsdWUKKyAqIGZvciBkQiBpbiAwIC4uIDE3MjogaW50KDgxOTIgKiBw b3coMTAsICgoZEIgLSAxNjApIC8gMiAvIDIwKSkpCisgKi8KK3N0YXRpYyBjb25zdCB1MTYgc2Nh cmxldHQyX21peGVyX3ZhbHVlc1sxNzNdID0geworCTAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEs IDEsIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsCisJMiwgMiwgMywgMywgMywgMywg MywgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNiwgNiwgNiwgNywgNywgOCwgOCwKKwk5LCA5LCAxMCwg MTAsIDExLCAxMiwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsCisJMjMs IDI0LCAyNSwgMjcsIDI5LCAzMCwgMzIsIDM0LCAzNiwgMzgsIDQxLCA0MywgNDYsIDQ4LCA1MSwK Kwk1NCwgNTcsIDYxLCA2NSwgNjgsIDczLCA3NywgODEsIDg2LCA5MSwgOTcsIDEwMywgMTA5LCAx MTUsCisJMTIyLCAxMjksIDEzNywgMTQ1LCAxNTQsIDE2MywgMTczLCAxODMsIDE5NCwgMjA1LCAy MTcsIDIzMCwKKwkyNDQsIDI1OSwgMjc0LCAyOTAsIDMwNywgMzI2LCAzNDUsIDM2NSwgMzg3LCA0 MTAsIDQzNCwgNDYwLAorCTQ4NywgNTE2LCA1NDcsIDU3OSwgNjE0LCA2NTAsIDY4OSwgNzMwLCA3 NzMsIDgxOSwgODY3LCA5MTksCisJOTczLCAxMDMxLCAxMDkyLCAxMTU3LCAxMjI1LCAxMjk4LCAx Mzc1LCAxNDU2LCAxNTQzLCAxNjM0LAorCTE3MzEsIDE4MzMsIDE5NDIsIDIwNTcsIDIxNzksIDIz MDgsIDI0NDUsIDI1OTAsIDI3NDQsIDI5MDYsCisJMzA3OCwgMzI2MSwgMzQ1NCwgMzY1OSwgMzg3 NiwgNDEwNSwgNDM0OSwgNDYwNiwgNDg3OSwgNTE2OCwKKwk1NDc1LCA1Nzk5LCA2MTQzLCA2NTA3 LCA2ODkyLCA3MzAxLCA3NzMzLCA4MTkyLCA4Njc3LCA5MTkxLAorCTk3MzYsIDEwMzEzLCAxMDky NCwgMTE1NzEsIDEyMjU3LCAxMjk4MywgMTM3NTIsIDE0NTY3LCAxNTQzMCwKKwkxNjM0NQorfTsK KworLyogTWF4aW11bSBudW1iZXIgb2YgYW5hbG9ndWUgb3V0cHV0cyAqLworI2RlZmluZSBTQ0FS TEVUVDJfQU5BTE9HVUVfTUFYIDEwCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGxldmVsIGFuZCBw YWQgc3dpdGNoZXMgKi8KKyNkZWZpbmUgU0NBUkxFVFQyX0xFVkVMX1NXSVRDSF9NQVggMgorI2Rl ZmluZSBTQ0FSTEVUVDJfUEFEX1NXSVRDSF9NQVggNAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBp bnB1dHMgdG8gdGhlIG1peGVyICovCisjZGVmaW5lIFNDQVJMRVRUMl9JTlBVVF9NSVhfTUFYIDE4 CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIG91dHB1dHMgZnJvbSB0aGUgbWl4ZXIgKi8KKyNkZWZp bmUgU0NBUkxFVFQyX09VVFBVVF9NSVhfTUFYIDEwCisKKy8qIE1heGltdW0gc2l6ZSBvZiB0aGUg ZGF0YSBpbiB0aGUgVVNCIG11eCBhc3NpZ25tZW50IG1lc3NhZ2U6CisgKiAxOCBpbnB1dHMsIDIw IG91dHB1dHMsIDE4IG1hdHJpeCBpbnB1dHMsIDggc3BhcmUKKyAqLworI2RlZmluZSBTQ0FSTEVU VDJfTVVYX01BWCA2NAorCisvKiBOdW1iZXIgb2YgbWV0ZXJzOgorICogMTggaW5wdXRzLCAyMCBv dXRwdXRzLCAxOCBtYXRyaXggaW5wdXRzCisgKi8KKyNkZWZpbmUgU0NBUkxFVFQyX05VTV9NRVRF UlMgNTYKKworLyogSGFyZHdhcmUgcG9ydCB0eXBlczoKKyAqIC0gTm9uZSAobm8gaW5wdXQgdG8g bXV4KQorICogLSBBbmFsb2d1ZSBJL08KKyAqIC0gUy9QRElGIEkvTworICogLSBBREFUIEkvTwor ICogLSBNaXhlciBJL08KKyAqIC0gUENNIEkvTworICovCitlbnVtIHsKKwlTQ0FSTEVUVDJfUE9S VF9UWVBFX05PTkUgPSAwLAorCVNDQVJMRVRUMl9QT1JUX1RZUEVfQU5BTE9HVUUgPSAxLAorCVND QVJMRVRUMl9QT1JUX1RZUEVfU1BESUYgPSAyLAorCVNDQVJMRVRUMl9QT1JUX1RZUEVfQURBVCA9 IDMsCisJU0NBUkxFVFQyX1BPUlRfVFlQRV9NSVggPSA0LAorCVNDQVJMRVRUMl9QT1JUX1RZUEVf UENNID0gNSwKKwlTQ0FSTEVUVDJfUE9SVF9UWVBFX0NPVU5UID0gNiwKK307CisKKy8qIENvdW50 IG9mIHRvdGFsIEkvTyBhbmQgbnVtYmVyIGF2YWlsYWJsZSBhdCBlYWNoIHNhbXBsZSByYXRlICov CitlbnVtIHsKKwlTQ0FSTEVUVDJfUE9SVF9JTiA9IDAsCisJU0NBUkxFVFQyX1BPUlRfT1VUID0g MSwKKwlTQ0FSTEVUVDJfUE9SVF9PVVRfNDQgPSAyLAorCVNDQVJMRVRUMl9QT1JUX09VVF84OCA9 IDMsCisJU0NBUkxFVFQyX1BPUlRfT1VUXzE3NiA9IDQsCisJU0NBUkxFVFQyX1BPUlRfRElSRUNU SU9OUyA9IDUsCit9OworCisvKiBIYXJkd2FyZSBidXR0b25zIG9uIHRoZSAxOGkyMCAqLworI2Rl ZmluZSBTQ0FSTEVUVDJfQlVUVE9OX01BWCAyCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBz Y2FybGV0dDJfYnV0dG9uX25hbWVzW1NDQVJMRVRUMl9CVVRUT05fTUFYXSA9IHsKKwkiTXV0ZSIs ICJEaW0iCit9OworCisvKiBEZXNjcmlwdGlvbiBvZiBlYWNoIGhhcmR3YXJlIHBvcnQgdHlwZToK KyAqIC0gaWQ6IGhhcmR3YXJlIElEIGZvciB0aGlzIHBvcnQgdHlwZQorICogLSBudW06IG51bWJl ciBvZiBzb3VyY2VzL2Rlc3RpbmF0aW9ucyBvZiB0aGlzIHBvcnQgdHlwZQorICogLSBzcmNfZGVz Y3I6IHByaW50ZiBmb3JtYXQgc3RyaW5nIGZvciBtdXggaW5wdXQgc2VsZWN0aW9ucworICogLSBz cmNfbnVtX29mZnNldDogYWRkZWQgdG8gY2hhbm5lbCBudW1iZXIgZm9yIHRoZSBmcHJpbnRmCisg KiAtIGRzdF9kZXNjcjogcHJpbnRmIGZvcm1hdCBzdHJpbmcgZm9yIG1peGVyIGNvbnRyb2xzCisg Ki8KK3N0cnVjdCBzY2FybGV0dDJfcG9ydHMgeworCXUxNiBpZDsKKwlpbnQgbnVtW1NDQVJMRVRU Ml9QT1JUX0RJUkVDVElPTlNdOworCWNvbnN0IGNoYXIgKiBjb25zdCBzcmNfZGVzY3I7CisJaW50 IHNyY19udW1fb2Zmc2V0OworCWNvbnN0IGNoYXIgKiBjb25zdCBkc3RfZGVzY3I7Cit9OworCitz dHJ1Y3Qgc2NhcmxldHQyX2RldmljZV9pbmZvIHsKKwl1OCBsaW5lX291dF9od192b2w7IC8qIGxp bmUgb3V0IGh3IHZvbHVtZSBpcyBzdyBjb250cm9sbGVkICovCisJdTggYnV0dG9uX2NvdW50OyAv KiBudW1iZXIgb2YgYnV0dG9ucyAqLworCXU4IGxldmVsX2lucHV0X2NvdW50OyAvKiBpbnB1dHMg d2l0aCBsZXZlbCBzZWxlY3RhYmxlICovCisJdTggcGFkX2lucHV0X2NvdW50OyAvKiBpbnB1dHMg d2l0aCBwYWQgc2VsZWN0YWJsZSAqLworCWNvbnN0IGNoYXIgKiBjb25zdCBsaW5lX291dF9kZXNj cnNbU0NBUkxFVFQyX0FOQUxPR1VFX01BWF07CisJc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyBwb3J0 c1tTQ0FSTEVUVDJfUE9SVF9UWVBFX0NPVU5UXTsKK307CisKK3N0cnVjdCBzY2FybGV0dDJfbWl4 ZXJfZGF0YSB7CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyOworCXN0cnVjdCBt dXRleCB1c2JfbXV0ZXg7IC8qIHByZXZlbnQgc2VuZGluZyBjb25jdXJyZW50IFVTQiByZXF1ZXN0 cyAqLworCXN0cnVjdCBtdXRleCBkYXRhX211dGV4OyAvKiBsb2NrIGFjY2VzcyB0byB0aGlzIGRh dGEgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0 Ml9kZXZpY2VfaW5mbyAqaW5mbzsKKwlpbnQgbnVtX211eF9zcmNzOworCXUxNiBzY2FybGV0dDJf c2VxOworCXU4IHZvbF91cGRhdGVkOworCXU4IG1hc3Rlcl92b2w7CisJdTggdm9sW1NDQVJMRVRU Ml9BTkFMT0dVRV9NQVhdOworCXU4IHZvbF9zd19od19zd2l0Y2hbU0NBUkxFVFQyX0FOQUxPR1VF X01BWF07CisJdTggbGV2ZWxfc3dpdGNoW1NDQVJMRVRUMl9MRVZFTF9TV0lUQ0hfTUFYXTsKKwl1 OCBwYWRfc3dpdGNoW1NDQVJMRVRUMl9QQURfU1dJVENIX01BWF07CisJdTggYnV0dG9uc1tTQ0FS TEVUVDJfQlVUVE9OX01BWF07CisJc3RydWN0IHNuZF9rY29udHJvbCAqbWFzdGVyX3ZvbF9jdGw7 CisJc3RydWN0IHNuZF9rY29udHJvbCAqdm9sX2N0bHNbU0NBUkxFVFQyX0FOQUxPR1VFX01BWF07 CisJc3RydWN0IHNuZF9rY29udHJvbCAqYnV0dG9uX2N0bHNbU0NBUkxFVFQyX0JVVFRPTl9NQVhd OworCXU4IG11eFtTQ0FSTEVUVDJfTVVYX01BWF07CisJdTggbWl4W1NDQVJMRVRUMl9JTlBVVF9N SVhfTUFYICogU0NBUkxFVFQyX09VVFBVVF9NSVhfTUFYXTsKK307CisKK3N0YXRpYyB2b2lkIHNu ZF9zY2FybGV0dF9nZW4yX3ByaXZhdGVfZnJlZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAq KTsKKworLyoqKiBNb2RlbC1zcGVjaWZpYyBkYXRhICoqKi8KKworc3RhdGljIGNvbnN0IHN0cnVj dCBzY2FybGV0dDJfZGV2aWNlX2luZm8gczZpNl9nZW4yX2luZm8gPSB7CisJLyogVGhlIGZpcnN0 IHR3byBhbmFsb2d1ZSBpbnB1dHMgY2FuIGJlIHN3aXRjaGVkIGJldHdlZW4gbGluZQorCSAqIGFu ZCBpbnN0cnVtZW50IGxldmVscy4KKwkgKi8KKwkubGV2ZWxfaW5wdXRfY291bnQgPSAyLAorCisJ LyogVGhlIGZpcnN0IHR3byBhbmFsb2d1ZSBpbnB1dHMgaGF2ZSBhbiBvcHRpb25hbCBwYWQuICov CisJLnBhZF9pbnB1dF9jb3VudCA9IDIsCisKKwkubGluZV9vdXRfZGVzY3JzID0geworCQkiTW9u aXRvciBMIiwKKwkJIk1vbml0b3IgUiIsCisJCSJIZWFkcGhvbmVzIEwiLAorCQkiSGVhZHBob25l cyBSIiwKKwl9LAorCisJLnBvcnRzID0geworCQl7CisJCQkuaWQgPSAweDAwMCwKKwkJCS5udW0g PSB7IDEsIDAsIDgsIDgsIDggfSwKKwkJCS5zcmNfZGVzY3IgPSAiT2ZmIiwKKwkJCS5zcmNfbnVt X29mZnNldCA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IDB4MDgwLAorCQkJLm51bSA9IHsgNCwg NCwgNCwgNCwgNCB9LAorCQkJLnNyY19kZXNjciA9ICJBbmFsb2d1ZSAlZCIsCisJCQkuc3JjX251 bV9vZmZzZXQgPSAxLAorCQkJLmRzdF9kZXNjciA9ICJBbmFsb2d1ZSBPdXRwdXQgJTAyZCBQbGF5 YmFjayIKKwkJfSwKKwkJeworCQkJLmlkID0gMHgxODAsCisJCQkubnVtID0geyAyLCAyLCAyLCAy LCAyIH0sCisJCQkuc3JjX2Rlc2NyID0gIlMvUERJRiAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQg PSAxLAorCQkJLmRzdF9kZXNjciA9ICJTL1BESUYgT3V0cHV0ICVkIFBsYXliYWNrIgorCQl9LAor CQl7CisJCQkuaWQgPSAweDMwMCwKKwkJCS5udW0gPSB7IDEwLCAxOCwgMTgsIDE4LCAxOCB9LAor CQkJLnNyY19kZXNjciA9ICJNaXggJWMiLAorCQkJLnNyY19udW1fb2Zmc2V0ID0gNjUsCisJCQku ZHN0X2Rlc2NyID0gIk1peGVyIElucHV0ICUwMmQgQ2FwdHVyZSIKKwkJfSwKKwkJeworCQkJLmlk ID0gMHg2MDAsCisJCQkubnVtID0geyA2LCA2LCA2LCA2LCA2IH0sCisJCQkuc3JjX2Rlc2NyID0g IlBDTSAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQgPSAxLAorCQkJLmRzdF9kZXNjciA9ICJQQ00g JTAyZCBDYXB0dXJlIgorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNjYXJs ZXR0Ml9kZXZpY2VfaW5mbyBzMThpOF9nZW4yX2luZm8gPSB7CisJLyogVGhlIGZpcnN0IHR3byBh bmFsb2d1ZSBpbnB1dHMgY2FuIGJlIHN3aXRjaGVkIGJldHdlZW4gbGluZQorCSAqIGFuZCBpbnN0 cnVtZW50IGxldmVscy4KKwkgKi8KKwkubGV2ZWxfaW5wdXRfY291bnQgPSAyLAorCisJLyogVGhl IGZpcnN0IGZvdXIgYW5hbG9ndWUgaW5wdXRzIGhhdmUgYW4gb3B0aW9uYWwgcGFkLiAqLworCS5w YWRfaW5wdXRfY291bnQgPSA0LAorCisJLmxpbmVfb3V0X2Rlc2NycyA9IHsKKwkJIk1vbml0b3Ig TCIsCisJCSJNb25pdG9yIFIiLAorCQkiSGVhZHBob25lcyAxIEwiLAorCQkiSGVhZHBob25lcyAx IFIiLAorCQkiSGVhZHBob25lcyAyIEwiLAorCQkiSGVhZHBob25lcyAyIFIiLAorCX0sCisKKwku cG9ydHMgPSB7CisJCXsKKwkJCS5pZCA9IDB4MDAwLAorCQkJLm51bSA9IHsgMSwgMCwgOCwgOCwg NCB9LAorCQkJLnNyY19kZXNjciA9ICJPZmYiLAorCQkJLnNyY19udW1fb2Zmc2V0ID0gMCwKKwkJ fSwKKwkJeworCQkJLmlkID0gMHgwODAsCisJCQkubnVtID0geyA4LCA2LCA2LCA2LCA2IH0sCisJ CQkuc3JjX2Rlc2NyID0gIkFuYWxvZ3VlICVkIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9IDEsCisJ CQkuZHN0X2Rlc2NyID0gIkFuYWxvZ3VlIE91dHB1dCAlMDJkIFBsYXliYWNrIgorCQl9LAorCQl7 CisJCQkvKiBTL1BESUYgb3V0cHV0cyBhcmVuJ3QgYXZhaWxhYmxlIGF0IDE5MktIegorCQkJICog YnV0IGFyZSBpbmNsdWRlZCBpbiB0aGUgVVNCIG11eCBJL08KKwkJCSAqIGFzc2lnbm1lbnQgbWVz c2FnZSBhbnl3YXkKKwkJCSAqLworCQkJLmlkID0gMHgxODAsCisJCQkubnVtID0geyAyLCAyLCAy LCAyLCAyIH0sCisJCQkuc3JjX2Rlc2NyID0gIlMvUERJRiAlZCIsCisJCQkuc3JjX251bV9vZmZz ZXQgPSAxLAorCQkJLmRzdF9kZXNjciA9ICJTL1BESUYgT3V0cHV0ICVkIFBsYXliYWNrIgorCQl9 LAorCQl7CisJCQkuaWQgPSAweDIwMCwKKwkJCS5udW0gPSB7IDgsIDAsIDAsIDAsIDAgfSwKKwkJ CS5zcmNfZGVzY3IgPSAiQURBVCAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQgPSAxLAorCQl9LAor CQl7CisJCQkuaWQgPSAweDMwMCwKKwkJCS5udW0gPSB7IDEwLCAxOCwgMTgsIDE4LCAxOCB9LAor CQkJLnNyY19kZXNjciA9ICJNaXggJWMiLAorCQkJLnNyY19udW1fb2Zmc2V0ID0gNjUsCisJCQku ZHN0X2Rlc2NyID0gIk1peGVyIElucHV0ICUwMmQgQ2FwdHVyZSIKKwkJfSwKKwkJeworCQkJLmlk ID0gMHg2MDAsCisJCQkubnVtID0geyAyMCwgMTgsIDE4LCAxNCwgMTAgfSwKKwkJCS5zcmNfZGVz Y3IgPSAiUENNICVkIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9IDEsCisJCQkuZHN0X2Rlc2NyID0g IlBDTSAlMDJkIENhcHR1cmUiCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg c2NhcmxldHQyX2RldmljZV9pbmZvIHMxOGkyMF9nZW4yX2luZm8gPSB7CisJLyogVGhlIGFuYWxv Z3VlIGxpbmUgb3V0cHV0cyBvbiB0aGUgMThpMjAgY2FuIGJlIHN3aXRjaGVkCisJICogYmV0d2Vl biBzb2Z0d2FyZSBhbmQgaGFyZHdhcmUgdm9sdW1lIGNvbnRyb2wKKwkgKi8KKwkubGluZV9vdXRf aHdfdm9sID0gMSwKKworCS8qIE11dGUgYW5kIGRpbSBidXR0b25zICovCisJLmJ1dHRvbl9jb3Vu dCA9IDIsCisKKwkubGluZV9vdXRfZGVzY3JzID0geworCQkiTW9uaXRvciBMIiwKKwkJIk1vbml0 b3IgUiIsCisJCU5VTEwsCisJCU5VTEwsCisJCU5VTEwsCisJCU5VTEwsCisJCSJIZWFkcGhvbmVz IDEgTCIsCisJCSJIZWFkcGhvbmVzIDEgUiIsCisJCSJIZWFkcGhvbmVzIDIgTCIsCisJCSJIZWFk cGhvbmVzIDIgUiIsCisJfSwKKworCS5wb3J0cyA9IHsKKwkJeworCQkJLmlkID0gMHgwMDAsCisJ CQkubnVtID0geyAxLCAwLCA4LCA4LCA2IH0sCisJCQkuc3JjX2Rlc2NyID0gIk9mZiIsCisJCQku c3JjX251bV9vZmZzZXQgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSAweDA4MCwKKwkJCS5udW0g PSB7IDgsIDEwLCAxMCwgMTAsIDEwIH0sCisJCQkuc3JjX2Rlc2NyID0gIkFuYWxvZ3VlICVkIiwK KwkJCS5zcmNfbnVtX29mZnNldCA9IDEsCisJCQkuZHN0X2Rlc2NyID0gIkFuYWxvZ3VlIE91dHB1 dCAlMDJkIFBsYXliYWNrIgorCQl9LAorCQl7CisJCQkvKiBTL1BESUYgb3V0cHV0cyBhcmVuJ3Qg YXZhaWxhYmxlIGF0IDE5MktIegorCQkJICogYnV0IGFyZSBpbmNsdWRlZCBpbiB0aGUgVVNCIG11 eCBJL08KKwkJCSAqIGFzc2lnbm1lbnQgbWVzc2FnZSBhbnl3YXkKKwkJCSAqLworCQkJLmlkID0g MHgxODAsCisJCQkubnVtID0geyAyLCAyLCAyLCAyLCAyIH0sCisJCQkuc3JjX2Rlc2NyID0gIlMv UERJRiAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQgPSAxLAorCQkJLmRzdF9kZXNjciA9ICJTL1BE SUYgT3V0cHV0ICVkIFBsYXliYWNrIgorCQl9LAorCQl7CisJCQkuaWQgPSAweDIwMCwKKwkJCS5u dW0gPSB7IDgsIDgsIDgsIDQsIDAgfSwKKwkJCS5zcmNfZGVzY3IgPSAiQURBVCAlZCIsCisJCQku c3JjX251bV9vZmZzZXQgPSAxLAorCQkJLmRzdF9kZXNjciA9ICJBREFUIE91dHB1dCAlZCBQbGF5 YmFjayIKKwkJfSwKKwkJeworCQkJLmlkID0gMHgzMDAsCisJCQkubnVtID0geyAxMCwgMTgsIDE4 LCAxOCwgMTggfSwKKwkJCS5zcmNfZGVzY3IgPSAiTWl4ICVjIiwKKwkJCS5zcmNfbnVtX29mZnNl dCA9IDY1LAorCQkJLmRzdF9kZXNjciA9ICJNaXhlciBJbnB1dCAlMDJkIENhcHR1cmUiCisJCX0s CisJCXsKKwkJCS5pZCA9IDB4NjAwLAorCQkJLm51bSA9IHsgMjAsIDE4LCAxOCwgMTQsIDEwIH0s CisJCQkuc3JjX2Rlc2NyID0gIlBDTSAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQgPSAxLAorCQkJ LmRzdF9kZXNjciA9ICJQQ00gJTAyZCBDYXB0dXJlIgorCQl9LAorCX0sCit9OworCisvKiBnZXQg dGhlIHN0YXJ0aW5nIHBvcnQgaW5kZXggbnVtYmVyIGZvciBhIGdpdmVuIHBvcnQgdHlwZS9kaXJl Y3Rpb24gKi8KK3N0YXRpYyBpbnQgc2NhcmxldHQyX2dldF9wb3J0X3N0YXJ0X251bShjb25zdCBz dHJ1Y3Qgc2NhcmxldHQyX3BvcnRzICpwb3J0cywKKwkJCQkJaW50IGRpcmVjdGlvbiwgaW50IHBv cnRfdHlwZSkKK3sKKwlpbnQgaSwgbnVtID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0X3R5 cGU7IGkrKykKKwkJbnVtICs9IHBvcnRzW2ldLm51bVtkaXJlY3Rpb25dOworCisJcmV0dXJuIG51 bTsKK30KKworLyoqKiBVU0IgSW50ZXJhY3Rpb25zICoqKi8KKworLyogVmVuZG9yLVNwZWNpZmlj IEludGVyZmFjZSwgRW5kcG9pbnQsIE1heFBhY2tldFNpemUsIEludGVydmFsICovCisjZGVmaW5l IFNDQVJMRVRUMl9VU0JfVkVORE9SX1NQRUNJRklDX0lOVEVSRkFDRSA1CisjZGVmaW5lIFNDQVJM RVRUMl9VU0JfSU5URVJSVVBUX0VORFBPSU5UIDQKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9JTlRF UlJVUFRfTUFYX0RBVEEgNjQKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9JTlRFUlJVUFRfSU5URVJW QUwgMworCisvKiBJbnRlcnJ1cHQgZmxhZ3MgZm9yIHZvbHVtZSBhbmQgbXV0ZS9kaW0gYnV0dG9u IGNoYW5nZXMgKi8KKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9JTlRFUlJVUFRfVk9MX0NIQU5HRSAw eDQwMDAwMAorI2RlZmluZSBTQ0FSTEVUVDJfVVNCX0lOVEVSUlVQVF9CVVRUT05fQ0hBTkdFIDB4 MjAwMDAwCisKKy8qIENvbW1hbmRzIGZvciBzZW5kaW5nL3JlY2VpdmluZyByZXF1ZXN0cy9yZXNw b25zZXMgKi8KKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9WRU5ET1JfU1BFQ0lGSUNfQ01EX1JFUSAy CisjZGVmaW5lIFNDQVJMRVRUMl9VU0JfVkVORE9SX1NQRUNJRklDX0NNRF9SRVNQIDMKKworI2Rl ZmluZSBTQ0FSTEVUVDJfVVNCX0lOSVRfU0VRIDB4MDAwMDAwMDAKKyNkZWZpbmUgU0NBUkxFVFQy X1VTQl9HRVRfTUVURVJfTEVWRUxTIDB4MDAwMDEwMDEKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9T RVRfTUlYIDB4MDAwMDIwMDIKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9TRVRfTVVYIDB4MDAwMDMw MDIKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9HRVRfREFUQSAweDAwODAwMDAwCisjZGVmaW5lIFND QVJMRVRUMl9VU0JfU0VUX0RBVEEgMHgwMDgwMDAwMQorI2RlZmluZSBTQ0FSTEVUVDJfVVNCX0RB VEFfQ01EIDB4MDA4MDAwMDIKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9DT05GSUdfU0FWRSA2CisK KyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9WT0xVTUVfU1RBVFVTX09GRlNFVCAweDMxCisjZGVmaW5l IFNDQVJMRVRUMl9VU0JfTUVURVJfTEVWRUxTX0dFVF9NQUdJQyAxCisKKy8qIHZvbHVtZSBzdGF0 dXMgaXMgcmVhZCB0b2dldGhlciAobWF0Y2hlcyBzY2FybGV0dDJfY29uZmlnX2l0ZW1zW10pICov CitzdHJ1Y3Qgc2NhcmxldHQyX3VzYl92b2x1bWVfc3RhdHVzIHsKKwkvKiBtdXRlICYgZGltIGJ1 dHRvbnMgKi8KKwl1OCBidXR0b25zW1NDQVJMRVRUMl9CVVRUT05fTUFYXTsKKworCXU4IHBhZDE7 CisKKwkvKiBzb2Z0d2FyZSB2b2x1bWUgc2V0dGluZyAqLworCXMxNiBzd192b2xbU0NBUkxFVFQy X0FOQUxPR1VFX01BWF07CisKKwkvKiBhY3R1YWwgdm9sdW1lIG9mIG91dHB1dCBpbmMuIGRpbSAo LTE4ZEIpICovCisJczE2IGh3X3ZvbFtTQ0FSTEVUVDJfQU5BTE9HVUVfTUFYXTsKKworCXU4IHBh ZDJbU0NBUkxFVFQyX0FOQUxPR1VFX01BWF07CisKKwkvKiBzdyAoMCkgb3IgaHcgKDEpIGNvbnRy b2xsZWQgKi8KKwl1OCBzd19od19zd2l0Y2hbU0NBUkxFVFQyX0FOQUxPR1VFX01BWF07CisKKwl1 OCBwYWQzWzZdOworCisJLyogZnJvbnQgcGFuZWwgdm9sdW1lIGtub2IgKi8KKwlzMTYgbWFzdGVy X3ZvbDsKK30gX19wYWNrZWQ7CisKKy8qIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyB0aGF0IGNh biBiZSByZWFkIGFuZCB3cml0dGVuICovCitlbnVtIHsKKwlTQ0FSTEVUVDJfQ09ORklHX0JVVFRP TlMgPSAwLAorCVNDQVJMRVRUMl9DT05GSUdfTElORV9PVVRfVk9MVU1FID0gMSwKKwlTQ0FSTEVU VDJfQ09ORklHX1NXX0hXX1NXSVRDSCA9IDIsCisJU0NBUkxFVFQyX0NPTkZJR19MRVZFTF9TV0lU Q0ggPSAzLAorCVNDQVJMRVRUMl9DT05GSUdfUEFEX1NXSVRDSCA9IDQsCisJU0NBUkxFVFQyX0NP TkZJR19DT1VOVCA9IDUKK307CisKKy8qIExvY2F0aW9uLCBzaXplLCBhbmQgYWN0aXZhdGlvbiBj b21tYW5kIG51bWJlciBmb3IgdGhlIGNvbmZpZ3VyYXRpb24KKyAqIHBhcmFtZXRlcnMKKyAqLwor c3RydWN0IHNjYXJsZXR0Ml9jb25maWcgeworCXU4IG9mZnNldDsKKwl1OCBzaXplOworCXU4IGFj dGl2YXRlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2FybGV0dDJfY29uZmlnCisJCXNj YXJsZXR0Ml9jb25maWdfaXRlbXNbU0NBUkxFVFQyX0NPTkZJR19DT1VOVF0gPSB7CisJLyogTXV0 ZS9EaW0gQnV0dG9ucyAqLworCXsKKwkJLm9mZnNldCA9IDB4MzEsCisJCS5zaXplID0gMSwKKwkJ LmFjdGl2YXRlID0gMgorCX0sCisKKwkvKiBMaW5lIE91dCBWb2x1bWUgKi8KKwl7CisJCS5vZmZz ZXQgPSAweDM0LAorCQkuc2l6ZSA9IDIsCisJCS5hY3RpdmF0ZSA9IDEKKwl9LAorCisJLyogU1cv SFcgVm9sdW1lIFN3aXRjaCAqLworCXsKKwkJLm9mZnNldCA9IDB4NjYsCisJCS5zaXplID0gMSwK KwkJLmFjdGl2YXRlID0gMworCX0sCisKKwkvKiBMZXZlbCBTd2l0Y2ggKi8KKwl7CisJCS5vZmZz ZXQgPSAweDdjLAorCQkuc2l6ZSA9IDEsCisJCS5hY3RpdmF0ZSA9IDcKKwl9LAorCisJLyogUGFk IFN3aXRjaCAqLworCXsKKwkJLm9mZnNldCA9IDB4ODQsCisJCS5zaXplID0gMSwKKwkJLmFjdGl2 YXRlID0gOAorCX0KK307CisKKy8qIHByb3ByaWV0YXJ5IHJlcXVlc3QvcmVzcG9uc2UgZm9ybWF0 ICovCitzdHJ1Y3Qgc2NhcmxldHQyX3VzYl9wYWNrZXQgeworCXUzMiBjbWQ7CisJdTE2IHNpemU7 CisJdTE2IHNlcTsKKwl1MzIgZXJyb3I7CisJdTMyIHBhZDsKKwl1OCBkYXRhW107Cit9OworCisj ZGVmaW5lIFNDQVJMRVRUMl9VU0JfUEFDS0VUX0xFTiAoc2l6ZW9mKHN0cnVjdCBzY2FybGV0dDJf dXNiX3BhY2tldCkpCisKK3N0YXRpYyB2b2lkIHNjYXJsZXR0Ml9maWxsX3JlcXVlc3RfaGVhZGVy KHN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSwKKwkJCQkJICBzdHJ1Y3Qgc2Nh cmxldHQyX3VzYl9wYWNrZXQgKnJlcSwKKwkJCQkJICB1MzIgY21kLCB1MTYgcmVxX3NpemUpCit7 CisJLyogc2VxdWVuY2UgbXVzdCBnbyB1cCBieSAxIGZvciBlYWNoIHJlcXVlc3QgKi8KKwl1MTYg c2VxID0gcHJpdmF0ZS0+c2NhcmxldHQyX3NlcSsrOworCisJcmVxLT5jbWQgPSBjcHVfdG9fbGUz MihjbWQpOworCXJlcS0+c2l6ZSA9IGNwdV90b19sZTE2KHJlcV9zaXplKTsKKwlyZXEtPnNlcSA9 IGNwdV90b19sZTE2KHNlcSk7CisJcmVxLT5lcnJvciA9IDA7CisJcmVxLT5wYWQgPSAwOworfQor CisvKiBTZW5kIGEgcHJvcHJpZXRhcnkgZm9ybWF0IHJlcXVlc3QgdG8gdGhlIFNjYXJsZXR0IGlu dGVyZmFjZSAqLworc3RhdGljIGludCBzY2FybGV0dDJfdXNiKAorCXN0cnVjdCB1c2JfbWl4ZXJf aW50ZXJmYWNlICptaXhlciwgdTMyIGNtZCwKKwl2b2lkICpyZXFfZGF0YSwgdTE2IHJlcV9zaXpl LCB2b2lkICpyZXNwX2RhdGEsIHUxNiByZXNwX3NpemUpCit7CisJc3RydWN0IHNjYXJsZXR0Ml9t aXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKworCXUxNiByZXFfYnVm X3NpemUgPSBzaXplb2Yoc3RydWN0IHNjYXJsZXR0Ml91c2JfcGFja2V0KSArIHJlcV9zaXplOwor CXUxNiByZXNwX2J1Zl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2FybGV0dDJfdXNiX3BhY2tldCkg KyByZXNwX3NpemU7CisKKwlzdHJ1Y3Qgc2NhcmxldHQyX3VzYl9wYWNrZXQgKnJlcSA9IDAsICpy ZXNwID0gMDsKKworCWludCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmcHJpdmF0ZS0+dXNiX211 dGV4KTsKKworCS8qIGJ1aWxkIHJlcXVlc3QgbWVzc2FnZSBhbmQgc2VuZCBpdCAqLworCisJcmVx ID0ga21hbGxvYyhyZXFfYnVmX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghcmVxKSB7CisJCWVy ciA9IC1FTk9NRU07CisJCWdvdG8gdW5sb2NrOworCX0KKworCXNjYXJsZXR0Ml9maWxsX3JlcXVl c3RfaGVhZGVyKHByaXZhdGUsIHJlcSwgY21kLCByZXFfc2l6ZSk7CisKKwlpZiAocmVxX3NpemUp CisJCW1lbWNweShyZXEtPmRhdGEsIHJlcV9kYXRhLCByZXFfc2l6ZSk7CisKKwllcnIgPSBzbmRf dXNiX2N0bF9tc2cobWl4ZXItPmNoaXAtPmRldiwKKwkJCXVzYl9zbmRjdHJscGlwZShtaXhlci0+ Y2hpcC0+ZGV2LCAwKSwKKwkJCVNDQVJMRVRUMl9VU0JfVkVORE9SX1NQRUNJRklDX0NNRF9SRVEs CisJCQlVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRElSX09VVCwK KwkJCTAsCisJCQlTQ0FSTEVUVDJfVVNCX1ZFTkRPUl9TUEVDSUZJQ19JTlRFUkZBQ0UsCisJCQly ZXEsCisJCQlyZXFfYnVmX3NpemUpOworCisJaWYgKGVyciAhPSByZXFfYnVmX3NpemUpIHsKKwkJ dXNiX2F1ZGlvX2VycigKKwkJCW1peGVyLT5jaGlwLAorCQkJIlNjYXJsZXR0IEdlbiAyIFVTQiBy ZXF1ZXN0IHJlc3VsdCBjbWQgJXggd2FzICVkXG4iLAorCQkJY21kLCBlcnIpOworCQllcnIgPSAt RUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisKKwkvKiBzZW5kIGEgc2Vjb25kIG1lc3NhZ2Ug dG8gZ2V0IHRoZSByZXNwb25zZSAqLworCisJcmVzcCA9IGttYWxsb2MocmVzcF9idWZfc2l6ZSwg R0ZQX0tFUk5FTCk7CisJaWYgKCFyZXNwKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gdW5s b2NrOworCX0KKworCWVyciA9IHNuZF91c2JfY3RsX21zZyhtaXhlci0+Y2hpcC0+ZGV2LAorCQkJ dXNiX3NuZGN0cmxwaXBlKG1peGVyLT5jaGlwLT5kZXYsIDApLAorCQkJU0NBUkxFVFQyX1VTQl9W RU5ET1JfU1BFQ0lGSUNfQ01EX1JFU1AsCisJCQlVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX1RZ UEVfQ0xBU1MgfCBVU0JfRElSX0lOLAorCQkJMCwKKwkJCVNDQVJMRVRUMl9VU0JfVkVORE9SX1NQ RUNJRklDX0lOVEVSRkFDRSwKKwkJCXJlc3AsCisJCQlyZXNwX2J1Zl9zaXplKTsKKworCS8qIHZh bGlkYXRlIHRoZSByZXNwb25zZSAqLworCisJaWYgKGVyciAhPSByZXNwX2J1Zl9zaXplKSB7CisJ CXVzYl9hdWRpb19lcnIoCisJCQltaXhlci0+Y2hpcCwKKwkJCSJTY2FybGV0dCBHZW4gMiBVU0Ig cmVzcG9uc2UgcmVzdWx0IGNtZCAleCB3YXMgJWRcbiIsCisJCQljbWQsIGVycik7CisJCWVyciA9 IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWlmIChyZXNwLT5jbWQgIT0gcmVxLT5j bWQgfHwKKwkgICAgcmVzcC0+c2VxICE9IHJlcS0+c2VxIHx8CisJICAgIHJlc3Bfc2l6ZSAhPSBs ZTE2X3RvX2NwdShyZXNwLT5zaXplKSB8fAorCSAgICByZXNwLT5lcnJvciB8fAorCSAgICByZXNw LT5wYWQpIHsKKwkJdXNiX2F1ZGlvX2VycigKKwkJCW1peGVyLT5jaGlwLAorCQkJIlNjYXJsZXR0 IEdlbiAyIFVTQiBpbnZhbGlkIHJlc3BvbnNlOyAiCisJCQkgICAiY21kIHR4L3J4ICVkLyVkIHNl cSAlZC8lZCBzaXplICVkLyVkICIKKwkJCSAgICJlcnJvciAlZCBwYWQgJWRcbiIsCisJCQlsZTE2 X3RvX2NwdShyZXEtPmNtZCksIGxlMTZfdG9fY3B1KHJlc3AtPmNtZCksCisJCQlsZTE2X3RvX2Nw dShyZXEtPnNlcSksIGxlMTZfdG9fY3B1KHJlc3AtPnNlcSksCisJCQlyZXNwX3NpemUsIGxlMTZf dG9fY3B1KHJlc3AtPnNpemUpLAorCQkJbGUxNl90b19jcHUocmVzcC0+ZXJyb3IpLAorCQkJbGUx Nl90b19jcHUocmVzcC0+cGFkKSk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOwor CX0KKworCWlmIChyZXNwX3NpemUgPiAwKQorCQltZW1jcHkocmVzcF9kYXRhLCByZXNwLT5kYXRh LCByZXNwX3NpemUpOworCit1bmxvY2s6CisJa2ZyZWUocmVxKTsKKwlrZnJlZShyZXNwKTsKKwlt dXRleF91bmxvY2soJnByaXZhdGUtPnVzYl9tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworLyog U2VuZCBTQ0FSTEVUVDJfVVNCX0RBVEFfQ01EIFNDQVJMRVRUMl9VU0JfQ09ORklHX1NBVkUgKi8K K3N0YXRpYyB2b2lkIHNjYXJsZXR0Ml9jb25maWdfc2F2ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndv cmspCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0KKwkJY29udGFp bmVyX29mKHdvcmssIHN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSwgd29yay53b3JrKTsKKwlz dHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIgPSBwcml2YXRlLT5taXhlcjsKKwl1MzIg cmVxID0gY3B1X3RvX2xlMzIoU0NBUkxFVFQyX1VTQl9DT05GSUdfU0FWRSk7CisKKwlzY2FybGV0 dDJfdXNiKG1peGVyLCBTQ0FSTEVUVDJfVVNCX0RBVEFfQ01ELAorCQkgICAgICAmcmVxLCBzaXpl b2YodTMyKSwKKwkJICAgICAgTlVMTCwgMCk7Cit9CisKKy8qIFNlbmQgYSBVU0IgbWVzc2FnZSB0 byBzZXQgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciAodm9sdW1lIGxldmVsLAorICogc3cvaHcg dm9sdW1lIHN3aXRjaCwgbGluZS9pbnN0IGxldmVsIHN3aXRjaCwgb3IgcGFkIHN3aXRjaCkKKyAq Lworc3RhdGljIGludCBzY2FybGV0dDJfdXNiX3NldF9jb25maWcoCisJc3RydWN0IHVzYl9taXhl cl9pbnRlcmZhY2UgKm1peGVyLAorCWludCBjb25maWdfaXRlbV9udW0sIGludCBpbmRleCwgaW50 IHZhbHVlKQoreworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfY29uZmlnIGNvbmZpZ19pdGVtID0K KwkgICAgICAgc2NhcmxldHQyX2NvbmZpZ19pdGVtc1tjb25maWdfaXRlbV9udW1dOworCXN0cnVj dCB7CisJCXUzMiBvZmZzZXQ7CisJCXUzMiBieXRlczsKKwkJczMyIHZhbHVlOworCX0gX19wYWNr ZWQgcmVxOworCXUzMiByZXEyOworCWludCBlcnI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9k YXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKworCS8qIFNlbmQgdGhlIGNvbmZp Z3VyYXRpb24gcGFyYW1ldGVyIGRhdGEgKi8KKwlyZXEub2Zmc2V0ID0gY3B1X3RvX2xlMzIoY29u ZmlnX2l0ZW0ub2Zmc2V0ICsgaW5kZXggKiBjb25maWdfaXRlbS5zaXplKTsKKwlyZXEuYnl0ZXMg PSBjcHVfdG9fbGUzMihjb25maWdfaXRlbS5zaXplKTsKKwlyZXEudmFsdWUgPSBjcHVfdG9fbGUz Mih2YWx1ZSk7CisJZXJyID0gc2NhcmxldHQyX3VzYihtaXhlciwgU0NBUkxFVFQyX1VTQl9TRVRf REFUQSwKKwkJCSAgICAmcmVxLCBzaXplb2YodTMyKSAqIDIgKyBjb25maWdfaXRlbS5zaXplLAor CQkJICAgIE5VTEwsIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogQWN0 aXZhdGUgdGhlIGNoYW5nZSAqLworCXJlcTIgPSBjcHVfdG9fbGUzMihjb25maWdfaXRlbS5hY3Rp dmF0ZSk7CisJZXJyID0gc2NhcmxldHQyX3VzYihtaXhlciwgU0NBUkxFVFQyX1VTQl9EQVRBX0NN RCwKKwkJCSAgICAmcmVxMiwgc2l6ZW9mKHJlcTIpLCBOVUxMLCAwKTsKKwlpZiAoZXJyIDwgMCkK KwkJcmV0dXJuIGVycjsKKworCS8qIFNjaGVkdWxlIHRoZSBjaGFuZ2UgdG8gYmUgd3JpdHRlbiB0 byBOVlJBTSAqLworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdmF0ZS0+d29yaywgbXNlY3Nf dG9famlmZmllcygyMDAwKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBhIFVTQiBtZXNz YWdlIHRvIGdldCBkYXRhOyByZXN1bHQgcGxhY2VkIGluICpidWYgKi8KK3N0YXRpYyBpbnQgc2Nh cmxldHQyX3VzYl9nZXQoCisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLAorCWlu dCBvZmZzZXQsIHZvaWQgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IHsKKwkJdTMyIG9mZnNl dDsKKwkJdTMyIHNpemU7CisJfSBfX3BhY2tlZCByZXE7CisKKwlyZXEub2Zmc2V0ID0gY3B1X3Rv X2xlMzIob2Zmc2V0KTsKKwlyZXEuc2l6ZSA9IGNwdV90b19sZTMyKHNpemUpOworCXJldHVybiBz Y2FybGV0dDJfdXNiKG1peGVyLCBTQ0FSTEVUVDJfVVNCX0dFVF9EQVRBLAorCQkJICAgICAmcmVx LCBzaXplb2YocmVxKSwgYnVmLCBzaXplKTsKK30KKworLyogU2VuZCBhIFVTQiBtZXNzYWdlIHRv IGdldCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM7IHJlc3VsdCBwbGFjZWQgaW4gKmJ1ZiAqLwor c3RhdGljIGludCBzY2FybGV0dDJfdXNiX2dldF9jb25maWcoCisJc3RydWN0IHVzYl9taXhlcl9p bnRlcmZhY2UgKm1peGVyLAorCWludCBjb25maWdfaXRlbV9udW0sIGludCBjb3VudCwgdm9pZCAq YnVmKQoreworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfY29uZmlnIGNvbmZpZ19pdGVtID0KKwkg ICAgICAgc2NhcmxldHQyX2NvbmZpZ19pdGVtc1tjb25maWdfaXRlbV9udW1dOworCWludCBzaXpl ID0gY29uZmlnX2l0ZW0uc2l6ZSAqIGNvdW50OworCisJcmV0dXJuIHNjYXJsZXR0Ml91c2JfZ2V0 KG1peGVyLCBjb25maWdfaXRlbS5vZmZzZXQsIGJ1Ziwgc2l6ZSk7Cit9CisKKy8qIFNlbmQgYSBV U0IgbWVzc2FnZSB0byBnZXQgdm9sdW1lIHN0YXR1czsgcmVzdWx0IHBsYWNlZCBpbiAqYnVmICov CitzdGF0aWMgaW50IHNjYXJsZXR0Ml91c2JfZ2V0X3ZvbHVtZV9zdGF0dXMoCisJc3RydWN0IHVz Yl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLAorCXN0cnVjdCBzY2FybGV0dDJfdXNiX3ZvbHVtZV9z dGF0dXMgKmJ1ZikKK3sKKwlyZXR1cm4gc2NhcmxldHQyX3VzYl9nZXQobWl4ZXIsIFNDQVJMRVRU Ml9VU0JfVk9MVU1FX1NUQVRVU19PRkZTRVQsCisJCQkJIGJ1Ziwgc2l6ZW9mKCpidWYpKTsKK30K KworLyogU2VuZCBhIFVTQiBtZXNzYWdlIHRvIHNldCB0aGUgdm9sdW1lcyBmb3IgYWxsIGlucHV0 cyBvZiBvbmUgbWl4CisgKiAodmFsdWVzIG9idGFpbmVkIGZyb20gcHJpdmF0ZS0+bWl4W10pCisg Ki8KK3N0YXRpYyBpbnQgc2NhcmxldHQyX3VzYl9zZXRfbWl4KHN0cnVjdCB1c2JfbWl4ZXJfaW50 ZXJmYWNlICptaXhlciwKKwkJCQkgICAgIGludCBtaXhfbnVtKQoreworCXN0cnVjdCBzY2FybGV0 dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7CisJY29uc3Qgc3Ry dWN0IHNjYXJsZXR0Ml9kZXZpY2VfaW5mbyAqaW5mbyA9IHByaXZhdGUtPmluZm87CisKKwlzdHJ1 Y3QgeworCQl1MTYgbWl4X251bTsKKwkJdTE2IGRhdGFbU0NBUkxFVFQyX0lOUFVUX01JWF9NQVhd OworCX0gX19wYWNrZWQgcmVxOworCisJaW50IGksIGo7CisJaW50IG51bV9taXhlcl9pbiA9CisJ CWluZm8tPnBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfTUlYXS5udW1bU0NBUkxFVFQyX1BPUlRf T1VUXTsKKworCXJlcS5taXhfbnVtID0gY3B1X3RvX2xlMTYobWl4X251bSk7CisKKwlmb3IgKGkg PSAwLCBqID0gbWl4X251bSAqIG51bV9taXhlcl9pbjsgaSA8IG51bV9taXhlcl9pbjsgaSsrLCBq KyspCisJCXJlcS5kYXRhW2ldID0gY3B1X3RvX2xlMTYoCisJCQlzY2FybGV0dDJfbWl4ZXJfdmFs dWVzW3ByaXZhdGUtPm1peFtqXV0KKwkJKTsKKworCXJldHVybiBzY2FybGV0dDJfdXNiKG1peGVy LCBTQ0FSTEVUVDJfVVNCX1NFVF9NSVgsCisJCQkgICAgICZyZXEsIChudW1fbWl4ZXJfaW4gKyAx KSAqIHNpemVvZih1MTYpLAorCQkJICAgICBOVUxMLCAwKTsKK30KKworLyogQ29udmVydCBhIHBv cnQgbnVtYmVyIGluZGV4IChwZXIgaW5mby0+cG9ydHMpIHRvIGEgaGFyZHdhcmUgSUQgKi8KK3N0 YXRpYyB1MzIgc2NhcmxldHQyX211eF9zcmNfbnVtX3RvX2lkKGNvbnN0IHN0cnVjdCBzY2FybGV0 dDJfcG9ydHMgKnBvcnRzLAorCQkJCSAgICAgICBpbnQgbnVtKQoreworCWludCBwb3J0X3R5cGU7 CisKKwlmb3IgKHBvcnRfdHlwZSA9IDA7CisJICAgICBwb3J0X3R5cGUgPCBTQ0FSTEVUVDJfUE9S VF9UWVBFX0NPVU5UOworCSAgICAgcG9ydF90eXBlKyspIHsKKwkJaWYgKG51bSA8IHBvcnRzW3Bv cnRfdHlwZV0ubnVtW1NDQVJMRVRUMl9QT1JUX0lOXSkKKwkJCXJldHVybiBwb3J0c1twb3J0X3R5 cGVdLmlkIHwgbnVtOworCQludW0gLT0gcG9ydHNbcG9ydF90eXBlXS5udW1bU0NBUkxFVFQyX1BP UlRfSU5dOworCX0KKworCS8qIE9vcHMgKi8KKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBVU0Ig bWVzc2FnZXMgdG8gc2V0IG11eCBpbnB1dHMgKi8KK3N0YXRpYyBpbnQgc2NhcmxldHQyX3VzYl9z ZXRfbXV4KHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwlzdHJ1Y3Qgc2Nh cmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCWNvbnN0 IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmluZm8gPSBwcml2YXRlLT5pbmZvOworCWNv bnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzID0gaW5mby0+cG9ydHM7CisJaW50IHJh dGUsIHBvcnRfZGlyX3JhdGU7CisKKwlzdGF0aWMgY29uc3QgaW50IGFzc2lnbm1lbnRfb3JkZXJb U0NBUkxFVFQyX1BPUlRfVFlQRV9DT1VOVF0gPSB7CisJCVNDQVJMRVRUMl9QT1JUX1RZUEVfUENN LAorCQlTQ0FSTEVUVDJfUE9SVF9UWVBFX0FOQUxPR1VFLAorCQlTQ0FSTEVUVDJfUE9SVF9UWVBF X1NQRElGLAorCQlTQ0FSTEVUVDJfUE9SVF9UWVBFX0FEQVQsCisJCVNDQVJMRVRUMl9QT1JUX1RZ UEVfTUlYLAorCQlTQ0FSTEVUVDJfUE9SVF9UWVBFX05PTkUsCisJfTsKKworCXN0cnVjdCB7CisJ CXUxNiBwYWQ7CisJCXUxNiBudW07CisJCXUzMiBkYXRhW1NDQVJMRVRUMl9NVVhfTUFYXTsKKwl9 IF9fcGFja2VkIHJlcTsKKworCXJlcS5wYWQgPSAwOworCisJLyogbXV4IHNldHRpbmdzIGZvciBl YWNoIHJhdGUgKi8KKwlmb3IgKHJhdGUgPSAwLCBwb3J0X2Rpcl9yYXRlID0gU0NBUkxFVFQyX1BP UlRfT1VUXzQ0OworCSAgICAgcG9ydF9kaXJfcmF0ZSA8PSBTQ0FSTEVUVDJfUE9SVF9PVVRfMTc2 OworCSAgICAgcmF0ZSsrLCBwb3J0X2Rpcl9yYXRlKyspIHsKKwkJaW50IG9yZGVyX251bSwgaSwg ZXJyOworCisJCXJlcS5udW0gPSBjcHVfdG9fbGUxNihyYXRlKTsKKworCQlmb3IgKG9yZGVyX251 bSA9IDAsIGkgPSAwOworCQkgICAgIG9yZGVyX251bSA8IFNDQVJMRVRUMl9QT1JUX1RZUEVfQ09V TlQ7CisJCSAgICAgb3JkZXJfbnVtKyspIHsKKwkJCWludCBwb3J0X3R5cGUgPSBhc3NpZ25tZW50 X29yZGVyW29yZGVyX251bV07CisJCQlpbnQgaiA9IHNjYXJsZXR0Ml9nZXRfcG9ydF9zdGFydF9u dW0ocG9ydHMsCisJCQkJCQkJICAgICBTQ0FSTEVUVDJfUE9SVF9PVVQsCisJCQkJCQkJICAgICBw b3J0X3R5cGUpOworCQkJaW50IHBvcnRfaWQgPSBwb3J0c1twb3J0X3R5cGVdLmlkOworCQkJaW50 IGNoYW5uZWw7CisKKwkJCWZvciAoY2hhbm5lbCA9IDA7CisJCQkgICAgIGNoYW5uZWwgPCBwb3J0 c1twb3J0X3R5cGVdLm51bVtwb3J0X2Rpcl9yYXRlXTsKKwkJCSAgICAgY2hhbm5lbCsrLCBpKyss IGorKykKKwkJCQkvKiBsb3dlciAxMiBiaXRzIGZvciB0aGUgZGVzdGluYXRpb24gYW5kCisJCQkJ ICogbmV4dCAxMiBiaXRzIGZvciB0aGUgc291cmNlCisJCQkJICovCisJCQkJcmVxLmRhdGFbaV0g PSAhcG9ydF9pZAorCQkJCQk/IDAKKwkJCQkJOiBjcHVfdG9fbGUzMigKKwkJCQkJCXBvcnRfaWQg fAorCQkJCQkJY2hhbm5lbCB8CisJCQkJCQlzY2FybGV0dDJfbXV4X3NyY19udW1fdG9faWQoCisJ CQkJCQkJcG9ydHMsIHByaXZhdGUtPm11eFtqXQorCQkJCQkJKSA8PCAxMgorCQkJCQkgICk7CisK KwkJCS8qIHNraXAgcHJpdmF0ZS0+bXV4W2pdIGVudHJpZXMgbm90IG91dHB1dCAqLworCQkJaiAr PSBwb3J0c1twb3J0X3R5cGVdLm51bVtTQ0FSTEVUVDJfUE9SVF9PVVRdIC0KKwkJCSAgICAgcG9y dHNbcG9ydF90eXBlXS5udW1bcG9ydF9kaXJfcmF0ZV07CisJCX0KKworCQllcnIgPSBzY2FybGV0 dDJfdXNiKG1peGVyLCBTQ0FSTEVUVDJfVVNCX1NFVF9NVVgsCisJCQkJICAgICZyZXEsIChpICsg MSkgKiBzaXplb2YodTMyKSwKKwkJCQkgICAgTlVMTCwgMCk7CisJCWlmIChlcnIgPCAwKQorCQkJ cmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBVU0IgbWVzc2FnZSB0 byBnZXQgbWV0ZXIgbGV2ZWxzICovCitzdGF0aWMgaW50IHNjYXJsZXR0Ml91c2JfZ2V0X21ldGVy X2xldmVscyhzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIsCisJCQkJCSAgdTE2ICps ZXZlbHMpCit7CisJc3RydWN0IHsKKwkJdTE2IHBhZDsKKwkJdTE2IG51bV9tZXRlcnM7CisJCXUz MiBtYWdpYzsKKwl9IF9fcGFja2VkIHJlcTsKKwl1MzIgcmVzcFtTQ0FSTEVUVDJfTlVNX01FVEVS U107CisJaW50IGksIGVycjsKKworCXJlcS5wYWQgPSAwOworCXJlcS5udW1fbWV0ZXJzID0gY3B1 X3RvX2xlMTYoU0NBUkxFVFQyX05VTV9NRVRFUlMpOworCXJlcS5tYWdpYyA9IGNwdV90b19sZTMy KFNDQVJMRVRUMl9VU0JfTUVURVJfTEVWRUxTX0dFVF9NQUdJQyk7CisJZXJyID0gc2NhcmxldHQy X3VzYihtaXhlciwgU0NBUkxFVFQyX1VTQl9HRVRfTUVURVJfTEVWRUxTLAorCQkJICAgICZyZXEs IHNpemVvZihyZXEpLCByZXNwLCBzaXplb2YocmVzcCkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1 cm4gZXJyOworCisJLyogY29weSwgY29udmVydCB0byB1MTYgKi8KKwlmb3IgKGkgPSAwOyBpIDwg U0NBUkxFVFQyX05VTV9NRVRFUlM7IGkrKykKKwkJbGV2ZWxzW2ldID0gcmVzcFtpXTsKKworCXJl dHVybiAwOworfQorCisvKioqIENvbnRyb2wgRnVuY3Rpb25zICoqKi8KKworLyogaGVscGVyIGZ1 bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBjb250cm9sICovCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9h ZGRfbmV3X2N0bChzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIsCisJCQkJIGNvbnN0 IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpuY29udHJvbCwKKwkJCQkgaW50IGluZGV4LCBpbnQg Y2hhbm5lbHMsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJIHN0cnVjdCBzbmRfa2NvbnRyb2wgKipr Y3RsX3JldHVybikKK3sKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOworCXN0cnVjdCB1c2Jf bWl4ZXJfZWxlbV9pbmZvICplbGVtOworCWludCBlcnI7CisKKwllbGVtID0ga3phbGxvYyhzaXpl b2YoKmVsZW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVsZW0pCisJCXJldHVybiAtRU5PTUVNOwor CisJZWxlbS0+aGVhZC5taXhlciA9IG1peGVyOworCWVsZW0tPmNvbnRyb2wgPSBpbmRleDsKKwll bGVtLT5oZWFkLmlkID0gaW5kZXg7CisJZWxlbS0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKworCWtj dGwgPSBzbmRfY3RsX25ldzEobmNvbnRyb2wsIGVsZW0pOworCWlmICgha2N0bCkgeworCQlrZnJl ZShlbGVtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWtjdGwtPnByaXZhdGVfZnJlZSA9IHNu ZF91c2JfbWl4ZXJfZWxlbV9mcmVlOworCisJc3RybGNweShrY3RsLT5pZC5uYW1lLCBuYW1lLCBz aXplb2Yoa2N0bC0+aWQubmFtZSkpOworCisJZXJyID0gc25kX3VzYl9taXhlcl9hZGRfY29udHJv bCgmZWxlbS0+aGVhZCwga2N0bCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlp ZiAoa2N0bF9yZXR1cm4pCisJCSprY3RsX3JldHVybiA9IGtjdGw7CisKKwlyZXR1cm4gMDsKK30K KworLyoqKiBBbmFsb2d1ZSBMaW5lIE91dCBWb2x1bWUgQ29udHJvbHMgKioqLworCisvKiBVcGRh dGUgaGFyZHdhcmUgdm9sdW1lIGNvbnRyb2xzIGFmdGVyIHJlY2VpdmluZyBub3RpZmljYXRpb24g dGhhdAorICogdGhleSBoYXZlIGNoYW5nZWQKKyAqLworc3RhdGljIGludCBzY2FybGV0dDJfdXBk YXRlX3ZvbHVtZXMoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXN0cnVj dCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7CisJ Y29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMgPSBwcml2YXRlLT5pbmZvLT5wb3J0 czsKKwlzdHJ1Y3Qgc2NhcmxldHQyX3VzYl92b2x1bWVfc3RhdHVzIHZvbHVtZV9zdGF0dXM7CisJ aW50IG51bV9saW5lX291dCA9CisJCXBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfQU5BTE9HVUVd Lm51bVtTQ0FSTEVUVDJfUE9SVF9PVVRdOworCWludCBlcnIsIGk7CisKKwlwcml2YXRlLT52b2xf dXBkYXRlZCA9IDA7CisKKwllcnIgPSBzY2FybGV0dDJfdXNiX2dldF92b2x1bWVfc3RhdHVzKG1p eGVyLCAmdm9sdW1lX3N0YXR1cyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlw cml2YXRlLT5tYXN0ZXJfdm9sID0gY2xhbXAoCisJCXZvbHVtZV9zdGF0dXMubWFzdGVyX3ZvbCAr IFNDQVJMRVRUX1ZPTFVNRV9CSUFTLAorCQkwLCBTQ0FSTEVUVF9WT0xVTUVfQklBUyk7CisKKwlm b3IgKGkgPSAwOyBpIDwgbnVtX2xpbmVfb3V0OyBpKyspIHsKKwkJaWYgKHByaXZhdGUtPnZvbF9z d19od19zd2l0Y2hbaV0pCisJCQlwcml2YXRlLT52b2xbaV0gPSBwcml2YXRlLT5tYXN0ZXJfdm9s OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwcml2YXRlLT5pbmZvLT5idXR0b25fY291bnQ7IGkr KykKKwkJcHJpdmF0ZS0+YnV0dG9uc1tpXSA9ICEhdm9sdW1lX3N0YXR1cy5idXR0b25zW2ldOwor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX3ZvbHVtZV9jdGxfaW5mbyhz dHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9p bmZvICp1aW5mbykKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwt PnByaXZhdGVfZGF0YTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRF R0VSOworCXVpbmZvLT5jb3VudCA9IGVsZW0tPmNoYW5uZWxzOworCXVpbmZvLT52YWx1ZS5pbnRl Z2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gU0NBUkxFVFRfVk9MVU1F X0JJQVM7CisJdWluZm8tPnZhbHVlLmludGVnZXIuc3RlcCA9IDE7CisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbnQgc2NhcmxldHQyX21hc3Rlcl92b2x1bWVfY3RsX2dldChzdHJ1Y3Qgc25kX2tj b250cm9sICprY3RsLAorCQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJv bCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVf ZGF0YTsKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIgPSBlbGVtLT5oZWFkLm1p eGVyOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2 YXRlX2RhdGE7CisKKwlpZiAocHJpdmF0ZS0+dm9sX3VwZGF0ZWQpIHsKKwkJbXV0ZXhfbG9jaygm cHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJCXNjYXJsZXR0Ml91cGRhdGVfdm9sdW1lcyhtaXhlcik7 CisJCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJfQorCisJdWNvbnRyb2wt PnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBwcml2YXRlLT5tYXN0ZXJfdm9sOworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml92b2x1bWVfY3RsX2dldChzdHJ1Y3Qgc25kX2tj b250cm9sICprY3RsLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJv bCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVf ZGF0YTsKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIgPSBlbGVtLT5oZWFkLm1p eGVyOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2 YXRlX2RhdGE7CisJaW50IGluZGV4ID0gZWxlbS0+Y29udHJvbDsKKworCWlmIChwcml2YXRlLT52 b2xfdXBkYXRlZCkgeworCQltdXRleF9sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwkJc2Nh cmxldHQyX3VwZGF0ZV92b2x1bWVzKG1peGVyKTsKKwkJbXV0ZXhfdW5sb2NrKCZwcml2YXRlLT5k YXRhX211dGV4KTsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHBy aXZhdGUtPnZvbFtpbmRleF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQy X3ZvbHVtZV9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJICAgIHN0cnVj dCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxl bV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50 ZXJmYWNlICptaXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhl cl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwlpbnQgaW5kZXggPSBlbGVt LT5jb250cm9sOworCWludCBvdmFsLCB2YWwsIGVyciA9IDA7CisKKwljYW5jZWxfZGVsYXllZF93 b3JrX3N5bmMoJnByaXZhdGUtPndvcmspOworCW11dGV4X2xvY2soJnByaXZhdGUtPmRhdGFfbXV0 ZXgpOworCisJb3ZhbCA9IHByaXZhdGUtPnZvbFtpbmRleF07CisJdmFsID0gdWNvbnRyb2wtPnZh bHVlLmludGVnZXIudmFsdWVbMF07CisKKwlpZiAob3ZhbCA9PSB2YWwpCisJCWdvdG8gdW5sb2Nr OworCisJcHJpdmF0ZS0+dm9sW2luZGV4XSA9IHZhbDsKKwllcnIgPSBzY2FybGV0dDJfdXNiX3Nl dF9jb25maWcobWl4ZXIsIFNDQVJMRVRUMl9DT05GSUdfTElORV9PVVRfVk9MVU1FLAorCQkJCSAg ICAgICBpbmRleCwgdmFsIC0gU0NBUkxFVFRfVk9MVU1FX0JJQVMpOworCWlmIChlcnIgPT0gMCkK KwkJZXJyID0gMTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRl eCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX01JTk1B WCgKKwlkYl9zY2FsZV9zY2FybGV0dF9nYWluLCAtU0NBUkxFVFRfVk9MVU1FX0JJQVMgKiAxMDAs IDAKKyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzY2FybGV0dDJf bWFzdGVyX3ZvbHVtZV9jdGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlY RVIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwKKwkJICBTTkRSVl9D VExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsCisJLm5hbWUgPSAiIiwKKwkuaW5mbyA9IHNjYXJsZXR0 Ml92b2x1bWVfY3RsX2luZm8sCisJLmdldCAgPSBzY2FybGV0dDJfbWFzdGVyX3ZvbHVtZV9jdGxf Z2V0LAorCS5wcml2YXRlX3ZhbHVlID0gMCwgLyogbWF4IHZhbHVlICovCisJLnRsdiA9IHsgLnAg PSBkYl9zY2FsZV9zY2FybGV0dF9nYWluIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25k X2tjb250cm9sX25ldyBzY2FybGV0dDJfbGluZV9vdXRfdm9sdW1lX2N0bCA9IHsKKwkuaWZhY2Ug PSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1f QUNDRVNTX1JFQURXUklURSB8CisJCSAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFELAor CS5uYW1lID0gIiIsCisJLmluZm8gPSBzY2FybGV0dDJfdm9sdW1lX2N0bF9pbmZvLAorCS5nZXQg ID0gc2NhcmxldHQyX3ZvbHVtZV9jdGxfZ2V0LAorCS5wdXQgID0gc2NhcmxldHQyX3ZvbHVtZV9j dGxfcHV0LAorCS5wcml2YXRlX3ZhbHVlID0gMCwgLyogbWF4IHZhbHVlICovCisJLnRsdiA9IHsg LnAgPSBkYl9zY2FsZV9zY2FybGV0dF9nYWluIH0KK307CisKKy8qKiogSFcvU1cgVm9sdW1lIFN3 aXRjaCBDb250cm9scyAqKiovCisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX3N3X2h3X2VudW1fY3Rs X2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkJIHN0cnVjdCBzbmRfY3RsX2Vs ZW1faW5mbyAqdWluZm8pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhbHVlc1syXSA9 IHsKKwkJIlNXIiwgIkhXIgorCX07CisKKwlyZXR1cm4gc25kX2N0bF9lbnVtX2luZm8odWluZm8s IDEsIDIsIHZhbHVlcyk7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX3N3X2h3X2VudW1fY3Rs X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVt X3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9 IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZh dGUgPSBlbGVtLT5oZWFkLm1peGVyLT5wcml2YXRlX2RhdGE7CisKKwl1Y29udHJvbC0+dmFsdWUu ZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJcHJpdmF0ZS0+dm9sX3N3X2h3X3N3aXRjaFtlbGVtLT5j b250cm9sXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2FybGV0dDJfc3dfaHdfZW51 bV9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJCXN0cnVjdCBzbmRfY3Rs X2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICpl bGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICpt aXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpw cml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKworCWludCBpbmRleCA9IGVsZW0tPmNvbnRy b2w7CisJaW50IG92YWwsIHZhbCwgZXJyID0gMDsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3lu YygmcHJpdmF0ZS0+d29yayk7CisJbXV0ZXhfbG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisK KwlvdmFsID0gcHJpdmF0ZS0+dm9sX3N3X2h3X3N3aXRjaFtpbmRleF07CisJdmFsID0gISF1Y29u dHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWlmIChvdmFsID09IHZhbCkKKwkJZ290 byB1bmxvY2s7CisKKwlwcml2YXRlLT52b2xfc3dfaHdfc3dpdGNoW2luZGV4XSA9IHZhbDsKKwor CS8qIENoYW5nZSBhY2Nlc3MgbW9kZSB0byBSTyAoaGFyZHdhcmUgY29udHJvbGxlZCB2b2x1bWUp CisJICogb3IgUlcgKHNvZnR3YXJlIGNvbnRyb2xsZWQgdm9sdW1lKQorCSAqLworCWlmICh2YWwp CisJCXByaXZhdGUtPnZvbF9jdGxzW2luZGV4XS0+dmRbMF0uYWNjZXNzICY9CisJCQl+U05EUlZf Q1RMX0VMRU1fQUNDRVNTX1dSSVRFOworCWVsc2UKKwkJcHJpdmF0ZS0+dm9sX2N0bHNbaW5kZXhd LT52ZFswXS5hY2Nlc3MgfD0KKwkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19XUklURTsKKworCS8q IFJlc2V0IHZvbHVtZSB0byBtYXN0ZXIgdm9sdW1lICovCisJcHJpdmF0ZS0+dm9sW2luZGV4XSA9 IHByaXZhdGUtPm1hc3Rlcl92b2w7CisKKwkvKiBTZXQgU1cgdm9sdW1lIHRvIGN1cnJlbnQgSFcg dm9sdW1lICovCisJZXJyID0gc2NhcmxldHQyX3VzYl9zZXRfY29uZmlnKAorCQltaXhlciwgU0NB UkxFVFQyX0NPTkZJR19MSU5FX09VVF9WT0xVTUUsCisJCWluZGV4LCBwcml2YXRlLT5tYXN0ZXJf dm9sIC0gU0NBUkxFVFRfVk9MVU1FX0JJQVMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIHVubG9j azsKKworCS8qIE5vdGlmeSBvZiBSTy9SVyBjaGFuZ2UgKi8KKwlzbmRfY3RsX25vdGlmeShtaXhl ci0+Y2hpcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfSU5GTywKKwkJICAgICAgICZwcml2 YXRlLT52b2xfY3Rsc1tpbmRleF0tPmlkKTsKKworCS8qIFNlbmQgU1cvSFcgc3dpdGNoIGNoYW5n ZSB0byB0aGUgZGV2aWNlICovCisJZXJyID0gc2NhcmxldHQyX3VzYl9zZXRfY29uZmlnKG1peGVy LCBTQ0FSTEVUVDJfQ09ORklHX1NXX0hXX1NXSVRDSCwKKwkJCQkgICAgICAgaW5kZXgsIHZhbCk7 CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCXJldHVy biBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzY2FybGV0 dDJfc3dfaHdfZW51bV9jdGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlY RVIsCisJLm5hbWUgPSAiIiwKKwkuaW5mbyA9IHNjYXJsZXR0Ml9zd19od19lbnVtX2N0bF9pbmZv LAorCS5nZXQgID0gc2NhcmxldHQyX3N3X2h3X2VudW1fY3RsX2dldCwKKwkucHV0ICA9IHNjYXJs ZXR0Ml9zd19od19lbnVtX2N0bF9wdXQsCit9OworCisvKioqIExpbmUgTGV2ZWwvSW5zdHJ1bWVu dCBMZXZlbCBTd2l0Y2ggQ29udHJvbHMgKioqLworCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9sZXZl bF9lbnVtX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJCSBzdHJ1Y3Qg c25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2 YWx1ZXNbMl0gPSB7CisJCSJMaW5lIiwgIkluc3QiCisJfTsKKworCXJldHVybiBzbmRfY3RsX2Vu dW1faW5mbyh1aW5mbywgMSwgMiwgdmFsdWVzKTsKK30KKworc3RhdGljIGludCBzY2FybGV0dDJf bGV2ZWxfZW51bV9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJCXN0cnVj dCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxl bV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzY2FybGV0dDJfbWl4 ZXJfZGF0YSAqcHJpdmF0ZSA9IGVsZW0tPmhlYWQubWl4ZXItPnByaXZhdGVfZGF0YTsKKworCXVj b250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQlwcml2YXRlLT5sZXZlbF9zd2l0 Y2hbZWxlbS0+Y29udHJvbF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQy X2xldmVsX2VudW1fY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCQlzdHJ1 Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2Vs ZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX21peGVyX2lu dGVyZmFjZSAqbWl4ZXIgPSBlbGVtLT5oZWFkLm1peGVyOworCXN0cnVjdCBzY2FybGV0dDJfbWl4 ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7CisKKwlpbnQgaW5kZXggPSBl bGVtLT5jb250cm9sOworCWludCBvdmFsLCB2YWwsIGVyciA9IDA7CisKKwljYW5jZWxfZGVsYXll ZF93b3JrX3N5bmMoJnByaXZhdGUtPndvcmspOworCW11dGV4X2xvY2soJnByaXZhdGUtPmRhdGFf bXV0ZXgpOworCisJb3ZhbCA9IHByaXZhdGUtPmxldmVsX3N3aXRjaFtpbmRleF07CisJdmFsID0g ISF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWlmIChvdmFsID09IHZhbCkK KwkJZ290byB1bmxvY2s7CisKKwlwcml2YXRlLT5sZXZlbF9zd2l0Y2hbaW5kZXhdID0gdmFsOwor CisJLyogU2VuZCBzd2l0Y2ggY2hhbmdlIHRvIHRoZSBkZXZpY2UgKi8KKwllcnIgPSBzY2FybGV0 dDJfdXNiX3NldF9jb25maWcobWl4ZXIsIFNDQVJMRVRUMl9DT05GSUdfTEVWRUxfU1dJVENILAor CQkJCSAgICAgICBpbmRleCwgdmFsKTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmcHJpdmF0 ZS0+ZGF0YV9tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBz bmRfa2NvbnRyb2xfbmV3IHNjYXJsZXR0Ml9sZXZlbF9lbnVtX2N0bCA9IHsKKwkuaWZhY2UgPSBT TkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICIiLAorCS5pbmZvID0gc2Nhcmxl dHQyX2xldmVsX2VudW1fY3RsX2luZm8sCisJLmdldCAgPSBzY2FybGV0dDJfbGV2ZWxfZW51bV9j dGxfZ2V0LAorCS5wdXQgID0gc2NhcmxldHQyX2xldmVsX2VudW1fY3RsX3B1dCwKK307CisKKy8q KiogUGFkIFN3aXRjaCBDb250cm9scyAqKiovCisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX3BhZF9j dGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2Vs ZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVt ID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJp dmF0ZSA9IGVsZW0tPmhlYWQubWl4ZXItPnByaXZhdGVfZGF0YTsKKworCXVjb250cm9sLT52YWx1 ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQlwcml2YXRlLT5wYWRfc3dpdGNoW2VsZW0tPmNvbnRy b2xdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9wYWRfY3RsX3B1dChz dHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVl ICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwt PnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIgPSBlbGVt LT5oZWFkLm1peGVyOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1p eGVyLT5wcml2YXRlX2RhdGE7CisKKwlpbnQgaW5kZXggPSBlbGVtLT5jb250cm9sOworCWludCBv dmFsLCB2YWwsIGVyciA9IDA7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXZhdGUt PndvcmspOworCW11dGV4X2xvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCisJb3ZhbCA9IHBy aXZhdGUtPnBhZF9zd2l0Y2hbaW5kZXhdOworCXZhbCA9ICEhdWNvbnRyb2wtPnZhbHVlLmludGVn ZXIudmFsdWVbMF07CisKKwlpZiAob3ZhbCA9PSB2YWwpCisJCWdvdG8gdW5sb2NrOworCisJcHJp dmF0ZS0+cGFkX3N3aXRjaFtpbmRleF0gPSB2YWw7CisKKwkvKiBTZW5kIHN3aXRjaCBjaGFuZ2Ug dG8gdGhlIGRldmljZSAqLworCWVyciA9IHNjYXJsZXR0Ml91c2Jfc2V0X2NvbmZpZyhtaXhlciwg U0NBUkxFVFQyX0NPTkZJR19QQURfU1dJVENILAorCQkJCSAgICAgICBpbmRleCwgdmFsKTsKKwor dW5sb2NrOgorCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJcmV0dXJuIGVy cjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNjYXJsZXR0Ml9w YWRfY3RsID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1l ID0gIiIsCisJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAorCS5nZXQgID0gc2Nh cmxldHQyX3BhZF9jdGxfZ2V0LAorCS5wdXQgID0gc2NhcmxldHQyX3BhZF9jdGxfcHV0LAorfTsK KworLyoqKiBNdXRlL0RpbSBDb250cm9scyAqKiovCisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX2J1 dHRvbl9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJICAgIHN0cnVjdCBz bmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9p bmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJm YWNlICptaXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9k YXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKworCWlmIChwcml2YXRlLT52b2xf dXBkYXRlZCkgeworCQltdXRleF9sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwkJc2Nhcmxl dHQyX3VwZGF0ZV92b2x1bWVzKG1peGVyKTsKKwkJbXV0ZXhfdW5sb2NrKCZwcml2YXRlLT5kYXRh X211dGV4KTsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gcHJp dmF0ZS0+YnV0dG9uc1tlbGVtLT5jb250cm9sXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlu dCBzY2FybGV0dDJfYnV0dG9uX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJ CQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHVz Yl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVz Yl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+aGVhZC5taXhlcjsKKwlzdHJ1Y3Qgc2Nh cmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCisJaW50 IGluZGV4ID0gZWxlbS0+Y29udHJvbDsKKwlpbnQgb3ZhbCwgdmFsLCBlcnIgPSAwOworCisJY2Fu Y2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2YXRlLT53b3JrKTsKKwltdXRleF9sb2NrKCZwcml2 YXRlLT5kYXRhX211dGV4KTsKKworCW92YWwgPSBwcml2YXRlLT5idXR0b25zW2luZGV4XTsKKwl2 YWwgPSAhIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJaWYgKG92YWwgPT0g dmFsKQorCQlnb3RvIHVubG9jazsKKworCXByaXZhdGUtPmJ1dHRvbnNbaW5kZXhdID0gdmFsOwor CisJLyogU2VuZCBzd2l0Y2ggY2hhbmdlIHRvIHRoZSBkZXZpY2UgKi8KKwllcnIgPSBzY2FybGV0 dDJfdXNiX3NldF9jb25maWcobWl4ZXIsIFNDQVJMRVRUMl9DT05GSUdfQlVUVE9OUywKKwkJCQkg ICAgICAgaW5kZXgsIHZhbCk7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJnByaXZhdGUtPmRh dGFfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tj b250cm9sX25ldyBzY2FybGV0dDJfYnV0dG9uX2N0bCA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExf RUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICIiLAorCS5pbmZvID0gc25kX2N0bF9ib29sZWFu X21vbm9faW5mbywKKwkuZ2V0ICA9IHNjYXJsZXR0Ml9idXR0b25fY3RsX2dldCwKKwkucHV0ICA9 IHNjYXJsZXR0Ml9idXR0b25fY3RsX3B1dAorfTsKKworLyoqKiBDcmVhdGUgdGhlIGFuYWxvZ3Vl IG91dHB1dCBjb250cm9scyAqKiovCisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX2FkZF9saW5lX291 dF9jdGxzKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwlzdHJ1Y3Qgc2Nh cmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCWNvbnN0 IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmluZm8gPSBwcml2YXRlLT5pbmZvOworCWNv bnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzID0gaW5mby0+cG9ydHM7CisJaW50IG51 bV9saW5lX291dCA9CisJCXBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfQU5BTE9HVUVdLm51bVtT Q0FSTEVUVDJfUE9SVF9PVVRdOworCWludCBlcnIsIGk7CisJY2hhciBzW1NORFJWX0NUTF9FTEVN X0lEX05BTUVfTUFYTEVOXTsKKworCS8qIEFkZCBSL08gSFcgdm9sdW1lIGNvbnRyb2wgKi8KKwlp ZiAoaW5mby0+bGluZV9vdXRfaHdfdm9sKSB7CisJCXNucHJpbnRmKHMsIHNpemVvZihzKSwgIk1h c3RlciBIVyBQbGF5YmFjayBWb2x1bWUiKTsKKwkJZXJyID0gc2NhcmxldHQyX2FkZF9uZXdfY3Rs KG1peGVyLAorCQkJCQkgICAgJnNjYXJsZXR0Ml9tYXN0ZXJfdm9sdW1lX2N0bCwKKwkJCQkJICAg IDAsIDEsIHMsICZwcml2YXRlLT5tYXN0ZXJfdm9sX2N0bCk7CisJCWlmIChlcnIgPCAwKQorCQkJ cmV0dXJuIGVycjsKKwl9CisKKwkvKiBBZGQgdm9sdW1lIGNvbnRyb2xzICovCisJZm9yIChpID0g MDsgaSA8IG51bV9saW5lX291dDsgaSsrKSB7CisKKwkJLyogRmFkZXIgKi8KKwkJaWYgKGluZm8t PmxpbmVfb3V0X2Rlc2Nyc1tpXSkKKwkJCXNucHJpbnRmKHMsIHNpemVvZihzKSwKKwkJCQkgIkxp bmUgJTAyZCAoJXMpIFBsYXliYWNrIFZvbHVtZSIsCisJCQkJIGkgKyAxLCBpbmZvLT5saW5lX291 dF9kZXNjcnNbaV0pOworCQllbHNlCisJCQlzbnByaW50ZihzLCBzaXplb2YocyksCisJCQkJICJM aW5lICUwMmQgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkgaSArIDEpOworCQllcnIgPSBzY2FybGV0 dDJfYWRkX25ld19jdGwobWl4ZXIsCisJCQkJCSAgICAmc2NhcmxldHQyX2xpbmVfb3V0X3ZvbHVt ZV9jdGwsCisJCQkJCSAgICBpLCAxLCBzLCAmcHJpdmF0ZS0+dm9sX2N0bHNbaV0pOworCQlpZiAo ZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisKKwkJLyogTWFrZSB0aGUgZmFkZXIgcmVhZC1vbmx5 IGlmIHRoZSBTVy9IVyBzd2l0Y2ggaXMgc2V0IHRvIEhXICovCisJCWlmIChwcml2YXRlLT52b2xf c3dfaHdfc3dpdGNoW2ldKQorCQkJcHJpdmF0ZS0+dm9sX2N0bHNbaV0tPnZkWzBdLmFjY2VzcyAm PQorCQkJCX5TTkRSVl9DVExfRUxFTV9BQ0NFU1NfV1JJVEU7CisKKwkJLyogU1cvSFcgU3dpdGNo ICovCisJCWlmIChpbmZvLT5saW5lX291dF9od192b2wpIHsKKwkJCXNucHJpbnRmKHMsIHNpemVv ZihzKSwKKwkJCQkgIkxpbmUgT3V0ICUwMmQgVm9sdW1lIENvbnRyb2wgUGxheWJhY2sgRW51bSIs CisJCQkJIGkgKyAxKTsKKwkJCWVyciA9IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwKKwkJ CQkJCSAgICAmc2NhcmxldHQyX3N3X2h3X2VudW1fY3RsLAorCQkJCQkJICAgIGksIDEsIHMsIE5V TEwpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCS8qIEFk ZCBIVyBidXR0b24gY29udHJvbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcHJpdmF0ZS0+aW5mby0+ YnV0dG9uX2NvdW50OyBpKyspIHsKKwkJZXJyID0gc2NhcmxldHQyX2FkZF9uZXdfY3RsKG1peGVy LCAmc2NhcmxldHQyX2J1dHRvbl9jdGwsCisJCQkJCSAgICBpLCAxLCBzY2FybGV0dDJfYnV0dG9u X25hbWVzW2ldLAorCQkJCQkgICAgJnByaXZhdGUtPmJ1dHRvbl9jdGxzW2ldKTsKKwkJaWYgKGVy ciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCisvKioqIENyZWF0 ZSB0aGUgYW5hbG9ndWUgaW5wdXQgY29udHJvbHMgKioqLworCitzdGF0aWMgaW50IHNjYXJsZXR0 Ml9hZGRfbGluZV9pbl9jdGxzKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sK KwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9k YXRhOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmluZm8gPSBwcml2YXRl LT5pbmZvOworCWludCBlcnIsIGk7CisJY2hhciBzW1NORFJWX0NUTF9FTEVNX0lEX05BTUVfTUFY TEVOXTsKKworCS8qIEFkZCBpbnB1dCBsZXZlbCAobGluZS9pbnN0KSBjb250cm9scyAqLworCWZv ciAoaSA9IDA7IGkgPCBpbmZvLT5sZXZlbF9pbnB1dF9jb3VudDsgaSsrKSB7CisJCXNucHJpbnRm KHMsIHNpemVvZihzKSwgIkxpbmUgSW4gJWQgTGV2ZWwgQ2FwdHVyZSBFbnVtIiwgaSArIDEpOwor CQllcnIgPSBzY2FybGV0dDJfYWRkX25ld19jdGwobWl4ZXIsICZzY2FybGV0dDJfbGV2ZWxfZW51 bV9jdGwsCisJCQkJCSAgICBpLCAxLCBzLCBOVUxMKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1 cm4gZXJyOworCX0KKworCS8qIEFkZCBpbnB1dCBwYWQgY29udHJvbHMgKi8KKwlmb3IgKGkgPSAw OyBpIDwgaW5mby0+cGFkX2lucHV0X2NvdW50OyBpKyspIHsKKwkJc25wcmludGYocywgc2l6ZW9m KHMpLCAiTGluZSBJbiAlZCBQYWQgQ2FwdHVyZSBTd2l0Y2giLCBpICsgMSk7CisJCWVyciA9IHNj YXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwgJnNjYXJsZXR0Ml9wYWRfY3RsLAorCQkJCQkgICAg aSwgMSwgcywgTlVMTCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwly ZXR1cm4gMDsKK30KKworLyoqKiBNaXhlciBWb2x1bWUgQ29udHJvbHMgKioqLworCitzdGF0aWMg aW50IHNjYXJsZXR0Ml9taXhlcl9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAor CQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCB1c2Jf bWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCisJdWluZm8tPnR5 cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gZWxlbS0+ Y2hhbm5lbHM7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUu aW50ZWdlci5tYXggPSBTQ0FSTEVUVF9NSVhFUl9NQVhfVkFMVUU7CisJdWluZm8tPnZhbHVlLmlu dGVnZXIuc3RlcCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX21p eGVyX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkgICBzdHJ1Y3Qgc25k X2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5m byAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2Rh dGEgKnByaXZhdGUgPSBlbGVtLT5oZWFkLm1peGVyLT5wcml2YXRlX2RhdGE7CisKKwl1Y29udHJv bC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHByaXZhdGUtPm1peFtlbGVtLT5jb250cm9sXTsK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2FybGV0dDJfbWl4ZXJfY3RsX3B1dChzdHJ1 Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUg KnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+ cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciA9IGVsZW0t PmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4 ZXItPnByaXZhdGVfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX2RldmljZV9pbmZvICpp bmZvID0gcHJpdmF0ZS0+aW5mbzsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX3BvcnRzICpwb3J0 cyA9IGluZm8tPnBvcnRzOworCWludCBvdmFsLCB2YWwsIG51bV9taXhlcl9pbiwgbWl4X251bSwg ZXJyID0gMDsKKworCW11dGV4X2xvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCisJb3ZhbCA9 IHByaXZhdGUtPm1peFtlbGVtLT5jb250cm9sXTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50 ZWdlci52YWx1ZVswXTsKKwludW1fbWl4ZXJfaW4gPSBwb3J0c1tTQ0FSTEVUVDJfUE9SVF9UWVBF X01JWF0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisJbWl4X251bSA9IGVsZW0tPmNvbnRyb2wg LyBudW1fbWl4ZXJfaW47CisKKwlpZiAob3ZhbCA9PSB2YWwpCisJCWdvdG8gdW5sb2NrOworCisJ cHJpdmF0ZS0+bWl4W2VsZW0tPmNvbnRyb2xdID0gdmFsOworCWVyciA9IHNjYXJsZXR0Ml91c2Jf c2V0X21peChtaXhlciwgbWl4X251bSk7CisJaWYgKGVyciA9PSAwKQorCQllcnIgPSAxOworCit1 bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwlyZXR1cm4gZXJy OworfQorCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTUlOTUFYKAorCWRiX3NjYWxlX3Nj YXJsZXR0X21peGVyLAorCVNDQVJMRVRUX01JWEVSX01JTl9EQiAqIDEwMCwKKwlTQ0FSTEVUVF9N SVhFUl9NQVhfREIgKiAxMDAKKyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9s X25ldyBzY2FybGV0dDJfbWl4ZXJfY3RsID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lG QUNFX01JWEVSLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwK KwkJICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsCisJLm5hbWUgPSAiIiwKKwkuaW5m byA9IHNjYXJsZXR0Ml9taXhlcl9jdGxfaW5mbywKKwkuZ2V0ICA9IHNjYXJsZXR0Ml9taXhlcl9j dGxfZ2V0LAorCS5wdXQgID0gc2NhcmxldHQyX21peGVyX2N0bF9wdXQsCisJLnByaXZhdGVfdmFs dWUgPSBTQ0FSTEVUVF9NSVhFUl9NQVhfREIsIC8qIG1heCB2YWx1ZSAqLworCS50bHYgPSB7IC5w ID0gZGJfc2NhbGVfc2NhcmxldHRfbWl4ZXIgfQorfTsKKworc3RhdGljIGludCBzY2FybGV0dDJf YWRkX21peGVyX2N0bHMoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXN0 cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7 CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMgPSBwcml2YXRlLT5pbmZvLT5w b3J0czsKKwlpbnQgZXJyLCBpLCBqOworCWludCBpbmRleDsKKwljaGFyIHNbU05EUlZfQ1RMX0VM RU1fSURfTkFNRV9NQVhMRU5dOworCisJaW50IG51bV9pbnB1dHMgPSBwb3J0c1tTQ0FSTEVUVDJf UE9SVF9UWVBFX01JWF0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisJaW50IG51bV9vdXRwdXRz ID0gcG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9NSVhdLm51bVtTQ0FSTEVUVDJfUE9SVF9JTl07 CisKKwlmb3IgKGkgPSAwLCBpbmRleCA9IDA7IGkgPCBudW1fb3V0cHV0czsgaSsrKSB7CisJCWZv ciAoaiA9IDA7IGogPCBudW1faW5wdXRzOyBqKyssIGluZGV4KyspIHsKKwkJCXNucHJpbnRmKHMs IHNpemVvZihzKSwKKwkJCQkgIk1peCAlYyBJbnB1dCAlMDJkIFBsYXliYWNrIFZvbHVtZSIsCisJ CQkJICdBJyArIGksIGogKyAxKTsKKwkJCWVyciA9IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhl ciwgJnNjYXJsZXR0Ml9taXhlcl9jdGwsCisJCQkJCQkgICAgaW5kZXgsIDEsIHMsIE5VTEwpOwor CQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCXJldHVybiAwOwor fQorCisvKioqIE11eCBTb3VyY2UgU2VsZWN0aW9uIENvbnRyb2xzICoqKi8KKworc3RhdGljIGlu dCBzY2FybGV0dDJfbXV4X3NyY19lbnVtX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtj dGwsCisJCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RydWN0 IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0 IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gZWxlbS0+aGVhZC5taXhlci0+cHJpdmF0 ZV9kYXRhOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzID0gcHJpdmF0ZS0+ aW5mby0+cG9ydHM7CisJdW5zaWduZWQgaW50IGl0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRl ZC5pdGVtOworCWludCBpdGVtcyA9IHByaXZhdGUtPm51bV9tdXhfc3JjczsKKwlpbnQgcG9ydF90 eXBlOworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJ dWluZm8tPmNvdW50ID0gZWxlbS0+Y2hhbm5lbHM7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQu aXRlbXMgPSBpdGVtczsKKworCWlmIChpdGVtID49IGl0ZW1zKQorCQlpdGVtID0gdWluZm8tPnZh bHVlLmVudW1lcmF0ZWQuaXRlbSA9IGl0ZW1zIC0gMTsKKworCWZvciAocG9ydF90eXBlID0gMDsK KwkgICAgIHBvcnRfdHlwZSA8IFNDQVJMRVRUMl9QT1JUX1RZUEVfQ09VTlQ7CisJICAgICBwb3J0 X3R5cGUrKykgeworCQlpZiAoaXRlbSA8IHBvcnRzW3BvcnRfdHlwZV0ubnVtW1NDQVJMRVRUMl9Q T1JUX0lOXSkgeworCQkJc3ByaW50Zih1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAorCQkJ CXBvcnRzW3BvcnRfdHlwZV0uc3JjX2Rlc2NyLAorCQkJCWl0ZW0gKyBwb3J0c1twb3J0X3R5cGVd LnNyY19udW1fb2Zmc2V0KTsKKwkJCXJldHVybiAwOworCQl9CisJCWl0ZW0gLT0gcG9ydHNbcG9y dF90eXBlXS5udW1bU0NBUkxFVFQyX1BPUlRfSU5dOworCX0KKworCXJldHVybiAtRUlOVkFMOwor fQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9tdXhfc3JjX2VudW1fY3RsX2dldChzdHJ1Y3Qgc25k X2tjb250cm9sICprY3RsLAorCQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250 cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0 ZV9kYXRhOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IGVsZW0tPmhl YWQubWl4ZXItPnByaXZhdGVfZGF0YTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0 ZW1bMF0gPSBwcml2YXRlLT5tdXhbZWxlbS0+Y29udHJvbF07CisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgc2NhcmxldHQyX211eF9zcmNfZW51bV9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRy b2wgKmtjdGwsCisJCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7 CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7 CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+aGVhZC5taXhlcjsK KwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9k YXRhOworCWludCBpbmRleCA9IGVsZW0tPmNvbnRyb2w7CisJaW50IG92YWwsIHZhbCwgZXJyID0g MDsKKworCW11dGV4X2xvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCisJb3ZhbCA9IHByaXZh dGUtPm11eFtpbmRleF07CisJdmFsID0gY2xhbXAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFs dWVbMF0sCisJCSAgICAwTCwgcHJpdmF0ZS0+bnVtX211eF9zcmNzIC0gMUwpOworCisJaWYgKG92 YWwgPT0gdmFsKQorCQlnb3RvIHVubG9jazsKKworCXByaXZhdGUtPm11eFtpbmRleF0gPSB2YWw7 CisJZXJyID0gc2NhcmxldHQyX3VzYl9zZXRfbXV4KG1peGVyKTsKKwlpZiAoZXJyID09IDApCisJ CWVyciA9IDE7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgp OworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25l dyBzY2FybGV0dDJfbXV4X3NyY19lbnVtX2N0bCA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxF TV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICIiLAorCS5pbmZvID0gc2NhcmxldHQyX211eF9zcmNf ZW51bV9jdGxfaW5mbywKKwkuZ2V0ICA9IHNjYXJsZXR0Ml9tdXhfc3JjX2VudW1fY3RsX2dldCwK KwkucHV0ICA9IHNjYXJsZXR0Ml9tdXhfc3JjX2VudW1fY3RsX3B1dCwKK307CisKK3N0YXRpYyBp bnQgc2NhcmxldHQyX2FkZF9tdXhfZW51bXMoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1p eGVyKQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5w cml2YXRlX2RhdGE7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMgPSBwcml2 YXRlLT5pbmZvLT5wb3J0czsKKwlpbnQgcG9ydF90eXBlLCBjaGFubmVsLCBpOworCisJZm9yIChp ID0gMCwgcG9ydF90eXBlID0gMDsKKwkgICAgIHBvcnRfdHlwZSA8IFNDQVJMRVRUMl9QT1JUX1RZ UEVfQ09VTlQ7CisJICAgICBwb3J0X3R5cGUrKykgeworCQlmb3IgKGNoYW5uZWwgPSAwOworCQkg ICAgIGNoYW5uZWwgPCBwb3J0c1twb3J0X3R5cGVdLm51bVtTQ0FSTEVUVDJfUE9SVF9PVVRdOwor CQkgICAgIGNoYW5uZWwrKywgaSsrKSB7CisJCQlpbnQgZXJyOworCQkJY2hhciBzW1NORFJWX0NU TF9FTEVNX0lEX05BTUVfTUFYTEVOXTsKKwkJCWNvbnN0IGNoYXIgKmNvbnN0IGRlc2NyID0gcG9y dHNbcG9ydF90eXBlXS5kc3RfZGVzY3I7CisKKwkJCXNucHJpbnRmKHMsIHNpemVvZihzKSAtIDUs IGRlc2NyLCBjaGFubmVsICsgMSk7CisJCQlzdHJjYXQocywgIiBFbnVtIik7CisKKwkJCWVyciA9 IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwKKwkJCQkJCSAgICAmc2NhcmxldHQyX211eF9z cmNfZW51bV9jdGwsCisJCQkJCQkgICAgaSwgMSwgcywgTlVMTCk7CisJCQlpZiAoZXJyIDwgMCkK KwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKiogTWV0ZXIg Q29udHJvbHMgKioqLworCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9tZXRlcl9jdGxfaW5mbyhzdHJ1 Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8g KnVpbmZvKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJp dmF0ZV9kYXRhOworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7 CisJdWluZm8tPmNvdW50ID0gZWxlbS0+Y2hhbm5lbHM7CisJdWluZm8tPnZhbHVlLmludGVnZXIu bWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSA0MDk1OworCXVpbmZvLT52YWx1 ZS5pbnRlZ2VyLnN0ZXAgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0 Ml9tZXRlcl9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJICAgc3RydWN0 IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVt X2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJdTE2IG1ldGVyX2xldmVsc1tTQ0FS TEVUVDJfTlVNX01FVEVSU107CisJaW50IGksIGVycjsKKworCWVyciA9IHNjYXJsZXR0Ml91c2Jf Z2V0X21ldGVyX2xldmVscyhlbGVtLT5oZWFkLm1peGVyLCBtZXRlcl9sZXZlbHMpOworCWlmIChl cnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMDsgaSA8IGVsZW0tPmNoYW5uZWxz OyBpKyspCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0gbWV0ZXJfbGV2ZWxz W2ldOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9s X25ldyBzY2FybGV0dDJfbWV0ZXJfY3RsID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lG QUNFX1BDTSwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9D VExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsCisJLm5hbWUgPSAiIiwKKwkuaW5mbyA9IHNjYXJsZXR0 Ml9tZXRlcl9jdGxfaW5mbywKKwkuZ2V0ICA9IHNjYXJsZXR0Ml9tZXRlcl9jdGxfZ2V0Cit9Owor CitzdGF0aWMgaW50IHNjYXJsZXR0Ml9hZGRfbWV0ZXJfY3RsKHN0cnVjdCB1c2JfbWl4ZXJfaW50 ZXJmYWNlICptaXhlcikKK3sKKwlyZXR1cm4gc2NhcmxldHQyX2FkZF9uZXdfY3RsKG1peGVyLCAm c2NhcmxldHQyX21ldGVyX2N0bCwKKwkJCQkgICAgIDAsIFNDQVJMRVRUMl9OVU1fTUVURVJTLAor CQkJCSAgICAgIkxldmVsIE1ldGVyIiwgTlVMTCk7Cit9CisKKy8qKiogSW5pdGlhbGlzYXRpb24g KioqLworCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9jb3VudF9tdXhfc3Jjcyhjb25zdCBzdHJ1Y3Qg c2NhcmxldHQyX3BvcnRzICpwb3J0cykKK3sKKwlpbnQgcG9ydF90eXBlLCBjb3VudCA9IDA7CisK Kwlmb3IgKHBvcnRfdHlwZSA9IDA7CisJICAgICBwb3J0X3R5cGUgPCBTQ0FSTEVUVDJfUE9SVF9U WVBFX0NPVU5UOworCSAgICAgcG9ydF90eXBlKyspCisJCWNvdW50ICs9IHBvcnRzW3BvcnRfdHlw ZV0ubnVtW1NDQVJMRVRUMl9QT1JUX0lOXTsKKworCXJldHVybiBjb3VudDsKK30KKworLyogRGVm YXVsdCByb3V0aW5nIGNvbm5lY3RzIFBDTSBvdXRwdXRzIGFuZCBpbnB1dHMgdG8gQW5hbG9ndWUs CisgKiBTL1BESUYsIHRoZW4gQURBVAorICovCitzdGF0aWMgdm9pZCBzY2FybGV0dDJfaW5pdF9y b3V0aW5nKHU4ICptdXgsCisJCQkJICAgY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9y dHMpCit7CisJaW50IGksIGlucHV0X251bSwgaW5wdXRfY291bnQsIHBvcnRfdHlwZTsKKwlpbnQg b3V0cHV0X251bSwgb3V0cHV0X2NvdW50LCBwb3J0X3R5cGVfY29ubmVjdF9udW07CisKKwlzdGF0 aWMgY29uc3QgaW50IGNvbm5lY3Rfb3JkZXJbXSA9IHsKKwkJU0NBUkxFVFQyX1BPUlRfVFlQRV9B TkFMT0dVRSwKKwkJU0NBUkxFVFQyX1BPUlRfVFlQRV9TUERJRiwKKwkJU0NBUkxFVFQyX1BPUlRf VFlQRV9BREFULAorCQktMQorCX07CisKKwkvKiBBc3NpZ24gUENNIGlucHV0cyAocm91dGluZyBv dXRwdXRzKSAqLworCW91dHB1dF9udW0gPSBzY2FybGV0dDJfZ2V0X3BvcnRfc3RhcnRfbnVtKHBv cnRzLAorCQkJCQkJICBTQ0FSTEVUVDJfUE9SVF9PVVQsCisJCQkJCQkgIFNDQVJMRVRUMl9QT1JU X1RZUEVfUENNKTsKKwlvdXRwdXRfY291bnQgPSBwb3J0c1tTQ0FSTEVUVDJfUE9SVF9UWVBFX1BD TV0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisKKwlmb3IgKHBvcnRfdHlwZSA9IGNvbm5lY3Rf b3JkZXJbcG9ydF90eXBlX2Nvbm5lY3RfbnVtID0gMF07CisJICAgICBwb3J0X3R5cGUgPj0gMDsK KwkgICAgIHBvcnRfdHlwZSA9IGNvbm5lY3Rfb3JkZXJbKytwb3J0X3R5cGVfY29ubmVjdF9udW1d KSB7CisJCWlucHV0X251bSA9IHNjYXJsZXR0Ml9nZXRfcG9ydF9zdGFydF9udW0oCisJCQlwb3J0 cywgU0NBUkxFVFQyX1BPUlRfSU4sIHBvcnRfdHlwZSk7CisJCWlucHV0X2NvdW50ID0gcG9ydHNb cG9ydF90eXBlXS5udW1bU0NBUkxFVFQyX1BPUlRfSU5dOworCQlmb3IgKGkgPSAwOworCQkgICAg IGkgPCBpbnB1dF9jb3VudCAmJiBvdXRwdXRfY291bnQ7CisJCSAgICAgaSsrLCBvdXRwdXRfY291 bnQtLSkKKwkJCW11eFtvdXRwdXRfbnVtKytdID0gaW5wdXRfbnVtKys7CisJfQorCisJLyogQXNz aWduIFBDTSBvdXRwdXRzIChyb3V0aW5nIGlucHV0cykgKi8KKwlpbnB1dF9udW0gPSBzY2FybGV0 dDJfZ2V0X3BvcnRfc3RhcnRfbnVtKHBvcnRzLAorCQkJCQkJIFNDQVJMRVRUMl9QT1JUX0lOLAor CQkJCQkJIFNDQVJMRVRUMl9QT1JUX1RZUEVfUENNKTsKKwlpbnB1dF9jb3VudCA9IHBvcnRzW1ND QVJMRVRUMl9QT1JUX1RZUEVfUENNXS5udW1bU0NBUkxFVFQyX1BPUlRfSU5dOworCisJZm9yIChw b3J0X3R5cGUgPSBjb25uZWN0X29yZGVyW3BvcnRfdHlwZV9jb25uZWN0X251bSA9IDBdOworCSAg ICAgcG9ydF90eXBlID49IDA7CisJICAgICBwb3J0X3R5cGUgPSBjb25uZWN0X29yZGVyWysrcG9y dF90eXBlX2Nvbm5lY3RfbnVtXSkgeworCQlvdXRwdXRfbnVtID0gc2NhcmxldHQyX2dldF9wb3J0 X3N0YXJ0X251bSgKKwkJCXBvcnRzLCBTQ0FSTEVUVDJfUE9SVF9PVVQsIHBvcnRfdHlwZSk7CisJ CW91dHB1dF9jb3VudCA9IHBvcnRzW3BvcnRfdHlwZV0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07 CisJCWZvciAoaSA9IDA7CisJCSAgICAgaSA8IG91dHB1dF9jb3VudCAmJiBpbnB1dF9jb3VudDsK KwkJICAgICBpKyssIGlucHV0X2NvdW50LS0pCisJCQltdXhbb3V0cHV0X251bSsrXSA9IGlucHV0 X251bSsrOworCX0KK30KKworLyogSW5pdGlhbGlzZSBwcml2YXRlIGRhdGEsIHJvdXRpbmcsIHNl cXVlbmNlIG51bWJlciAqLworc3RhdGljIGludCBzY2FybGV0dDJfaW5pdF9wcml2YXRlKHN0cnVj dCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciwKKwkJCQkgIGNvbnN0IHN0cnVjdCBzY2FybGV0 dDJfZGV2aWNlX2luZm8gKmluZm8pCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpw cml2YXRlID0KKwkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhKSwg R0ZQX0tFUk5FTCk7CisKKwlpZiAoIXByaXZhdGUpCisJCXJldHVybiAtRU5PTUVNOworCisJbXV0 ZXhfaW5pdCgmcHJpdmF0ZS0+dXNiX211dGV4KTsKKwltdXRleF9pbml0KCZwcml2YXRlLT5kYXRh X211dGV4KTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdmF0ZS0+d29yaywgc2NhcmxldHQyX2Nv bmZpZ19zYXZlKTsKKwlwcml2YXRlLT5pbmZvID0gaW5mbzsKKwlwcml2YXRlLT5udW1fbXV4X3Ny Y3MgPSBzY2FybGV0dDJfY291bnRfbXV4X3NyY3MoaW5mby0+cG9ydHMpOworCXByaXZhdGUtPnNj YXJsZXR0Ml9zZXEgPSAwOworCXByaXZhdGUtPm1peGVyID0gbWl4ZXI7CisJbWl4ZXItPnByaXZh dGVfZGF0YSA9IHByaXZhdGU7CisJbWl4ZXItPnByaXZhdGVfZnJlZSA9IHNuZF9zY2FybGV0dF9n ZW4yX3ByaXZhdGVfZnJlZTsKKworCS8qIFNldHVwIGRlZmF1bHQgcm91dGluZyAqLworCXNjYXJs ZXR0Ml9pbml0X3JvdXRpbmcocHJpdmF0ZS0+bXV4LCBpbmZvLT5wb3J0cyk7CisKKwkvKiBJbml0 aWFsaXNlIHRoZSBzZXF1ZW5jZSBudW1iZXIgdXNlZCBmb3IgdGhlIHByb3ByaWV0YXJ5IGNvbW1h bmRzICovCisJcmV0dXJuIHNjYXJsZXR0Ml91c2IobWl4ZXIsIFNDQVJMRVRUMl9VU0JfSU5JVF9T RVEsCisJCQkgICAgIE5VTEwsIDAsIE5VTEwsIDApOworfQorCisvKiBSZWFkIGxpbmUtaW4gY29u ZmlnIGFuZCBsaW5lLW91dCB2b2x1bWUgc2V0dGluZ3Mgb24gc3RhcnQgKi8KK3N0YXRpYyBpbnQg c2NhcmxldHQyX3JlYWRfY29uZmlncyhzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIp Cit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZh dGVfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX2RldmljZV9pbmZvICppbmZvID0gcHJp dmF0ZS0+aW5mbzsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX3BvcnRzICpwb3J0cyA9IGluZm8t PnBvcnRzOworCWludCBudW1fbGluZV9vdXQgPQorCQlwb3J0c1tTQ0FSTEVUVDJfUE9SVF9UWVBF X0FOQUxPR1VFXS5udW1bU0NBUkxFVFQyX1BPUlRfT1VUXTsKKwl1OCBsZXZlbF9zd2l0Y2hlc1tT Q0FSTEVUVDJfTEVWRUxfU1dJVENIX01BWF07CisJdTggcGFkX3N3aXRjaGVzW1NDQVJMRVRUMl9Q QURfU1dJVENIX01BWF07CisJc3RydWN0IHNjYXJsZXR0Ml91c2Jfdm9sdW1lX3N0YXR1cyB2b2x1 bWVfc3RhdHVzOworCWludCBlcnIsIGk7CisKKwlpZiAoaW5mby0+bGV2ZWxfaW5wdXRfY291bnQp IHsKKwkJZXJyID0gc2NhcmxldHQyX3VzYl9nZXRfY29uZmlnKAorCQkJbWl4ZXIsCisJCQlTQ0FS TEVUVDJfQ09ORklHX0xFVkVMX1NXSVRDSCwKKwkJCWluZm8tPmxldmVsX2lucHV0X2NvdW50LAor CQkJbGV2ZWxfc3dpdGNoZXMpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWZv ciAoaSA9IDA7IGkgPCBpbmZvLT5sZXZlbF9pbnB1dF9jb3VudDsgaSsrKQorCQkJcHJpdmF0ZS0+ bGV2ZWxfc3dpdGNoW2ldID0gbGV2ZWxfc3dpdGNoZXNbaV07CisJfQorCisJaWYgKGluZm8tPnBh ZF9pbnB1dF9jb3VudCkgeworCQllcnIgPSBzY2FybGV0dDJfdXNiX2dldF9jb25maWcoCisJCQlt aXhlciwKKwkJCVNDQVJMRVRUMl9DT05GSUdfUEFEX1NXSVRDSCwKKwkJCWluZm8tPnBhZF9pbnB1 dF9jb3VudCwKKwkJCXBhZF9zd2l0Y2hlcyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVy cjsKKwkJZm9yIChpID0gMDsgaSA8IGluZm8tPnBhZF9pbnB1dF9jb3VudDsgaSsrKQorCQkJcHJp dmF0ZS0+cGFkX3N3aXRjaFtpXSA9IHBhZF9zd2l0Y2hlc1tpXTsKKwl9CisKKwllcnIgPSBzY2Fy bGV0dDJfdXNiX2dldF92b2x1bWVfc3RhdHVzKG1peGVyLCAmdm9sdW1lX3N0YXR1cyk7CisJaWYg KGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlwcml2YXRlLT5tYXN0ZXJfdm9sID0gY2xhbXAo CisJCXZvbHVtZV9zdGF0dXMubWFzdGVyX3ZvbCArIFNDQVJMRVRUX1ZPTFVNRV9CSUFTLAorCQkw LCBTQ0FSTEVUVF9WT0xVTUVfQklBUyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2xpbmVfb3V0 OyBpKyspIHsKKwkJaW50IHZvbHVtZTsKKworCQlwcml2YXRlLT52b2xfc3dfaHdfc3dpdGNoW2ld ID0KKwkJCWluZm8tPmxpbmVfb3V0X2h3X3ZvbAorCQkJCSYmIHZvbHVtZV9zdGF0dXMuc3dfaHdf c3dpdGNoW2ldOworCisJCXZvbHVtZSA9IHByaXZhdGUtPnZvbF9zd19od19zd2l0Y2hbaV0KKwkJ CSAgID8gdm9sdW1lX3N0YXR1cy5tYXN0ZXJfdm9sCisJCQkgICA6IHZvbHVtZV9zdGF0dXMuc3df dm9sW2ldOworCQl2b2x1bWUgPSBjbGFtcCh2b2x1bWUgKyBTQ0FSTEVUVF9WT0xVTUVfQklBUywK KwkJCSAgICAgICAwLCBTQ0FSTEVUVF9WT0xVTUVfQklBUyk7CisJCXByaXZhdGUtPnZvbFtpXSA9 IHZvbHVtZTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+YnV0dG9uX2NvdW50OyBpKysp CisJCXByaXZhdGUtPmJ1dHRvbnNbaV0gPSAhIXZvbHVtZV9zdGF0dXMuYnV0dG9uc1tpXTsKKwor CXJldHVybiAwOworfQorCisvKiBOb3RpZnkgb24gdm9sdW1lIGNoYW5nZSAqLworc3RhdGljIHZv aWQgc2NhcmxldHQyX21peGVyX2ludGVycnVwdF92b2xfY2hhbmdlKAorCXN0cnVjdCB1c2JfbWl4 ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnBy aXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfcG9y dHMgKnBvcnRzID0gcHJpdmF0ZS0+aW5mby0+cG9ydHM7CisJaW50IG51bV9saW5lX291dCA9CisJ CXBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfQU5BTE9HVUVdLm51bVtTQ0FSTEVUVDJfUE9SVF9P VVRdOworCWludCBpOworCisJcHJpdmF0ZS0+dm9sX3VwZGF0ZWQgPSAxOworCisJc25kX2N0bF9u b3RpZnkobWl4ZXItPmNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkg ICAgICAgJnByaXZhdGUtPm1hc3Rlcl92b2xfY3RsLT5pZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwg bnVtX2xpbmVfb3V0OyBpKyspIHsKKwkJaWYgKCFwcml2YXRlLT52b2xfc3dfaHdfc3dpdGNoW2ld KQorCQkJY29udGludWU7CisJCXNuZF9jdGxfbm90aWZ5KG1peGVyLT5jaGlwLT5jYXJkLCBTTkRS Vl9DVExfRVZFTlRfTUFTS19WQUxVRSwKKwkJCSAgICAgICAmcHJpdmF0ZS0+dm9sX2N0bHNbaV0t PmlkKTsKKwl9Cit9CisKKy8qIE5vdGlmeSBvbiBidXR0b24gY2hhbmdlICovCitzdGF0aWMgdm9p ZCBzY2FybGV0dDJfbWl4ZXJfaW50ZXJydXB0X2J1dHRvbl9jaGFuZ2UoCisJc3RydWN0IHVzYl9t aXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAq cHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7CisJaW50IGk7CisKKwlwcml2YXRlLT52b2xf dXBkYXRlZCA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdmF0ZS0+aW5mby0+YnV0dG9uX2Nv dW50OyBpKyspCisJCXNuZF9jdGxfbm90aWZ5KG1peGVyLT5jaGlwLT5jYXJkLCBTTkRSVl9DVExf RVZFTlRfTUFTS19WQUxVRSwKKwkJCSAgICAgICAmcHJpdmF0ZS0+YnV0dG9uX2N0bHNbaV0tPmlk KTsKK30KKworLyogSW50ZXJydXB0IGNhbGxiYWNrICovCitzdGF0aWMgdm9pZCBzY2FybGV0dDJf bWl4ZXJfaW50ZXJydXB0KHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2lu dGVyZmFjZSAqbWl4ZXIgPSB1cmItPmNvbnRleHQ7CisJaW50IGxlbiA9IHVyYi0+YWN0dWFsX2xl bmd0aDsKKwlpbnQgdXN0YXR1cyA9IHVyYi0+c3RhdHVzOworCXUzMiBkYXRhOworCisJaWYgKHVz dGF0dXMgIT0gMCkKKwkJZ290byByZXF1ZXVlOworCisJaWYgKGxlbiA9PSA4KSB7CisJCWRhdGEg PSBsZTMyX3RvX2NwdSgqKHUzMiAqKXVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJaWYgKGRhdGEg JiBTQ0FSTEVUVDJfVVNCX0lOVEVSUlVQVF9WT0xfQ0hBTkdFKQorCQkJc2NhcmxldHQyX21peGVy X2ludGVycnVwdF92b2xfY2hhbmdlKG1peGVyKTsKKwkJaWYgKGRhdGEgJiBTQ0FSTEVUVDJfVVNC X0lOVEVSUlVQVF9CVVRUT05fQ0hBTkdFKQorCQkJc2NhcmxldHQyX21peGVyX2ludGVycnVwdF9i dXR0b25fY2hhbmdlKG1peGVyKTsKKwl9IGVsc2UgeworCQl1c2JfYXVkaW9fZXJyKG1peGVyLT5j aGlwLAorCQkJICAgICAgInNjYXJsZXR0IG1peGVyIGludGVycnVwdCBsZW5ndGggJWRcbiIsIGxl bik7CisJfQorCityZXF1ZXVlOgorCWlmICh1c3RhdHVzICE9IC1FTk9FTlQgJiYKKwkgICAgdXN0 YXR1cyAhPSAtRUNPTk5SRVNFVCAmJgorCSAgICB1c3RhdHVzICE9IC1FU0hVVERPV04pIHsKKwkJ dXJiLT5kZXYgPSBtaXhlci0+Y2hpcC0+ZGV2OworCQl1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9B VE9NSUMpOworCX0KK30KKworc3RhdGljIGludCBzY2FybGV0dDJfbWl4ZXJfc3RhdHVzX2NyZWF0 ZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJdm9pZCAqdHJhbnNmZXJf YnVmZmVyOworCisJaWYgKG1peGVyLT51cmIpIHsKKwkJdXNiX2F1ZGlvX2VycihtaXhlci0+Y2hp cCwKKwkJCSAgICAgICIlczogbWl4ZXIgdXJiIGFscmVhZHkgaW4gdXNlIVxuIiwgX19mdW5jX18p OworCQlyZXR1cm4gMDsKKwl9CisKKwltaXhlci0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBf S0VSTkVMKTsKKwlpZiAoIW1peGVyLT51cmIpCisJCXJldHVybiAtRU5PTUVNOworCisJdHJhbnNm ZXJfYnVmZmVyID0ga21hbGxvYyhTQ0FSTEVUVDJfVVNCX0lOVEVSUlVQVF9NQVhfREFUQSwgR0ZQ X0tFUk5FTCk7CisJaWYgKCF0cmFuc2Zlcl9idWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJ dXNiX2ZpbGxfaW50X3VyYigKKwkJbWl4ZXItPnVyYiwKKwkJbWl4ZXItPmNoaXAtPmRldiwKKwkJ dXNiX3JjdmludHBpcGUobWl4ZXItPmNoaXAtPmRldiwKKwkJCSAgICAgICBTQ0FSTEVUVDJfVVNC X0lOVEVSUlVQVF9FTkRQT0lOVCksCisJCXRyYW5zZmVyX2J1ZmZlciwKKwkJU0NBUkxFVFQyX1VT Ql9JTlRFUlJVUFRfTUFYX0RBVEEsCisJCXNjYXJsZXR0Ml9taXhlcl9pbnRlcnJ1cHQsCisJCW1p eGVyLAorCQlTQ0FSTEVUVDJfVVNCX0lOVEVSUlVQVF9JTlRFUlZBTCk7CisKKwlyZXR1cm4gdXNi X3N1Ym1pdF91cmIobWl4ZXItPnVyYiwgR0ZQX0tFUk5FTCk7Cit9CisKKy8qIEVudHJ5IHBvaW50 ICovCitpbnQgc25kX3NjYXJsZXR0X2dlbjJfY29udHJvbHNfY3JlYXRlKHN0cnVjdCB1c2JfbWl4 ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX2RldmljZV9p bmZvICppbmZvOworCWludCBlcnI7CisKKwkvKiBvbmx5IHVzZSBVQUNfVkVSU0lPTl8yICovCisJ aWYgKCFtaXhlci0+cHJvdG9jb2wpCisJCXJldHVybiAwOworCisJc3dpdGNoIChtaXhlci0+Y2hp cC0+dXNiX2lkKSB7CisJY2FzZSBVU0JfSUQoMHgxMjM1LCAweDgyMDMpOgorCQlpbmZvID0gJnM2 aTZfZ2VuMl9pbmZvOworCQlicmVhazsKKwljYXNlIFVTQl9JRCgweDEyMzUsIDB4ODIwNCk6CisJ CWluZm8gPSAmczE4aThfZ2VuMl9pbmZvOworCQlicmVhazsKKwljYXNlIFVTQl9JRCgweDEyMzUs IDB4ODIwMSk6CisJCWluZm8gPSAmczE4aTIwX2dlbjJfaW5mbzsKKwkJYnJlYWs7CisJZGVmYXVs dDogLyogZGV2aWNlIG5vdCAoeWV0KSBzdXBwb3J0ZWQgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJ fQorCisJaWYgKCFzY2FybGV0dF9nZW4yX21peGVyX2VuYWJsZSkgeworCQl1c2JfYXVkaW9fZXJy KG1peGVyLT5jaGlwLAorCQkJIkZvY3Vzcml0ZSBTY2FybGV0dCBHZW4gMiBNaXhlciBEcml2ZXIg ZGlzYWJsZWQ7IHVzZSAiCisJCQkib3B0aW9ucyBzbmRfdXNiX2F1ZGlvIHNjYXJsZXR0X2dlbjJf bWl4ZXJfZW5hYmxlPTEgIgorCQkJInRvIGVuYWJsZSBhbmQgcmVwb3J0IGFueSBpc3N1ZXMgdG8g Z0BiNC52dSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBJbml0aWFsaXNlIHByaXZhdGUgZGF0 YSwgcm91dGluZywgc2VxdWVuY2UgbnVtYmVyICovCisJZXJyID0gc2NhcmxldHQyX2luaXRfcHJp dmF0ZShtaXhlciwgaW5mbyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBS ZWFkIHZvbHVtZSBsZXZlbHMgYW5kIGNvbnRyb2xzIGZyb20gdGhlIGludGVyZmFjZSAqLworCWVy ciA9IHNjYXJsZXR0Ml9yZWFkX2NvbmZpZ3MobWl4ZXIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1 cm4gZXJyOworCisJLyogQ3JlYXRlIHRoZSBhbmFsb2d1ZSBvdXRwdXQgY29udHJvbHMgKi8KKwll cnIgPSBzY2FybGV0dDJfYWRkX2xpbmVfb3V0X2N0bHMobWl4ZXIpOworCWlmIChlcnIgPCAwKQor CQlyZXR1cm4gZXJyOworCisJLyogQ3JlYXRlIHRoZSBhbmFsb2d1ZSBpbnB1dCBjb250cm9scyAq LworCWVyciA9IHNjYXJsZXR0Ml9hZGRfbGluZV9pbl9jdGxzKG1peGVyKTsKKwlpZiAoZXJyIDwg MCkKKwkJcmV0dXJuIGVycjsKKworCS8qIENyZWF0ZSB0aGUgaW5wdXQsIG91dHB1dCwgYW5kIG1p eGVyIG11eCBpbnB1dCBzZWxlY3Rpb25zICovCisJZXJyID0gc2NhcmxldHQyX2FkZF9tdXhfZW51 bXMobWl4ZXIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogQ3JlYXRlIHRo ZSBtYXRyaXggbWl4ZXIgY29udHJvbHMgKi8KKwllcnIgPSBzY2FybGV0dDJfYWRkX21peGVyX2N0 bHMobWl4ZXIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogQ3JlYXRlIHRo ZSBsZXZlbCBtZXRlciBjb250cm9scyAqLworCWVyciA9IHNjYXJsZXR0Ml9hZGRfbWV0ZXJfY3Rs KG1peGVyKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIFNldCB1cCB0aGUg aW50ZXJydXB0IHBvbGxpbmcgaWYgdGhlcmUgYXJlIGhhcmR3YXJlIGJ1dHRvbnMgKi8KKwlpZiAo aW5mby0+YnV0dG9uX2NvdW50KSB7CisJCWVyciA9IHNjYXJsZXR0Ml9taXhlcl9zdGF0dXNfY3Jl YXRlKG1peGVyKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVy biAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfc2NhcmxldHRfZ2VuMl9wcml2YXRlX2ZyZWUoc3Ry dWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4 ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7CisKKwljYW5jZWxfZGVsYXll ZF93b3JrX3N5bmMoJnByaXZhdGUtPndvcmspOworCWtmcmVlKHByaXZhdGUpOworCW1peGVyLT5w cml2YXRlX2RhdGEgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL21peGVyX3NjYXJs ZXR0X2dlbjIuaCBiL3NvdW5kL3VzYi9taXhlcl9zY2FybGV0dF9nZW4yLmgKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi41MmUxZGFkNzdhZmQKLS0tIC9kZXYvbnVsbAor KysgYi9zb3VuZC91c2IvbWl4ZXJfc2NhcmxldHRfZ2VuMi5oCkBAIC0wLDAgKzEsNyBAQAorLyog U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KKyNpZm5kZWYgX19VU0JfTUlYRVJf U0NBUkxFVFRfR0VOMl9ICisjZGVmaW5lIF9fVVNCX01JWEVSX1NDQVJMRVRUX0dFTjJfSAorCitp bnQgc25kX3NjYXJsZXR0X2dlbjJfY29udHJvbHNfY3JlYXRlKHN0cnVjdCB1c2JfbWl4ZXJfaW50 ZXJmYWNlICptaXhlcik7CisKKyNlbmRpZiAvKiBfX1VTQl9NSVhFUl9TQ0FSTEVUVF9HRU4yX0gg Ki8KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWxzYS1k ZXZlbCBtYWlsaW5nIGxpc3QKQWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnCmh0dHBzOi8vbWFp bG1hbi5hbHNhLXByb2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8vYWxzYS1kZXZlbAo=