Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755681AbaJ1VhK (ORCPT ); Tue, 28 Oct 2014 17:37:10 -0400 Received: from mail-wg0-f50.google.com ([74.125.82.50]:53163 "EHLO mail-wg0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755370AbaJ1Vg5 (ORCPT ); Tue, 28 Oct 2014 17:36:57 -0400 MIME-Version: 1.0 In-Reply-To: <20141028174011.GC1445@sirus.conectiva> References: <20141025213201.005762f9.akpm@linux-foundation.org> <20141028133131.GA1445@sirus.conectiva> <20141028174011.GC1445@sirus.conectiva> From: Timofey Titovets Date: Wed, 29 Oct 2014 00:36:14 +0300 Message-ID: Subject: Re: UKSM: What's maintainers think about it? To: Marco A Benatto Cc: Andrew Morton , Linux Kernel , linux-mm@kvack.org Content-Type: multipart/mixed; boundary=001a1134cdee2fe6780506827203 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --001a1134cdee2fe6780506827203 Content-Type: text/plain; charset=UTF-8 2014-10-28 20:40 GMT+03:00 Marco A Benatto : > On Tue, Oct 28, 2014 at 04:59:45PM +0300, Timofey Titovets wrote: >> 2014-10-28 16:31 GMT+03:00 Marco A Benatto : >> > Hi All, >> > >> > I'm not mantainer at all, but I've being using UKSM for a long time and remember >> > to port it to 3.16 family once. >> > UKSM seems good and stable and, at least for me, doesn't raised any errors. >> > AFAIK the only limitation I know (maybe I has been fixed already) it isn't able >> > to work together with zram stuff due to some race-conditions. >> > >> > Cheers, >> > >> > Marco A Benatto >> > Mandriva OEM Developer >> > >> >> http://kerneldedup.org/forum/forum.php?mod=viewthread&tid=106 >> As i did find, uksm not conflicting with zram (or zswap - on my system). > > Interesting, > > I've contacted the mantainers to send some patches in April and they said me this: > > "The biggest problem between UKSM/KSM and zswap is that pages can be reclaimed so > fast by zswap before UKSM/KSM can have a chance to merge those can be merged. > > So one of the ideas that make a direct solution is that: > 1. sleep the processes who trigger the zswap > 2. wake up the UKSM thread and adjust the scan parameters properly to make it > sample the whole memory in a limited time to judge if there are any VMAs need to > be worked on. > 3. If there are those VMAs then merge them at full speed. if there not, > sleep UKSM. > 4. Wake up the zswap code pathes and judge that if memory is enough to satisfy > the requests. If there is enough memory then return and redo the memory > allocation. > 5. if there is not, then go on to do zswapping. > > This is just an outline of ONE of the solutions. It need to be carefully > tweaked. Direct page reclaiming of zswap is a time sensitive code path > , we cannot add too much overhead by doing this, > otherwise it loses its meaning." > >> --- >> Offtop: >> Why i open up question about UKSM? >> >> May be we (as community, who want to help) can split out UKSM in >> "several patches" in independent git repo. For allowing maintainers to >> review this. >> >> Is it morally correct? >> >> UKSM code licensed under GPL and as i think we can feel free for port >> and adopt code (with indicating the author) >> >> Please, fix me if i mistake or miss something. >> This is just stream of my thoughts %_% >> --- > > If there's no problem on that and if you don't mind, I can help you on this. > What dou you think? So cool, lets do it =3 https://github.com/Nefelim4ag/linux-uksm I've created a temporary git-repository. I am trying to split one big patch into several independent patches. Patch is attached to e-mail. Perhaps we can move conversation to personal emails(for you - to working)? > Cheers, > > Marco A Benatto > Mandriva OEM Developer -- Have a nice day, Timofey. --001a1134cdee2fe6780506827203 Content-Type: text/x-patch; charset=US-ASCII; name="0002-uksm-0.1.2.3-for-linux-next-20141016.ge.1.patch" Content-Disposition: attachment; filename="0002-uksm-0.1.2.3-for-linux-next-20141016.ge.1.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i1trxlhu0 RnJvbSAxM2MyZDE5MTYxODllNmQ2YmQyNTA3Y2RiMWM3MmY0NmM0ODM5ZGI1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBUaW1vZmV5IFRpdG92ZXRzIDxuZWZlbGltNGFnQGdtYWlsLmNv bT4KRGF0ZTogRnJpLCAxNyBPY3QgMjAxNCAxMjozMjowNCArMDMwMApTdWJqZWN0OiBbUEFUQ0hd IHVrc20tMC4xLjIuMy1mb3ItbGludXgtbmV4dC0yMDE0MTAxNi5nZS4xCgpTaWduZWQtb2ZmLWJ5 OiBUaW1vZmV5IFRpdG92ZXRzIDxuZWZlbGltNGFnQGdtYWlsLmNvbT4KLS0tCiBEb2N1bWVudGF0 aW9uL3ZtLzAwLUlOREVYICAgICB8ICAgIDIgKwogRG9jdW1lbnRhdGlvbi92bS91a3NtLnR4dCAg ICAgfCAgIDU4ICsKIGZzL2V4ZWMuYyAgICAgICAgICAgICAgICAgICAgIHwgICAgNCArLQogZnMv cHJvYy9tZW1pbmZvLmMgICAgICAgICAgICAgfCAgICA2ICsKIGluY2x1ZGUvYXNtLWdlbmVyaWMv cGd0YWJsZS5oIHwgICAxNyArLQogaW5jbHVkZS9saW51eC9rc20uaCAgICAgICAgICAgfCAgIDQ0 ICstCiBpbmNsdWRlL2xpbnV4L21tX3R5cGVzLmggICAgICB8ICAgIDMgKwogaW5jbHVkZS9saW51 eC9tbXpvbmUuaCAgICAgICAgfCAgICA1ICstCiBpbmNsdWRlL2xpbnV4L3NyYWRpeC10cmVlLmgg ICB8ICAgNzcgKwogaW5jbHVkZS9saW51eC91a3NtLmggICAgICAgICAgfCAgMTQ2ICsrCiBrZXJu ZWwvZm9yay5jICAgICAgICAgICAgICAgICB8ICAgIDQgKy0KIGxpYi9NYWtlZmlsZSAgICAgICAg ICAgICAgICAgIHwgICAgMiArLQogbGliL3NyYWRpeC10cmVlLmMgICAgICAgICAgICAgfCAgNDc2 ICsrKysKIG1tL0tjb25maWcgICAgICAgICAgICAgICAgICAgIHwgICAyNiArCiBtbS9NYWtlZmls ZSAgICAgICAgICAgICAgICAgICB8ICAgIDMgKy0KIG1tL21lbW9yeS5jICAgICAgICAgICAgICAg ICAgIHwgICA0MSArLQogbW0vbW1hcC5jICAgICAgICAgICAgICAgICAgICAgfCAgIDQ1ICstCiBt bS9ybWFwLmMgICAgICAgICAgICAgICAgICAgICB8ICAgIDQgKy0KIG1tL3Vrc20uYyAgICAgICAg ICAgICAgICAgICAgIHwgNTUzMSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKwogbW0vdm1zdGF0LmMgICAgICAgICAgICAgICAgICAgfCAgICAzICsKIDIwIGZpbGVzIGNo YW5nZWQsIDY0NjUgaW5zZXJ0aW9ucygrKSwgMzIgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAx MDA2NDQgRG9jdW1lbnRhdGlvbi92bS91a3NtLnR4dAogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1 ZGUvbGludXgvc3JhZGl4LXRyZWUuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvbGludXgv dWtzbS5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL3NyYWRpeC10cmVlLmMKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBtbS91a3NtLmMKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZtLzAwLUlOREVY IGIvRG9jdW1lbnRhdGlvbi92bS8wMC1JTkRFWAppbmRleCAwODFjNDk3Li43NWJkZTNkIDEwMDY0 NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vdm0v MDAtSU5ERVgKQEAgLTE2LDYgKzE2LDggQEAgaHdwb2lzb24udHh0CiAJLSBleHBsYWlucyB3aGF0 IGh3cG9pc29uIGlzCiBrc20udHh0CiAJLSBob3cgdG8gdXNlIHRoZSBLZXJuZWwgU2FtZXBhZ2Ug TWVyZ2luZyBmZWF0dXJlLgordWtzbS50eHQKKwktIEludHJvZHVjdGlvbiB0byBVbHRyYSBLU00K IG51bWEKIAktIGluZm9ybWF0aW9uIGFib3V0IE5VTUEgc3BlY2lmaWMgY29kZSBpbiB0aGUgTGlu dXggdm0uCiBudW1hX21lbW9yeV9wb2xpY3kudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9u L3ZtL3Vrc20udHh0IGIvRG9jdW1lbnRhdGlvbi92bS91a3NtLnR4dApuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwLi4wOGJkNjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRh dGlvbi92bS91a3NtLnR4dApAQCAtMCwwICsxLDU4IEBACitUaGUgVWx0cmEgS2VybmVsIFNhbWVw YWdlIE1lcmdpbmcgZmVhdHVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorLyoKKyAqIFVsdHJhIEtTTS4gQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgTmFp IFhpYQorICoKKyAqIFRoaXMgaXMgYW4gaW1wcm92ZW1lbnQgdXBvbiBLU00uIFNvbWUgYmFzaWMg ZGF0YSBzdHJ1Y3R1cmVzIGFuZCByb3V0aW5lcworICogYXJlIGJvcnJvd2VkIGZyb20ga3NtLmMg LgorICoKKyAqIEl0cyBuZXcgZmVhdHVyZXM6CisgKiAxLiBGdWxsIHN5c3RlbSBzY2FuOgorICog ICAgICBJdCBhdXRvbWF0aWNhbGx5IHNjYW5zIGFsbCB1c2VyIHByb2Nlc3NlcycgYW5vbnltb3Vz IFZNQXMuIEtlcm5lbC11c2VyCisgKiAgICAgIGludGVyYWN0aW9uIHRvIHN1Ym1pdCBhIG1lbW9y eSBhcmVhIHRvIEtTTSBpcyBubyBsb25nZXIgbmVlZGVkLgorICoKKyAqIDIuIFJpY2ggYXJlYSBk ZXRlY3Rpb246CisgKiAgICAgIEl0IGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyByaWNoIGFyZWFzIGNv bnRhaW5pbmcgYWJ1bmRhbnQgZHVwbGljYXRlZAorICogICAgICBwYWdlcyBiYXNlZC4gUmljaCBh cmVhcyBhcmUgZ2l2ZW4gYSBmdWxsIHNjYW4gc3BlZWQuIFBvb3IgYXJlYXMgYXJlCisgKiAgICAg IHNhbXBsZWQgYXQgYSByZWFzb25hYmxlIHNwZWVkIHdpdGggdmVyeSBsb3cgQ1BVIGNvbnN1bXB0 aW9uLgorICoKKyAqIDMuIFVsdHJhIFBlci1wYWdlIHNjYW4gc3BlZWQgaW1wcm92ZW1lbnQ6Cisg KiAgICAgIEEgbmV3IGhhc2ggYWxnb3JpdGhtIGlzIHByb3Bvc2VkLiBBcyBhIHJlc3VsdCwgb24g YSBtYWNoaW5lIHdpdGgKKyAqICAgICAgQ29yZShUTSkyIFF1YWQgUTkzMDAgQ1BVIGluIDMyLWJp dCBtb2RlIGFuZCA4MDBNSFogRERSMiBtYWluIG1lbW9yeSwgaXQKKyAqICAgICAgY2FuIHNjYW4g bWVtb3J5IGFyZWFzIHRoYXQgZG9lcyBub3QgY29udGFpbiBkdXBsaWNhdGVkIHBhZ2VzIGF0IHNw ZWVkIG9mCisgKiAgICAgIDYyN01CL3NlYyB+IDI0NDVNQi9zZWMgYW5kIGNhbiBtZXJnZSBkdXBs aWNhdGVkIGFyZWFzIGF0IHNwZWVkIG9mCisgKiAgICAgIDQ3N01CL3NlYyB+IDkyM01CL3NlYy4K KyAqCisgKiA0LiBUaHJhc2hpbmcgYXJlYSBhdm9pZGFuY2U6CisgKiAgICAgIFRocmFzaGluZyBh cmVhKGFuIFZNQSB0aGF0IGhhcyBmcmVxdWVudCBLc20gcGFnZSBicmVhay1vdXQpIGNhbiBiZQor ICogICAgICBmaWx0ZXJlZCBvdXQuIE15IGJlbmNobWFyayBzaG93cyBpdCdzIG1vcmUgZWZmaWNp ZW50IHRoYW4gS1NNJ3MgcGVyLXBhZ2UKKyAqICAgICAgaGFzaCB2YWx1ZSBiYXNlZCB2b2xhdGls ZSBwYWdlIGRldGVjdGlvbi4KKyAqCisgKgorICogNS4gTWlzYyBjaGFuZ2VzIHVwb24gS1NNOgor ICogICAgICAqIEl0IGhhcyBhIGZ1bGx5IHg4Ni1vcGl0bWl6ZWQgbWVtY21wIGRlZGljYXRlZCBm b3IgNC1ieXRlLWFsaWduZWQgcGFnZQorICogICAgICAgIGNvbXBhcmlzb24uIEl0J3MgbXVjaCBm YXN0ZXIgdGhhbiBkZWZhdWx0IEMgdmVyc2lvbiBvbiB4ODYuCisgKiAgICAgICogcm1hcF9pdGVt IG5vdyBoYXMgYW4gc3RydWN0ICpwYWdlIG1lbWJlciB0byBsb29zZWx5IGNhY2hlIGEKKyAqICAg ICAgICBhZGRyZXNzLS0+cGFnZSBtYXBwaW5nLCB3aGljaCByZWR1Y2VzIHRvbyBtdWNoIHRpbWUt Y29zdGx5CisgKiAgICAgICAgZm9sbG93X3BhZ2UoKS4KKyAqICAgICAgKiBUaGUgVk1BIGNyZWF0 aW9uL2V4aXQgcHJvY2VkdXJlcyBhcmUgaG9va2VkIHRvIGxldCB0aGUgVWx0cmEgS1NNIGtub3cu CisgKiAgICAgICogdHJ5X3RvX21lcmdlX3R3b19wYWdlcygpIG5vdyBjYW4gcmV2ZXJ0IGEgcHRl IGlmIGl0IGZhaWxzLiBObyBicmVha18KKyAqICAgICAgICBrc20gaXMgbmVlZGVkIGZvciB0aGlz IGNhc2UuCisgKgorICogNi4gRnVsbCBaZXJvIFBhZ2UgY29uc2lkZXJhdGlvbihjb250cmlidXRl ZCBieSBGaWdvIFpoYW5nKQorICogICAgTm93IHVrc21kIGNvbnNpZGVyIGZ1bGwgemVybyBwYWdl cyBhcyBzcGVjaWFsIHBhZ2VzIGFuZCBtZXJnZSB0aGVtIHRvIGFuCisgKiAgICBzcGVjaWFsIHVu c3dhcHBhYmxlIHVrc20gemVybyBwYWdlLgorICovCisKK0NoYW5nZUxvZzoKKworMjAxMi0wNS0w NSBUaGUgY3JlYXRpb24gb2YgdGhpcyBEb2MKKzIwMTItMDUtMDggVUtTTSAwLjEuMS4xIGxpYmMg Y3Jhc2ggYnVnIGZpeCwgYXBpIGNsZWFuIHVwLCBkb2MgY2xlYW4gdXAuCisyMDEyLTA1LTI4IFVL U00gMC4xLjEuMiBidWcgZml4IHJlbGVhc2UKKzIwMTItMDYtMjYgVUtTTSAwLjEuMi1iZXRhMSBm aXJzdCBiZXRhIHJlbGVhc2UgZm9yIDAuMS4yCisyMDEyLTA3LTIgIFVLU00gMC4xLjItYmV0YTIK KzIwMTItMDctMTAgVUtTTSAwLjEuMi1iZXRhMworMjAxMi0wNy0yNiBVS1NNIDAuMS4yIEZpbmUg Z3JhaW5lZCBzcGVlZCBjb250cm9sLCBtb3JlIHNjYW4gb3B0aW1pemF0aW9uLgorMjAxMi0xMC0x MyBVS1NNIDAuMS4yLjEgQnVnIGZpeGVzLgorMjAxMi0xMi0zMSBVS1NNIDAuMS4yLjIgTWlub3Ig YnVnIGZpeGVzCisyMDE0LTA3LTAyIFVLU00gMC4xLjIuMyBGaXggYSAiIF9fdGhpc19jcHVfcmVh ZCgpIGluIHByZWVtcHRpYmxlIGJ1ZyIKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMu YwppbmRleCA3MzAyYjc1Li44NGIwZGY1IDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMv ZXhlYy5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKiBjdXJyZW50LT5leGVjdXRhYmxlIGlzIG9ubHkg dXNlZCBieSB0aGUgcHJvY2ZzLiAgVGhpcyBhbGxvd3MgYSBkaXNwYXRjaAogICogdGFibGUgdG8g Y2hlY2sgZm9yIHNldmVyYWwgZGlmZmVyZW50IHR5cGVzICBvZiBiaW5hcnkgZm9ybWF0cy4gIFdl IGtlZXAKICAqIHRyeWluZyB1bnRpbCB3ZSByZWNvZ25pemUgdGhlIGZpbGUgb3Igd2UgcnVuIG91 dCBvZiBzdXBwb3J0ZWQgYmluYXJ5Ci0gKiBmb3JtYXRzLiAKKyAqIGZvcm1hdHMuCiAgKi8KIAog I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlIDxsaW51 eC9waXBlX2ZzX2kuaD4KICNpbmNsdWRlIDxsaW51eC9vb20uaD4KICNpbmNsdWRlIDxsaW51eC9j b21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rc20uaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNz Lmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CkBAIC0xMTI4LDYgKzExMjksNyBAQCB2 b2lkIHNldHVwX25ld19leGVjKHN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtKQogCS8qIEFuIGV4 ZWMgY2hhbmdlcyBvdXIgZG9tYWluLiBXZSBhcmUgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIHRocmVh ZAogCSAgIGdyb3VwICovCiAJY3VycmVudC0+c2VsZl9leGVjX2lkKys7CisKIAlmbHVzaF9zaWdu YWxfaGFuZGxlcnMoY3VycmVudCwgMCk7CiAJZG9fY2xvc2Vfb25fZXhlYyhjdXJyZW50LT5maWxl cyk7CiB9CmRpZmYgLS1naXQgYS9mcy9wcm9jL21lbWluZm8uYyBiL2ZzL3Byb2MvbWVtaW5mby5j CmluZGV4IGFhMWVlZTAuLjVhOTE0OWMgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvbWVtaW5mby5jCisr KyBiL2ZzL3Byb2MvbWVtaW5mby5jCkBAIC0xMjEsNiArMTIxLDkgQEAgc3RhdGljIGludCBtZW1p bmZvX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiAJCSJTVW5yZWNsYWlt OiAgICAgJThsdSBrQlxuIgogCQkiS2VybmVsU3RhY2s6ICAgICU4bHUga0JcbiIKIAkJIlBhZ2VU YWJsZXM6ICAgICAlOGx1IGtCXG4iCisjaWZkZWYgQ09ORklHX1VLU00KKwkJIktzbVplcm9QYWdl czogICAlOGx1IGtCXG4iCisjZW5kaWYKICNpZmRlZiBDT05GSUdfUVVJQ0tMSVNUCiAJCSJRdWlj a2xpc3RzOiAgICAgJThsdSBrQlxuIgogI2VuZGlmCkBAIC0xNzUsNiArMTc4LDkgQEAgc3RhdGlj IGludCBtZW1pbmZvX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiAJCUso Z2xvYmFsX3BhZ2Vfc3RhdGUoTlJfU0xBQl9VTlJFQ0xBSU1BQkxFKSksCiAJCWdsb2JhbF9wYWdl X3N0YXRlKE5SX0tFUk5FTF9TVEFDSykgKiBUSFJFQURfU0laRSAvIDEwMjQsCiAJCUsoZ2xvYmFs X3BhZ2Vfc3RhdGUoTlJfUEFHRVRBQkxFKSksCisjaWZkZWYgQ09ORklHX1VLU00KKwkJSyhnbG9i YWxfcGFnZV9zdGF0ZShOUl9VS1NNX1pFUk9fUEFHRVMpKSwKKyNlbmRpZgogI2lmZGVmIENPTkZJ R19RVUlDS0xJU1QKIAkJSyhxdWlja2xpc3RfdG90YWxfc2l6ZSgpKSwKICNlbmRpZgpkaWZmIC0t Z2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1nZW5lcmlj L3BndGFibGUuaAppbmRleCA3NTJlMzBkLi4xZTdjODI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2Fz bS1nZW5lcmljL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaApA QCAtNTM3LDEyICs1MzcsMjUgQEAgZXh0ZXJuIHZvaWQgdW50cmFja19wZm4oc3RydWN0IHZtX2Fy ZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgcGZuLAogCQkJdW5zaWduZWQgbG9uZyBzaXpl KTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1VLU00KK3N0YXRpYyBpbmxpbmUgaW50IGlzX3Vr c21femVyb19wZm4odW5zaWduZWQgbG9uZyBwZm4pCit7CisJZXh0ZXJuIHVuc2lnbmVkIGxvbmcg dWtzbV96ZXJvX3BmbjsKKyAgICAgICAgcmV0dXJuIHBmbiA9PSB1a3NtX3plcm9fcGZuOworfQor I2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3Vrc21femVyb19wZm4odW5zaWduZWQgbG9uZyBw Zm4pCit7CisgICAgICAgIHJldHVybiAwOworfQorI2VuZGlmCisKICNpZmRlZiBfX0hBVkVfQ09M T1JfWkVST19QQUdFCiBzdGF0aWMgaW5saW5lIGludCBpc196ZXJvX3Bmbih1bnNpZ25lZCBsb25n IHBmbikKIHsKIAlleHRlcm4gdW5zaWduZWQgbG9uZyB6ZXJvX3BmbjsKIAl1bnNpZ25lZCBsb25n IG9mZnNldF9mcm9tX3plcm9fcGZuID0gcGZuIC0gemVyb19wZm47Ci0JcmV0dXJuIG9mZnNldF9m cm9tX3plcm9fcGZuIDw9ICh6ZXJvX3BhZ2VfbWFzayA+PiBQQUdFX1NISUZUKTsKKwlyZXR1cm4g b2Zmc2V0X2Zyb21femVyb19wZm4gPD0gKHplcm9fcGFnZV9tYXNrID4+IFBBR0VfU0hJRlQpIHx8 IGlzX3Vrc21femVyb19wZm4ocGZuKTsKIH0KIAogI2RlZmluZSBteV96ZXJvX3BmbihhZGRyKQlw YWdlX3RvX3BmbihaRVJPX1BBR0UoYWRkcikpCkBAIC01NTEsNyArNTY0LDcgQEAgc3RhdGljIGlu bGluZSBpbnQgaXNfemVyb19wZm4odW5zaWduZWQgbG9uZyBwZm4pCiBzdGF0aWMgaW5saW5lIGlu dCBpc196ZXJvX3Bmbih1bnNpZ25lZCBsb25nIHBmbikKIHsKIAlleHRlcm4gdW5zaWduZWQgbG9u ZyB6ZXJvX3BmbjsKLQlyZXR1cm4gcGZuID09IHplcm9fcGZuOworCXJldHVybiAocGZuID09IHpl cm9fcGZuKSB8fCAoaXNfdWtzbV96ZXJvX3BmbihwZm4pKTsKIH0KIAogc3RhdGljIGlubGluZSB1 bnNpZ25lZCBsb25nIG15X3plcm9fcGZuKHVuc2lnbmVkIGxvbmcgYWRkcikKZGlmZiAtLWdpdCBh L2luY2x1ZGUvbGludXgva3NtLmggYi9pbmNsdWRlL2xpbnV4L2tzbS5oCmluZGV4IDNiZTZiYjEu LjUxNTU3ZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3NtLmgKKysrIGIvaW5jbHVkZS9s aW51eC9rc20uaApAQCAtMTksMjEgKzE5LDYgQEAgc3RydWN0IG1lbV9jZ3JvdXA7CiAjaWZkZWYg Q09ORklHX0tTTQogaW50IGtzbV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1 bnNpZ25lZCBsb25nIHN0YXJ0LAogCQl1bnNpZ25lZCBsb25nIGVuZCwgaW50IGFkdmljZSwgdW5z aWduZWQgbG9uZyAqdm1fZmxhZ3MpOwotaW50IF9fa3NtX2VudGVyKHN0cnVjdCBtbV9zdHJ1Y3Qg Km1tKTsKLXZvaWQgX19rc21fZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSk7Ci0KLXN0YXRpYyBp bmxpbmUgaW50IGtzbV9mb3JrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgbW1fc3RydWN0 ICpvbGRtbSkKLXsKLQlpZiAodGVzdF9iaXQoTU1GX1ZNX01FUkdFQUJMRSwgJm9sZG1tLT5mbGFn cykpCi0JCXJldHVybiBfX2tzbV9lbnRlcihtbSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBp bmxpbmUgdm9pZCBrc21fZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKLXsKLQlpZiAodGVzdF9i aXQoTU1GX1ZNX01FUkdFQUJMRSwgJm1tLT5mbGFncykpCi0JCV9fa3NtX2V4aXQobW0pOwotfQog CiAvKgogICogQSBLU00gcGFnZSBpcyBvbmUgb2YgdGhvc2Ugd3JpdGUtcHJvdGVjdGVkICJzaGFy ZWQgcGFnZXMiIG9yICJtZXJnZWQgcGFnZXMiCkBAIC03Niw2ICs2MSwzMyBAQCBzdHJ1Y3QgcGFn ZSAqa3NtX21pZ2h0X25lZWRfdG9fY29weShzdHJ1Y3QgcGFnZSAqcGFnZSwKIGludCBybWFwX3dh bGtfa3NtKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgcm1hcF93YWxrX2NvbnRyb2wgKnJ3Yyk7 CiB2b2lkIGtzbV9taWdyYXRlX3BhZ2Uoc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBwYWdl ICpvbGRwYWdlKTsKIAorI2lmZGVmIENPTkZJR19LU01fTEVHQUNZCitpbnQgX19rc21fZW50ZXIo c3RydWN0IG1tX3N0cnVjdCAqbW0pOwordm9pZCBfX2tzbV9leGl0KHN0cnVjdCBtbV9zdHJ1Y3Qg Km1tKTsKK3N0YXRpYyBpbmxpbmUgaW50IGtzbV9mb3JrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBz dHJ1Y3QgbW1fc3RydWN0ICpvbGRtbSkKK3sKKwlpZiAodGVzdF9iaXQoTU1GX1ZNX01FUkdFQUJM RSwgJm9sZG1tLT5mbGFncykpCisJCXJldHVybiBfX2tzbV9lbnRlcihtbSk7CisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrc21fZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSkK K3sKKwlpZiAodGVzdF9iaXQoTU1GX1ZNX01FUkdFQUJMRSwgJm1tLT5mbGFncykpCisJCV9fa3Nt X2V4aXQobW0pOworfQorCisjZWxpZiBkZWZpbmVkKENPTkZJR19VS1NNKQorc3RhdGljIGlubGlu ZSBpbnQga3NtX2Zvcmsoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBtbV9zdHJ1Y3QgKm9s ZG1tKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga3NtX2V4aXQoc3Ry dWN0IG1tX3N0cnVjdCAqbW0pCit7Cit9CisjZW5kaWYgLyogIUNPTkZJR19VS1NNICovCisKICNl bHNlICAvKiAhQ09ORklHX0tTTSAqLwogCiBzdGF0aWMgaW5saW5lIGludCBrc21fZm9yayhzdHJ1 Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IG1tX3N0cnVjdCAqb2xkbW0pCkBAIC0xMjMsNCArMTM1 LDYgQEAgc3RhdGljIGlubGluZSB2b2lkIGtzbV9taWdyYXRlX3BhZ2Uoc3RydWN0IHBhZ2UgKm5l d3BhZ2UsIHN0cnVjdCBwYWdlICpvbGRwYWdlKQogI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KICNl bmRpZiAvKiAhQ09ORklHX0tTTSAqLwogCisjaW5jbHVkZSA8bGludXgvdWtzbS5oPgorCiAjZW5k aWYgLyogX19MSU5VWF9LU01fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbV90eXBl cy5oIGIvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oCmluZGV4IDZlMGIyODYuLmViZDYyNDMgMTAw NjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21t X3R5cGVzLmgKQEAgLTMwOCw2ICszMDgsOSBAQCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgewogI2lm ZGVmIENPTkZJR19OVU1BCiAJc3RydWN0IG1lbXBvbGljeSAqdm1fcG9saWN5OwkvKiBOVU1BIHBv bGljeSBmb3IgdGhlIFZNQSAqLwogI2VuZGlmCisjaWZkZWYgQ09ORklHX1VLU00KKwlzdHJ1Y3Qg dm1hX3Nsb3QgKnVrc21fdm1hX3Nsb3Q7CisjZW5kaWYKIH07CiAKIHN0cnVjdCBjb3JlX3RocmVh ZCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51eC9t bXpvbmUuaAppbmRleCA0OGJmMTJlLi5kYTMxYWM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4 L21tem9uZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKQEAgLTE1Nyw2ICsxNTcsOSBA QCBlbnVtIHpvbmVfc3RhdF9pdGVtIHsKIAlXT1JLSU5HU0VUX05PREVSRUNMQUlNLAogCU5SX0FO T05fVFJBTlNQQVJFTlRfSFVHRVBBR0VTLAogCU5SX0ZSRUVfQ01BX1BBR0VTLAorI2lmZGVmIENP TkZJR19VS1NNCisJTlJfVUtTTV9aRVJPX1BBR0VTLAorI2VuZGlmCiAJTlJfVk1fWk9ORV9TVEFU X0lURU1TIH07CiAKIC8qCkBAIC04NTYsNyArODU5LDcgQEAgc3RhdGljIGlubGluZSBpbnQgaXNf aGlnaG1lbV9pZHgoZW51bSB6b25lX3R5cGUgaWR4KQogfQogCiAvKioKLSAqIGlzX2hpZ2htZW0g LSBoZWxwZXIgZnVuY3Rpb24gdG8gcXVpY2tseSBjaGVjayBpZiBhIHN0cnVjdCB6b25lIGlzIGEg CisgKiBpc19oaWdobWVtIC0gaGVscGVyIGZ1bmN0aW9uIHRvIHF1aWNrbHkgY2hlY2sgaWYgYSBz dHJ1Y3Qgem9uZSBpcyBhCiAgKiAgICAgICAgICAgICAgaGlnaG1lbSB6b25lIG9yIG5vdC4gIFRo aXMgaXMgYW4gYXR0ZW1wdCB0byBrZWVwIHJlZmVyZW5jZXMKICAqICAgICAgICAgICAgICB0byBa T05FX3tETUEvTk9STUFML0hJR0hNRU0vZXRjfSBpbiBnZW5lcmFsIGNvZGUgdG8gYSBtaW5pbXVt LgogICogQHpvbmUgLSBwb2ludGVyIHRvIHN0cnVjdCB6b25lIHZhcmlhYmxlCmRpZmYgLS1naXQg YS9pbmNsdWRlL2xpbnV4L3NyYWRpeC10cmVlLmggYi9pbmNsdWRlL2xpbnV4L3NyYWRpeC10cmVl LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc4MGZkYgotLS0gL2Rldi9u dWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3JhZGl4LXRyZWUuaApAQCAtMCwwICsxLDc3IEBACisj aWZuZGVmIF9MSU5VWF9TUkFESVhfVFJFRV9ICisjZGVmaW5lIF9MSU5VWF9TUkFESVhfVFJFRV9I CisKKworI2RlZmluZSBJTklUX1NSQURJWF9UUkVFKHJvb3QsIG1hc2spCQkJCQlcCitkbyB7CQkJ CQkJCQkJXAorCShyb290KS0+aGVpZ2h0ID0gMDsJCQkJCQlcCisJKHJvb3QpLT5nZnBfbWFzayA9 IChtYXNrKTsJCQkJCVwKKwkocm9vdCktPnJub2RlID0gTlVMTDsJCQkJCQlcCit9IHdoaWxlICgw KQorCisjZGVmaW5lIFVMT05HX0JJVFMJKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpCisjZGVm aW5lIFNSQURJWF9UUkVFX0lOREVYX0JJVFMgICg4IC8qIENIQVJfQklUICovICogc2l6ZW9mKHVu c2lnbmVkIGxvbmcpKQorLy8jZGVmaW5lIFNSQURJWF9UUkVFX01BUF9TSElGVAk2CisvLyNkZWZp bmUgU1JBRElYX1RSRUVfTUFQX1NJWkUJKDFVTCA8PCBTUkFESVhfVFJFRV9NQVBfU0hJRlQpCisv LyNkZWZpbmUgU1JBRElYX1RSRUVfTUFQX01BU0sJKFNSQURJWF9UUkVFX01BUF9TSVpFLTEpCisK K3N0cnVjdCBzcmFkaXhfdHJlZV9ub2RlIHsKKwl1bnNpZ25lZCBpbnQJaGVpZ2h0OwkJLyogSGVp Z2h0IGZyb20gdGhlIGJvdHRvbSAqLworCXVuc2lnbmVkIGludAljb3VudDsJCQorCXVuc2lnbmVk IGludAlmdWxsczsJCS8qIE51bWJlciBvZiBmdWxsIHN1YmxldmVsIHRyZWVzICovIAorCXN0cnVj dCBzcmFkaXhfdHJlZV9ub2RlICpwYXJlbnQ7CisJdm9pZCAqc3RvcmVzWzBdOworfTsKKworLyog QSBzaW1wbGUgcmFkaXggdHJlZSBpbXBsZW1lbnRhdGlvbiAqLworc3RydWN0IHNyYWRpeF90cmVl X3Jvb3QgeworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBoZWlnaHQ7CisgICAgICAg IHN0cnVjdCBzcmFkaXhfdHJlZV9ub2RlICpybm9kZTsKKworCS8qIFdoZXJlIGZvdW5kIHRvIGhh dmUgYXZhaWxhYmxlIGVtcHR5IHN0b3JlcyBpbiBpdHMgc3VibGV2ZWxzICovCisgICAgICAgIHN0 cnVjdCBzcmFkaXhfdHJlZV9ub2RlICplbnRlcl9ub2RlOworCXVuc2lnbmVkIGludCBzaGlmdDsK Kwl1bnNpZ25lZCBpbnQgc3RvcmVzX3NpemU7CisJdW5zaWduZWQgaW50IG1hc2s7CisJdW5zaWdu ZWQgbG9uZyBtaW47CS8qIFRoZSBmaXJzdCBob2xlIGluZGV4ICovCisJdW5zaWduZWQgbG9uZyBu dW07CisJLy91bnNpZ25lZCBsb25nICpoZWlnaHRfdG9fbWF4aW5kZXg7CisKKwkvKiBIb3cgdGhl IG5vZGUgaXMgYWxsb2NhdGVkIGFuZCBmcmVlZC4gKi8KKwlzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9k ZSAqKCphbGxvYykodm9pZCk7IAorCXZvaWQgKCpmcmVlKShzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9k ZSAqbm9kZSk7CisKKwkvKiBXaGVuIGEgbmV3IG5vZGUgaXMgYWRkZWQgYW5kIHJlbW92ZWQgKi8K Kwl2b2lkICgqZXh0ZW5kKShzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9kZSAqcGFyZW50LCBzdHJ1Y3Qg c3JhZGl4X3RyZWVfbm9kZSAqY2hpbGQpOworCXZvaWQgKCphc3NpZ24pKHN0cnVjdCBzcmFkaXhf dHJlZV9ub2RlICpub2RlLCB1bnNpZ25lZCBpbmRleCwgdm9pZCAqaXRlbSk7CisJdm9pZCAoKnJt KShzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9kZSAqbm9kZSwgdW5zaWduZWQgb2Zmc2V0KTsKK307CisK K3N0cnVjdCBzcmFkaXhfdHJlZV9wYXRoIHsKKwlzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9kZSAqbm9k ZTsKKwlpbnQgb2Zmc2V0OworfTsKKworc3RhdGljIGlubGluZSAKK3ZvaWQgaW5pdF9zcmFkaXhf dHJlZV9yb290KHN0cnVjdCBzcmFkaXhfdHJlZV9yb290ICpyb290LCB1bnNpZ25lZCBsb25nIHNo aWZ0KQoreworCXJvb3QtPmhlaWdodCA9IDA7CisJcm9vdC0+cm5vZGUgPSBOVUxMOworCXJvb3Qt PnNoaWZ0ID0gc2hpZnQ7CisJcm9vdC0+c3RvcmVzX3NpemUgPSAxVUwgPDwgc2hpZnQ7CisJcm9v dC0+bWFzayA9IHJvb3QtPnN0b3Jlc19zaXplIC0gMTsKK30KKworCitleHRlcm4gdm9pZCAqc3Jh ZGl4X3RyZWVfbmV4dChzdHJ1Y3Qgc3JhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJICAgICAgIHN0 cnVjdCBzcmFkaXhfdHJlZV9ub2RlICpub2RlLCB1bnNpZ25lZCBsb25nIGluZGV4LAorCQkgICAg ICAgaW50ICgqaXRlcikodm9pZCAqLCB1bnNpZ25lZCBsb25nKSk7CisKK2V4dGVybiBpbnQgc3Jh ZGl4X3RyZWVfZW50ZXIoc3RydWN0IHNyYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHZvaWQgKippdGVt LCBpbnQgbnVtKTsKKworZXh0ZXJuIHZvaWQgc3JhZGl4X3RyZWVfZGVsZXRlX2Zyb21fbGVhZihz dHJ1Y3Qgc3JhZGl4X3RyZWVfcm9vdCAqcm9vdCwgCisJCQlzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9k ZSAqbm9kZSwgdW5zaWduZWQgbG9uZyBpbmRleCk7CisKK2V4dGVybiB2b2lkICpzcmFkaXhfdHJl ZV9sb29rdXAoc3RydWN0IHNyYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIGxvbmcgaW5k ZXgpOworCisjZW5kaWYgLyogX0xJTlVYX1NSQURJWF9UUkVFX0ggKi8KZGlmZiAtLWdpdCBhL2lu Y2x1ZGUvbGludXgvdWtzbS5oIGIvaW5jbHVkZS9saW51eC91a3NtLmgKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0NGJjYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUv bGludXgvdWtzbS5oCkBAIC0wLDAgKzEsMTQ2IEBACisjaWZuZGVmIF9fTElOVVhfVUtTTV9ICisj ZGVmaW5lIF9fTElOVVhfVUtTTV9ICisvKgorICogTWVtb3J5IG1lcmdpbmcgc3VwcG9ydC4KKyAq CisgKiBUaGlzIGNvZGUgZW5hYmxlcyBkeW5hbWljIHNoYXJpbmcgb2YgaWRlbnRpY2FsIHBhZ2Vz IGZvdW5kIGluIGRpZmZlcmVudAorICogbWVtb3J5IGFyZWFzLCBldmVuIGlmIHRoZXkgYXJlIG5v dCBzaGFyZWQgYnkgZm9yaygpLgorICovCisKKy8qIGlmICFDT05GSUdfVUtTTSB0aGlzIGZpbGUg c2hvdWxkIG5vdCBiZSBjb21waWxlZCBhdCBhbGwuICovCisjaWZkZWYgQ09ORklHX1VLU00KKwor I2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVk ZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JtYXAuaD4KKyNpbmNsdWRlIDxs aW51eC9zY2hlZC5oPgorCitleHRlcm4gdW5zaWduZWQgbG9uZyB6ZXJvX3BmbiBfX3JlYWRfbW9z dGx5OworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdWtzbV96ZXJvX3BmbiBfX3JlYWRfbW9zdGx5Owor ZXh0ZXJuIHN0cnVjdCBwYWdlICplbXB0eV91a3NtX3plcm9fcGFnZTsKKworLyogbXVzdCBiZSBk b25lIGJlZm9yZSBsaW5rZWQgdG8gbW0gKi8KK2V4dGVybiB2b2lkIHVrc21fdm1hX2FkZF9uZXco c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworZXh0ZXJuIHZvaWQgdWtzbV9yZW1vdmVfdm1h KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKworI2RlZmluZSBVS1NNX1NMT1RfTkVFRF9T T1JUCSgxIDw8IDApCisjZGVmaW5lIFVLU01fU0xPVF9ORUVEX1JFUkFORCAJKDEgPDwgMSkKKyNk ZWZpbmUgVUtTTV9TTE9UX1NDQU5ORUQgICAgIAkoMSA8PCAyKSAvKiBJdCdzIHNjYW5uZWQgaW4g dGhpcyByb3VuZCAqLworI2RlZmluZSBVS1NNX1NMT1RfRlVMX1NDQU5ORUQgCSgxIDw8IDMpCisj ZGVmaW5lIFVLU01fU0xPVF9JTl9VS1NNIAkoMSA8PCA0KQorCitzdHJ1Y3Qgdm1hX3Nsb3Qgewor CXN0cnVjdCBzcmFkaXhfdHJlZV9ub2RlICpzbm9kZTsKKwl1bnNpZ25lZCBsb25nIHNpbmRleDsK KworCXN0cnVjdCBsaXN0X2hlYWQgc2xvdF9saXN0OworCXVuc2lnbmVkIGxvbmcgZnVsbHlfc2Nh bm5lZF9yb3VuZDsKKwl1bnNpZ25lZCBsb25nIGRlZHVwX251bTsKKwl1bnNpZ25lZCBsb25nIHBh Z2VzX3NjYW5uZWQ7CisJdW5zaWduZWQgbG9uZyBsYXN0X3NjYW5uZWQ7CisJdW5zaWduZWQgbG9u ZyBwYWdlc190b19zY2FuOworCXN0cnVjdCBzY2FuX3J1bmcgKnJ1bmc7CisJc3RydWN0IHBhZ2Ug KipybWFwX2xpc3RfcG9vbDsKKwl1bnNpZ25lZCBpbnQgKnBvb2xfY291bnRzOworCXVuc2lnbmVk IGxvbmcgcG9vbF9zaXplOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVjdCBt bV9zdHJ1Y3QgKm1tOworCXVuc2lnbmVkIGxvbmcgY3RpbWVfajsKKwl1bnNpZ25lZCBsb25nIHBh Z2VzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBwYWdlc19jb3dlZDsg LyogcGFnZXMgY293ZWQgdGhpcyByb3VuZCAqLworCXVuc2lnbmVkIGxvbmcgcGFnZXNfbWVyZ2Vk OyAvKiBwYWdlcyBtZXJnZWQgdGhpcyByb3VuZCAqLworCXVuc2lnbmVkIGxvbmcgcGFnZXNfYmVt ZXJnZWQ7CisKKwkvKiB3aGVuIGl0IGhhcyBwYWdlIG1lcmdlZCBpbiB0aGlzIGV2YWwgcm91bmQg Ki8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlZHVwX2xpc3Q7Cit9OworCitzdGF0aWMgaW5saW5lIHZv aWQgdWtzbV91bm1hcF96ZXJvX3BhZ2UocHRlX3QgcHRlKQoreworCWlmIChwdGVfcGZuKHB0ZSkg PT0gdWtzbV96ZXJvX3BmbikKKwkJX19kZWNfem9uZV9wYWdlX3N0YXRlKGVtcHR5X3Vrc21femVy b19wYWdlLCBOUl9VS1NNX1pFUk9fUEFHRVMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWtz bV9tYXBfemVyb19wYWdlKHB0ZV90IHB0ZSkKK3sKKwlpZiAocHRlX3BmbihwdGUpID09IHVrc21f emVyb19wZm4pCisJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShlbXB0eV91a3NtX3plcm9fcGFnZSwg TlJfVUtTTV9aRVJPX1BBR0VTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVrc21fY293X3Bh Z2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCWlm ICh2bWEtPnVrc21fdm1hX3Nsb3QgJiYgUGFnZUtzbShwYWdlKSkKKwkJdm1hLT51a3NtX3ZtYV9z bG90LT5wYWdlc19jb3dlZCsrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWtzbV9jb3dfcHRl KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwdGVfdCBwdGUpCit7CisJaWYgKHZtYS0+dWtz bV92bWFfc2xvdCAmJiBwdGVfcGZuKHB0ZSkgPT0gdWtzbV96ZXJvX3BmbikKKwkJdm1hLT51a3Nt X3ZtYV9zbG90LT5wYWdlc19jb3dlZCsrOworfQorCitzdGF0aWMgaW5saW5lIGludCB1a3NtX2Zs YWdzX2Nhbl9zY2FuKHVuc2lnbmVkIGxvbmcgdm1fZmxhZ3MpCit7CisjaWZuZGVmIFZNX1NBTwor I2RlZmluZSBWTV9TQU8gMAorI2VuZGlmCisJcmV0dXJuICEodm1fZmxhZ3MgJiAoVk1fUEZOTUFQ IHwgVk1fSU8gIHwgVk1fRE9OVEVYUEFORCB8CisJCQkgICAgIFZNX0hVR0VUTEIgfCBWTV9OT05M SU5FQVIgfCBWTV9NSVhFRE1BUCB8CisJCQkgICAgIFZNX1NIQVJFRCAgfCBWTV9NQVlTSEFSRSB8 IFZNX0dST1dTVVAgfCBWTV9HUk9XU0RPV04gfCBWTV9TQU8pKTsKK30KKworc3RhdGljIGlubGlu ZSB2b2lkIHVrc21fdm1fZmxhZ3NfbW9kKHVuc2lnbmVkIGxvbmcgKnZtX2ZsYWdzX3ApCit7CisJ aWYgKHVrc21fZmxhZ3NfY2FuX3NjYW4oKnZtX2ZsYWdzX3ApKQorCQkqdm1fZmxhZ3NfcCB8PSBW TV9NRVJHRUFCTEU7Cit9CisKKy8qCisgKiBKdXN0IGEgd3JhcHBlciBmb3IgQlVHX09OIGZvciB3 aGVyZSBrc21femVyb3BhZ2UgbXVzdCBub3QgYmUuIFRPRE86IGl0IHdpbGwKKyAqIGJlIHJlbW92 ZWQgd2hlbiB1a3NtIHplcm8gcGFnZSBwYXRjaCBpcyBzdGFibGUgZW5vdWdoLgorICovCitzdGF0 aWMgaW5saW5lIHZvaWQgdWtzbV9idWdvbl96ZXJvcGFnZShwdGVfdCBwdGUpCit7CisJQlVHX09O KHB0ZV9wZm4ocHRlKSA9PSB1a3NtX3plcm9fcGZuKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5l IHZvaWQgdWtzbV92bWFfYWRkX25ldyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKK30K Kworc3RhdGljIGlubGluZSB2b2lkIHVrc21fcmVtb3ZlX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1 Y3QgKnZtYSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVrc21fdW5tYXBfemVyb19wYWdl KHB0ZV90IHB0ZSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVrc21fbWFwX3plcm9fcGFn ZShwdGVfdCBwdGUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1a3NtX2Nvd19wYWdlKHN0 cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKK30KKworc3Rh dGljIGlubGluZSB2b2lkIHVrc21fY293X3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwg cHRlX3QgcHRlKQoreworfQorCitzdGF0aWMgaW5saW5lIGludCB1a3NtX2ZsYWdzX2Nhbl9zY2Fu KHVuc2lnbmVkIGxvbmcgdm1fZmxhZ3MpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxp bmUgdm9pZCB1a3NtX3ZtX2ZsYWdzX21vZCh1bnNpZ25lZCBsb25nICp2bV9mbGFnc19wKQorewor fQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWtzbV9idWdvbl96ZXJvcGFnZShwdGVfdCBwdGUpCit7 Cit9CisjZW5kaWYgLyogIUNPTkZJR19VS1NNICovCisjZW5kaWYgLyogX19MSU5VWF9VS1NNX0gg Ki8KZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jCmluZGV4IDliN2Q3 NDYuLjczYWQ5MGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mb3JrLmMKKysrIGIva2VybmVsL2Zvcmsu YwpAQCAtNDEyLDcgKzQxMiw3IEBAIHN0YXRpYyBpbnQgZHVwX21tYXAoc3RydWN0IG1tX3N0cnVj dCAqbW0sIHN0cnVjdCBtbV9zdHJ1Y3QgKm9sZG1tKQogCQkJCWdvdG8gZmFpbF9ub21lbTsKIAkJ CWNoYXJnZSA9IGxlbjsKIAkJfQotCQl0bXAgPSBrbWVtX2NhY2hlX2FsbG9jKHZtX2FyZWFfY2Fj aGVwLCBHRlBfS0VSTkVMKTsKKwkJdG1wID0ga21lbV9jYWNoZV96YWxsb2Modm1fYXJlYV9jYWNo ZXAsIEdGUF9LRVJORUwpOwogCQlpZiAoIXRtcCkKIAkJCWdvdG8gZmFpbF9ub21lbTsKIAkJKnRt cCA9ICptcG50OwpAQCAtNDY3LDcgKzQ2Nyw3IEBAIHN0YXRpYyBpbnQgZHVwX21tYXAoc3RydWN0 IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBtbV9zdHJ1Y3QgKm9sZG1tKQogCQlfX3ZtYV9saW5rX3Ji KG1tLCB0bXAsIHJiX2xpbmssIHJiX3BhcmVudCk7CiAJCXJiX2xpbmsgPSAmdG1wLT52bV9yYi5y Yl9yaWdodDsKIAkJcmJfcGFyZW50ID0gJnRtcC0+dm1fcmI7Ci0KKwkJdWtzbV92bWFfYWRkX25l dyh0bXApOwogCQltbS0+bWFwX2NvdW50Kys7CiAJCXJldHZhbCA9IGNvcHlfcGFnZV9yYW5nZSht bSwgb2xkbW0sIG1wbnQpOwogCmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUgYi9saWIvTWFrZWZp bGUKaW5kZXggODQwMDBlYy4uOTMyZmNiMCAxMDA2NDQKLS0tIGEvbGliL01ha2VmaWxlCisrKyBi L2xpYi9NYWtlZmlsZQpAQCAtOCw3ICs4LDcgQEAgS0JVSUxEX0NGTEFHUyA9ICQoc3Vic3QgLXBn LCwkKE9SSUdfQ0ZMQUdTKSkKIGVuZGlmCiAKIGxpYi15IDo9IGN0eXBlLm8gc3RyaW5nLm8gdnNw cmludGYubyBjbWRsaW5lLm8gXAotCSByYnRyZWUubyByYWRpeC10cmVlLm8gZHVtcF9zdGFjay5v IHRpbWVycXVldWUub1wKKwkgcmJ0cmVlLm8gcmFkaXgtdHJlZS5vIHNyYWRpeC10cmVlLm8gZHVt cF9zdGFjay5vIHRpbWVycXVldWUub1wKIAkgaWRyLm8gaW50X3NxcnQubyBleHRhYmxlLm8gXAog CSBzaGExLm8gbWQ1Lm8gaXJxX3JlZ3MubyByZWNpcHJvY2FsX2Rpdi5vIGFyZ3Zfc3BsaXQubyBc CiAJIHByb3BvcnRpb25zLm8gZmxleF9wcm9wb3J0aW9ucy5vIHJhdGVsaW1pdC5vIHNob3dfbWVt Lm8gXApkaWZmIC0tZ2l0IGEvbGliL3NyYWRpeC10cmVlLmMgYi9saWIvc3JhZGl4LXRyZWUuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDA2MzI5Ci0tLSAvZGV2L251bGwK KysrIGIvbGliL3NyYWRpeC10cmVlLmMKQEAgLTAsMCArMSw0NzYgQEAKKyNpbmNsdWRlIDxsaW51 eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5o PgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgor I2luY2x1ZGUgPGxpbnV4L2djZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NyYWRpeC10cmVlLmg+CisK K3N0YXRpYyBpbmxpbmUgaW50IHNyYWRpeF9ub2RlX2Z1bGwoc3RydWN0IHNyYWRpeF90cmVlX3Jv b3QgKnJvb3QsIHN0cnVjdCBzcmFkaXhfdHJlZV9ub2RlICpub2RlKQoreworCXJldHVybiBub2Rl LT5mdWxscyA9PSByb290LT5zdG9yZXNfc2l6ZSB8fCAKKwkJKG5vZGUtPmhlaWdodCA9PSAxICYm IG5vZGUtPmNvdW50ID09IHJvb3QtPnN0b3Jlc19zaXplKTsKK30KKworLyoKKyAqCUV4dGVuZCBh IHNyYWRpeCB0cmVlIHNvIGl0IGNhbiBzdG9yZSBrZXkgQGluZGV4LgorICovCitzdGF0aWMgaW50 IHNyYWRpeF90cmVlX2V4dGVuZChzdHJ1Y3Qgc3JhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdW5zaWdu ZWQgbG9uZyBpbmRleCkKK3sKKwlzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9kZSAqbm9kZTsKKwl1bnNp Z25lZCBpbnQgaGVpZ2h0OworCisJaWYgKHVubGlrZWx5KHJvb3QtPnJub2RlID09IE5VTEwpKSB7 CisJCWlmICghKG5vZGUgPSByb290LT5hbGxvYygpKSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJ CW5vZGUtPmhlaWdodCA9IDE7CisJCXJvb3QtPnJub2RlID0gbm9kZTsKKwkJcm9vdC0+aGVpZ2h0 ID0gMTsKKwl9CisKKwkvKiBGaWd1cmUgb3V0IHdoYXQgdGhlIGhlaWdodCBzaG91bGQgYmUuICAq LworCWhlaWdodCA9IHJvb3QtPmhlaWdodDsKKwlpbmRleCA+Pj0gcm9vdC0+c2hpZnQgKiBoZWln aHQ7CisKKwl3aGlsZSAoaW5kZXgpIHsKKwkJaW5kZXggPj49IHJvb3QtPnNoaWZ0OworCQloZWln aHQrKzsKKwl9CisKKwl3aGlsZSAoaGVpZ2h0ID4gcm9vdC0+aGVpZ2h0KSB7CisJCXVuc2lnbmVk IGludCBuZXdoZWlnaHQ7CisJCWlmICghKG5vZGUgPSByb290LT5hbGxvYygpKSkKKwkJCXJldHVy biAtRU5PTUVNOworCisJCS8qIEluY3JlYXNlIHRoZSBoZWlnaHQuICAqLworCQlub2RlLT5zdG9y ZXNbMF0gPSByb290LT5ybm9kZTsKKwkJcm9vdC0+cm5vZGUtPnBhcmVudCA9IG5vZGU7CisJCWlm IChyb290LT5leHRlbmQpCisJCQlyb290LT5leHRlbmQobm9kZSwgcm9vdC0+cm5vZGUpOworCisJ CW5ld2hlaWdodCA9IHJvb3QtPmhlaWdodCArIDE7CisJCW5vZGUtPmhlaWdodCA9IG5ld2hlaWdo dDsKKwkJbm9kZS0+Y291bnQgPSAxOworCQlpZiAoc3JhZGl4X25vZGVfZnVsbChyb290LCByb290 LT5ybm9kZSkpCisJCQlub2RlLT5mdWxscyA9IDE7CisKKwkJcm9vdC0+cm5vZGUgPSBub2RlOwor CQlyb290LT5oZWlnaHQgPSBuZXdoZWlnaHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisg KiBTZWFyY2ggdGhlIG5leHQgaXRlbSBmcm9tIHRoZSBjdXJyZW50IG5vZGUsIHRoYXQgaXMgbm90 IE5VTEwKKyAqIGFuZCBjYW4gc2F0aWZ5IHJvb3QtPml0ZXIoKS4KKyAqLwordm9pZCAqc3JhZGl4 X3RyZWVfbmV4dChzdHJ1Y3Qgc3JhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJICAgICAgIHN0cnVj dCBzcmFkaXhfdHJlZV9ub2RlICpub2RlLCB1bnNpZ25lZCBsb25nIGluZGV4LAorCQkgICAgICAg aW50ICgqaXRlcikodm9pZCAqaXRlbSwgdW5zaWduZWQgbG9uZyBoZWlnaHQpKQoreworCXVuc2ln bmVkIGxvbmcgb2Zmc2V0OworCXZvaWQgKml0ZW07CisKKwlpZiAodW5saWtlbHkobm9kZSA9PSBO VUxMKSkgeworCQlub2RlID0gcm9vdC0+cm5vZGU7CisJCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0 IDwgcm9vdC0+c3RvcmVzX3NpemU7IG9mZnNldCsrKSB7CisJCQlpdGVtID0gbm9kZS0+c3RvcmVz W29mZnNldF07CisJCQlpZiAoaXRlbSAmJiAoIWl0ZXIgfHwgaXRlcihpdGVtLCBub2RlLT5oZWln aHQpKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmICh1bmxpa2VseShvZmZzZXQgPj0gcm9vdC0+ c3RvcmVzX3NpemUpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJaWYgKG5vZGUtPmhlaWdodCA9PSAx KQorCQkJcmV0dXJuIGl0ZW07CisJCWVsc2UKKwkJCWdvdG8gZ29fZG93bjsKKwl9CisKKwl3aGls ZSAobm9kZSkgeworCQlvZmZzZXQgPSAoaW5kZXggJiByb290LT5tYXNrKSArIDE7CQkJCQkKKwkJ Zm9yICg7b2Zmc2V0IDwgcm9vdC0+c3RvcmVzX3NpemU7IG9mZnNldCsrKSB7CisJCQlpdGVtID0g bm9kZS0+c3RvcmVzW29mZnNldF07CisJCQlpZiAoaXRlbSAmJiAoIWl0ZXIgfHwgaXRlcihpdGVt LCBub2RlLT5oZWlnaHQpKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChvZmZzZXQgPCByb290 LT5zdG9yZXNfc2l6ZSkKKwkJCWJyZWFrOworCisJCW5vZGUgPSBub2RlLT5wYXJlbnQ7CisJCWlu ZGV4ID4+PSByb290LT5zaGlmdDsKKwl9CisKKwlpZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOwor CisJd2hpbGUgKG5vZGUtPmhlaWdodCA+IDEpIHsKK2dvX2Rvd246CisJCW5vZGUgPSBpdGVtOwor CQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IHJvb3QtPnN0b3Jlc19zaXplOyBvZmZzZXQrKykg eworCQkJaXRlbSA9IG5vZGUtPnN0b3Jlc1tvZmZzZXRdOworCQkJaWYgKGl0ZW0gJiYgKCFpdGVy IHx8IGl0ZXIoaXRlbSwgbm9kZS0+aGVpZ2h0KSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAo dW5saWtlbHkob2Zmc2V0ID49IHJvb3QtPnN0b3Jlc19zaXplKSkKKwkJCXJldHVybiBOVUxMOwor CX0KKworCUJVR19PTihvZmZzZXQgPiByb290LT5zdG9yZXNfc2l6ZSk7CisKKwlyZXR1cm4gaXRl bTsKK30KKworLyoKKyAqIEJsaW5kbHkgaW5zZXJ0IHRoZSBpdGVtIHRvIHRoZSB0cmVlLiBUeXBp Y2FsbHksIHdlIHJldXNlIHRoZQorICogZmlyc3QgZW1wdHkgc3RvcmUgaXRlbS4KKyAqLworaW50 IHNyYWRpeF90cmVlX2VudGVyKHN0cnVjdCBzcmFkaXhfdHJlZV9yb290ICpyb290LCB2b2lkICoq aXRlbSwgaW50IG51bSkKK3sKKwl1bnNpZ25lZCBsb25nIGluZGV4OworCXVuc2lnbmVkIGludCBo ZWlnaHQ7CisJc3RydWN0IHNyYWRpeF90cmVlX25vZGUgKm5vZGUsICp0bXAgPSBOVUxMOworCWlu dCBvZmZzZXQsIG9mZnNldF9zYXZlZDsKKwl2b2lkICoqc3RvcmUgPSBOVUxMOworCWludCBlcnJv ciwgaSwgaiwgc2hpZnQ7CisKK2dvX29uOgorCWluZGV4ID0gcm9vdC0+bWluOworCisJaWYgKHJv b3QtPmVudGVyX25vZGUgJiYgIXNyYWRpeF9ub2RlX2Z1bGwocm9vdCwgcm9vdC0+ZW50ZXJfbm9k ZSkpIHsKKwkJbm9kZSA9IHJvb3QtPmVudGVyX25vZGU7CisJCUJVR19PTigoaW5kZXggPj4gKHJv b3QtPnNoaWZ0ICogcm9vdC0+aGVpZ2h0KSkpOworCX0gZWxzZSB7CisJCW5vZGUgPSByb290LT5y bm9kZTsKKwkJaWYgKG5vZGUgPT0gTlVMTCB8fCAoaW5kZXggPj4gKHJvb3QtPnNoaWZ0ICogcm9v dC0+aGVpZ2h0KSkKKwkJICAgIHx8IHNyYWRpeF9ub2RlX2Z1bGwocm9vdCwgbm9kZSkpIHsKKwkJ CWVycm9yID0gc3JhZGl4X3RyZWVfZXh0ZW5kKHJvb3QsIGluZGV4KTsKKwkJCWlmIChlcnJvcikK KwkJCQlyZXR1cm4gZXJyb3I7CisKKwkJCW5vZGUgPSByb290LT5ybm9kZTsKKwkJfQorCX0KKwor CisJaGVpZ2h0ID0gbm9kZS0+aGVpZ2h0OworCXNoaWZ0ID0gKGhlaWdodCAtIDEpICogcm9vdC0+ c2hpZnQ7CisJb2Zmc2V0ID0gKGluZGV4ID4+IHNoaWZ0KSAmIHJvb3QtPm1hc2s7CisJd2hpbGUg KHNoaWZ0ID4gMCkgeworCQlvZmZzZXRfc2F2ZWQgPSBvZmZzZXQ7CisJCWZvciAoOyBvZmZzZXQg PCByb290LT5zdG9yZXNfc2l6ZTsgb2Zmc2V0KyspIHsKKwkJCXN0b3JlID0gJm5vZGUtPnN0b3Jl c1tvZmZzZXRdOworCQkJdG1wID0gKnN0b3JlOworCisJCQlpZiAoIXRtcCB8fCAhc3JhZGl4X25v ZGVfZnVsbChyb290LCB0bXApKQorCQkJCWJyZWFrOworCQl9CisJCUJVR19PTihvZmZzZXQgPj0g cm9vdC0+c3RvcmVzX3NpemUpOworCisJCWlmIChvZmZzZXQgIT0gb2Zmc2V0X3NhdmVkKSB7CisJ CQlpbmRleCArPSAob2Zmc2V0IC0gb2Zmc2V0X3NhdmVkKSA8PCBzaGlmdDsKKwkJCWluZGV4ICY9 IH4oKDFVTCA8PCBzaGlmdCkgLSAxKTsKKwkJfQorCisJCWlmICghdG1wKSB7CisJCQlpZiAoISh0 bXAgPSByb290LT5hbGxvYygpKSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJdG1wLT5oZWln aHQgPSBzaGlmdCAvIHJvb3QtPnNoaWZ0OworCQkJKnN0b3JlID0gdG1wOworCQkJdG1wLT5wYXJl bnQgPSBub2RlOworCQkJbm9kZS0+Y291bnQrKzsKKy8vCQkJaWYgKHJvb3QtPmV4dGVuZCkKKy8v CQkJCXJvb3QtPmV4dGVuZChub2RlLCB0bXApOworCQl9CisKKwkJbm9kZSA9IHRtcDsKKwkJc2hp ZnQgLT0gcm9vdC0+c2hpZnQ7CisJCW9mZnNldCA9IChpbmRleCA+PiBzaGlmdCkgJiByb290LT5t YXNrOworCX0KKworCUJVR19PTihub2RlLT5oZWlnaHQgIT0gMSk7CisKKworCXN0b3JlID0gJm5v ZGUtPnN0b3Jlc1tvZmZzZXRdOworCWZvciAoaSA9IDAsIGogPSAwOworCSAgICAgIGogPCByb290 LT5zdG9yZXNfc2l6ZSAtIG5vZGUtPmNvdW50ICYmIAorCSAgICAgIGkgPCByb290LT5zdG9yZXNf c2l6ZSAtIG9mZnNldCAmJiBqIDwgbnVtOyBpKyspIHsKKwkJaWYgKCFzdG9yZVtpXSkgeworCQkJ c3RvcmVbaV0gPSBpdGVtW2pdOworCQkJaWYgKHJvb3QtPmFzc2lnbikKKwkJCQlyb290LT5hc3Np Z24obm9kZSwgaW5kZXggKyBpLCBpdGVtW2pdKTsKKwkJCWorKzsKKwkJfQorCX0KKworCW5vZGUt PmNvdW50ICs9IGo7CisJcm9vdC0+bnVtICs9IGo7CisJbnVtIC09IGo7CisKKwl3aGlsZSAoc3Jh ZGl4X25vZGVfZnVsbChyb290LCBub2RlKSkgeworCQlub2RlID0gbm9kZS0+cGFyZW50OworCQlp ZiAoIW5vZGUpCisJCQlicmVhazsKKworCQlub2RlLT5mdWxscysrOworCX0KKworCWlmICh1bmxp a2VseSghbm9kZSkpIHsKKwkJLyogQWxsIG5vZGVzIGFyZSBmdWxsICovCisJCXJvb3QtPm1pbiA9 IDEgPDwgKHJvb3QtPmhlaWdodCAqIHJvb3QtPnNoaWZ0KTsKKwkJcm9vdC0+ZW50ZXJfbm9kZSA9 IE5VTEw7CisJfSBlbHNlIHsKKwkJcm9vdC0+bWluID0gaW5kZXggKyBpIC0gMTsKKwkJcm9vdC0+ bWluIHw9ICgxVUwgPDwgKG5vZGUtPmhlaWdodCAtIDEpKSAtIDE7CisJCXJvb3QtPm1pbisrOwor CQlyb290LT5lbnRlcl9ub2RlID0gbm9kZTsKKwl9CisKKwlpZiAobnVtKSB7CisJCWl0ZW0gKz0g ajsKKwkJZ290byBnb19vbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqCXNyYWRp eF90cmVlX3NocmluayAgICAtICAgIHNocmluayBoZWlnaHQgb2YgYSBzcmFkaXggdHJlZSB0byBt aW5pbWFsCisgKiAgICAgIEByb290CQlzcmFkaXggdHJlZSByb290CisgKiAgCisgKi8KK3N0YXRp YyBpbmxpbmUgdm9pZCBzcmFkaXhfdHJlZV9zaHJpbmsoc3RydWN0IHNyYWRpeF90cmVlX3Jvb3Qg KnJvb3QpCit7CisJLyogdHJ5IHRvIHNocmluayB0cmVlIGhlaWdodCAqLworCXdoaWxlIChyb290 LT5oZWlnaHQgPiAxKSB7CisJCXN0cnVjdCBzcmFkaXhfdHJlZV9ub2RlICp0b19mcmVlID0gcm9v dC0+cm5vZGU7CisKKwkJLyoKKwkJICogVGhlIGNhbmRpZGF0ZSBub2RlIGhhcyBtb3JlIHRoYW4g b25lIGNoaWxkLCBvciBpdHMgY2hpbGQKKwkJICogaXMgbm90IGF0IHRoZSBsZWZ0bW9zdCBzdG9y ZSwgd2UgY2Fubm90IHNocmluay4KKwkJICovCisJCWlmICh0b19mcmVlLT5jb3VudCAhPSAxIHx8 ICF0b19mcmVlLT5zdG9yZXNbMF0pCisJCQlicmVhazsKKworCQlyb290LT5ybm9kZSA9IHRvX2Zy ZWUtPnN0b3Jlc1swXTsKKwkJcm9vdC0+cm5vZGUtPnBhcmVudCA9IE5VTEw7CisJCXJvb3QtPmhl aWdodC0tOworCQlpZiAodW5saWtlbHkocm9vdC0+ZW50ZXJfbm9kZSA9PSB0b19mcmVlKSkgewor CQkJcm9vdC0+ZW50ZXJfbm9kZSA9IE5VTEw7CisJCX0KKwkJcm9vdC0+ZnJlZSh0b19mcmVlKTsK Kwl9Cit9CisKKy8qCisgKiBEZWwgdGhlIGl0ZW0gb24gdGhlIGtub3duIGxlYWYgbm9kZSBhbmQg aW5kZXgKKyAqLwordm9pZCBzcmFkaXhfdHJlZV9kZWxldGVfZnJvbV9sZWFmKHN0cnVjdCBzcmFk aXhfdHJlZV9yb290ICpyb290LCAKKwkJCQkgIHN0cnVjdCBzcmFkaXhfdHJlZV9ub2RlICpub2Rl LCB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJc3RydWN0 IHNyYWRpeF90cmVlX25vZGUgKnN0YXJ0LCAqZW5kOworCisJQlVHX09OKG5vZGUtPmhlaWdodCAh PSAxKTsKKworCXN0YXJ0ID0gbm9kZTsKKwl3aGlsZSAobm9kZSAmJiAhKC0tbm9kZS0+Y291bnQp KQorCQlub2RlID0gbm9kZS0+cGFyZW50OworCisJZW5kID0gbm9kZTsKKwlpZiAoIW5vZGUpIHsK KwkJcm9vdC0+cm5vZGUgPSBOVUxMOworCQlyb290LT5oZWlnaHQgPSAwOworCQlyb290LT5taW4g PSAwOworCQlyb290LT5udW0gPSAwOworCQlyb290LT5lbnRlcl9ub2RlID0gTlVMTDsKKwl9IGVs c2UgeworCQlvZmZzZXQgPSAoaW5kZXggPj4gKHJvb3QtPnNoaWZ0ICogKG5vZGUtPmhlaWdodCAt IDEpKSkgJiByb290LT5tYXNrOworCQlpZiAocm9vdC0+cm0pCisJCQlyb290LT5ybShub2RlLCBv ZmZzZXQpOworCQlub2RlLT5zdG9yZXNbb2Zmc2V0XSA9IE5VTEw7CisJCXJvb3QtPm51bS0tOwor CQlpZiAocm9vdC0+bWluID4gaW5kZXgpIHsKKwkJCXJvb3QtPm1pbiA9IGluZGV4OworCQkJcm9v dC0+ZW50ZXJfbm9kZSA9IG5vZGU7CisJCX0KKwl9CisKKwlpZiAoc3RhcnQgIT0gZW5kKSB7CisJ CWRvIHsKKwkJCW5vZGUgPSBzdGFydDsKKwkJCXN0YXJ0ID0gc3RhcnQtPnBhcmVudDsKKwkJCWlm ICh1bmxpa2VseShyb290LT5lbnRlcl9ub2RlID09IG5vZGUpKQorCQkJCXJvb3QtPmVudGVyX25v ZGUgPSBlbmQ7CisJCQlyb290LT5mcmVlKG5vZGUpOworCQl9IHdoaWxlIChzdGFydCAhPSBlbmQp OworCisJCS8qCisJCSAqIE5vdGUgdGhhdCBzaHJpbmsgbWF5IGZyZWUgImVuZCIsIHNvIGVudGVy X25vZGUgc3RpbGwgbmVlZCB0bworCQkgKiBiZSBjaGVja2VkIGluc2lkZS4KKwkJICovCisJCXNy YWRpeF90cmVlX3Nocmluayhyb290KTsKKwl9IGVsc2UgaWYgKG5vZGUtPmNvdW50ID09IHJvb3Qt PnN0b3Jlc19zaXplIC0gMSkgeworCQkvKiBJdCBXQVMgYSBmdWxsIGxlYWYgbm9kZS4gVXBkYXRl IHRoZSBhbmNlc3RvcnMgKi8KKwkJbm9kZSA9IG5vZGUtPnBhcmVudDsKKwkJd2hpbGUgKG5vZGUp IHsKKwkJCW5vZGUtPmZ1bGxzLS07CisJCQlpZiAobm9kZS0+ZnVsbHMgIT0gcm9vdC0+c3RvcmVz X3NpemUgLSAxKQorCQkJCWJyZWFrOworCisJCQlub2RlID0gbm9kZS0+cGFyZW50OworCQl9CisJ fQorfQorCit2b2lkICpzcmFkaXhfdHJlZV9sb29rdXAoc3RydWN0IHNyYWRpeF90cmVlX3Jvb3Qg KnJvb3QsIHVuc2lnbmVkIGxvbmcgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IGhlaWdodCwgb2Zm c2V0OworCXN0cnVjdCBzcmFkaXhfdHJlZV9ub2RlICpub2RlOworCWludCBzaGlmdDsKKworCW5v ZGUgPSByb290LT5ybm9kZTsKKwlpZiAobm9kZSA9PSBOVUxMIHx8IChpbmRleCA+PiAocm9vdC0+ c2hpZnQgKiByb290LT5oZWlnaHQpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwloZWlnaHQgPSByb290 LT5oZWlnaHQ7CisJc2hpZnQgPSAoaGVpZ2h0IC0gMSkgKiByb290LT5zaGlmdDsKKworCWRvIHsK KwkJb2Zmc2V0ID0gKGluZGV4ID4+IHNoaWZ0KSAmIHJvb3QtPm1hc2s7CisJCW5vZGUgPSBub2Rl LT5zdG9yZXNbb2Zmc2V0XTsKKwkJaWYgKCFub2RlKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJc2hp ZnQgLT0gcm9vdC0+c2hpZnQ7CisJfSB3aGlsZSAoc2hpZnQgPj0gMCk7CisKKwlyZXR1cm4gbm9k ZTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgaXRlbSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBj cmVhdGUgaXQgaW4gcGxhY2UKKyAqIGFuZCByZXR1cm4gdGhlIGNyZWF0ZWQgaXRlbS4KKyAqLwor dm9pZCAqc3JhZGl4X3RyZWVfbG9va3VwX2NyZWF0ZShzdHJ1Y3Qgc3JhZGl4X3RyZWVfcm9vdCAq cm9vdCwgCisJCQl1bnNpZ25lZCBsb25nIGluZGV4LCB2b2lkICooKml0ZW1fYWxsb2MpKHZvaWQp KQoreworCXVuc2lnbmVkIGludCBoZWlnaHQsIG9mZnNldDsKKwlzdHJ1Y3Qgc3JhZGl4X3RyZWVf bm9kZSAqbm9kZSwgKnRtcDsKKwl2b2lkICppdGVtOworCWludCBzaGlmdCwgZXJyb3I7CisKKwlp ZiAocm9vdC0+cm5vZGUgPT0gTlVMTCB8fCAoaW5kZXggPj4gKHJvb3QtPnNoaWZ0ICogcm9vdC0+ aGVpZ2h0KSkpIHsKKwkJaWYgKGl0ZW1fYWxsb2MpIHsKKwkJCWVycm9yID0gc3JhZGl4X3RyZWVf ZXh0ZW5kKHJvb3QsIGluZGV4KTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJ fSBlbHNlIHsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJbm9kZSA9IHJvb3QtPnJub2Rl OworCWhlaWdodCA9IHJvb3QtPmhlaWdodDsKKwlzaGlmdCA9IChoZWlnaHQgLSAxKSAqIHJvb3Qt PnNoaWZ0OworCisJZG8geworCQlvZmZzZXQgPSAoaW5kZXggPj4gc2hpZnQpICYgcm9vdC0+bWFz azsKKwkJaWYgKCFub2RlLT5zdG9yZXNbb2Zmc2V0XSkgeworCQkJaWYgKCEodG1wID0gcm9vdC0+ YWxsb2MoKSkpCisJCQkJcmV0dXJuIE5VTEw7CisKKwkJCXRtcC0+aGVpZ2h0ID0gc2hpZnQgLyBy b290LT5zaGlmdDsKKwkJCW5vZGUtPnN0b3Jlc1tvZmZzZXRdID0gdG1wOworCQkJdG1wLT5wYXJl bnQgPSBub2RlOworCQkJbm9kZS0+Y291bnQrKzsKKwkJCW5vZGUgPSB0bXA7CisJCX0gZWxzZSB7 CisJCQlub2RlID0gbm9kZS0+c3RvcmVzW29mZnNldF07CisJCX0KKworCQlzaGlmdCAtPSByb290 LT5zaGlmdDsKKwl9IHdoaWxlIChzaGlmdCA+IDApOworCisJQlVHX09OKG5vZGUtPmhlaWdodCAh PSAxKTsKKwlvZmZzZXQgPSBpbmRleCAmIHJvb3QtPm1hc2s7CisJaWYgKG5vZGUtPnN0b3Jlc1tv ZmZzZXRdKSB7CisJCXJldHVybiBub2RlLT5zdG9yZXNbb2Zmc2V0XTsKKwl9IGVsc2UgaWYgKGl0 ZW1fYWxsb2MpIHsKKwkJaWYgKCEoaXRlbSA9IGl0ZW1fYWxsb2MoKSkpCisJCQlyZXR1cm4gTlVM TDsKKworCQlub2RlLT5zdG9yZXNbb2Zmc2V0XSA9IGl0ZW07CisKKwkJLyoKKwkJICogTk9URTog d2UgZG8gTk9UIGNhbGwgcm9vdC0+YXNzaWduIGhlcmUsIHNpbmNlIHRoaXMgaXRlbSBpcworCQkg KiBuZXdseSBjcmVhdGVkIGJ5IHVzIGhhdmluZyBubyBtZWFuaW5nLiBDYWxsZXIgY2FuIGNhbGwg dGhpcworCQkgKiBpZiBpdCdzIG5lY2Vzc2FyeSB0byBkbyBzby4KKwkJICovCisKKwkJbm9kZS0+ Y291bnQrKzsKKwkJcm9vdC0+bnVtKys7CisKKwkJd2hpbGUgKHNyYWRpeF9ub2RlX2Z1bGwocm9v dCwgbm9kZSkpIHsKKwkJCW5vZGUgPSBub2RlLT5wYXJlbnQ7CisJCQlpZiAoIW5vZGUpCisJCQkJ YnJlYWs7CisKKwkJCW5vZGUtPmZ1bGxzKys7CisJCX0KKworCQlpZiAodW5saWtlbHkoIW5vZGUp KSB7CisJCQkvKiBBbGwgbm9kZXMgYXJlIGZ1bGwgKi8KKwkJCXJvb3QtPm1pbiA9IDEgPDwgKHJv b3QtPmhlaWdodCAqIHJvb3QtPnNoaWZ0KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChyb290LT5taW4g PT0gaW5kZXgpIHsKKwkJCQlyb290LT5taW4gfD0gKDFVTCA8PCAobm9kZS0+aGVpZ2h0IC0gMSkp IC0gMTsKKwkJCQlyb290LT5taW4rKzsKKwkJCQlyb290LT5lbnRlcl9ub2RlID0gbm9kZTsKKwkJ CX0KKwkJfQorCisJCXJldHVybiBpdGVtOworCX0gZWxzZSB7CisJCXJldHVybiBOVUxMOworCX0K KworfQorCitpbnQgc3JhZGl4X3RyZWVfZGVsZXRlKHN0cnVjdCBzcmFkaXhfdHJlZV9yb290ICpy b290LCB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXVuc2lnbmVkIGludCBoZWlnaHQsIG9mZnNl dDsKKwlzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9kZSAqbm9kZTsKKwlpbnQgc2hpZnQ7CisKKwlub2Rl ID0gcm9vdC0+cm5vZGU7CisJaWYgKG5vZGUgPT0gTlVMTCB8fCAoaW5kZXggPj4gKHJvb3QtPnNo aWZ0ICogcm9vdC0+aGVpZ2h0KSkpCisJCXJldHVybiAtRU5PRU5UOworCisJaGVpZ2h0ID0gcm9v dC0+aGVpZ2h0OworCXNoaWZ0ID0gKGhlaWdodCAtIDEpICogcm9vdC0+c2hpZnQ7CisKKwlkbyB7 CisJCW9mZnNldCA9IChpbmRleCA+PiBzaGlmdCkgJiByb290LT5tYXNrOworCQlub2RlID0gbm9k ZS0+c3RvcmVzW29mZnNldF07CisJCWlmICghbm9kZSkKKwkJCXJldHVybiAtRU5PRU5UOworCisJ CXNoaWZ0IC09IHJvb3QtPnNoaWZ0OworCX0gd2hpbGUgKHNoaWZ0ID4gMCk7CisKKwlvZmZzZXQg PSBpbmRleCAmIHJvb3QtPm1hc2s7CisJaWYgKCFub2RlLT5zdG9yZXNbb2Zmc2V0XSkKKwkJcmV0 dXJuIC1FTk9FTlQ7CisKKwlzcmFkaXhfdHJlZV9kZWxldGVfZnJvbV9sZWFmKHJvb3QsIG5vZGUs IGluZGV4KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZyBiL21tL0tj b25maWcKaW5kZXggMWQxYWU2Yi4uNTExZGRlNiAxMDA2NDQKLS0tIGEvbW0vS2NvbmZpZworKysg Yi9tbS9LY29uZmlnCkBAIC0zMzksNiArMzM5LDMyIEBAIGNvbmZpZyBLU00KIAkgIFNlZSBEb2N1 bWVudGF0aW9uL3ZtL2tzbS50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb246IEtTTSBpcyBpbmFjdGl2 ZQogCSAgdW50aWwgYSBwcm9ncmFtIGhhcyBtYWR2aXNlZCB0aGF0IGFuIGFyZWEgaXMgTUFEVl9N RVJHRUFCTEUsIGFuZAogCSAgcm9vdCBoYXMgc2V0IC9zeXMva2VybmVsL21tL2tzbS9ydW4gdG8g MSAoaWYgQ09ORklHX1NZU0ZTIGlzIHNldCkuCitjaG9pY2UKKwlwcm9tcHQgIkNob29zZSBVS1NN L0tTTSBzdHJhdGVneSIKKwlkZWZhdWx0IFVLU00KKwlkZXBlbmRzIG9uIEtTTQorCWhlbHAKKwkg IFRoaXMgb3B0aW9uIGFsbG93cyB0byBzZWxlY3QgYSBVS1NNL0tTTSBzdHJhZ2V0eS4KKworY29u ZmlnIFVLU00KKwlib29sICJVbHRyYS1LU00gZm9yIHBhZ2UgbWVyZ2luZyIKKwlkZXBlbmRzIG9u IEtTTQorCWhlbHAKKwlVS1NNIGlzIGluc3BpcmVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgcHJvamVj dCBcdTIwMTQgS1NNKEtlcm5lbCBTYW1lCisJcGFnZSBNZXJnaW5nKSwgYnV0IHdpdGggYSBmdW5k YW1lbnRhbGx5IHJld3JpdHRlbiBjb3JlIGFsZ29yaXRobS4gV2l0aAorCWFuIGFkdmFuY2VkIGFs Z29yaXRobSwgVUtTTSBub3cgY2FuIHRyYW5zcGFyZW50bHkgc2NhbnMgYWxsIGFub255bW91c2x5 CisJbWFwcGVkIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIHdpdGggYW4gc2lnbmlmaWNhbnRseSBp bXByb3ZlZCBzY2FuIHNwZWVkCisJYW5kIENQVSBlZmZpY2llbmN5LiBTaW5jZSBLVk0gaXMgZnJp ZW5kbHkgdG8gS1NNLCBLVk0gY2FuIGFsc28gYmVuZWZpdCBmcm9tCisJVUtTTS4gTm93IFVLU00g aGFzIGl0cyBmaXJzdCBzdGFibGUgcmVsZWFzZSBhbmQgZmlyc3QgcmVhbCB3b3JsZCBlbnRlcnBy aXNlIHVzZXIuCisJRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBnb3RvIGl0cyBwcm9qZWN0 IHBhZ2UuCisJKHd3dy5rZXJuZWxkZWR1cC5vcmcpCisKK2NvbmZpZyBLU01fTEVHQUNZCisJYm9v bCAiTGVnYWN5IEtTTSBpbXBsZW1lbnRhdGlvbiIKKwlkZXBlbmRzIG9uIEtTTQorCWhlbHAKKwlU aGUgbGVnYWN5IEtTTSBpbXBsZW1lbnRhdGlvbiBmcm9tIFJlZGhhdC4KK2VuZGNob2ljZQogCiBj b25maWcgREVGQVVMVF9NTUFQX01JTl9BRERSCiAgICAgICAgIGludCAiTG93IGFkZHJlc3Mgc3Bh Y2UgdG8gcHJvdGVjdCBmcm9tIHVzZXIgYWxsb2NhdGlvbiIKZGlmZiAtLWdpdCBhL21tL01ha2Vm aWxlIGIvbW0vTWFrZWZpbGUKaW5kZXggZTI1OWM1ZC4uMmYxN2ZmNSAxMDA2NDQKLS0tIGEvbW0v TWFrZWZpbGUKKysrIGIvbW0vTWFrZWZpbGUKQEAgLTQ0LDcgKzQ0LDggQEAgb2JqLSQoQ09ORklH X1NQQVJTRU1FTSkJKz0gc3BhcnNlLm8KIG9iai0kKENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUCkg Kz0gc3BhcnNlLXZtZW1tYXAubwogb2JqLSQoQ09ORklHX1NMT0IpICs9IHNsb2Iubwogb2JqLSQo Q09ORklHX01NVV9OT1RJRklFUikgKz0gbW11X25vdGlmaWVyLm8KLW9iai0kKENPTkZJR19LU00p ICs9IGtzbS5vCitvYmotJChDT05GSUdfS1NNX0xFR0FDWSkgKz0ga3NtLm8KK29iai0kKENPTkZJ R19VS1NNKSArPSB1a3NtLm8KIG9iai0kKENPTkZJR19QQUdFX1BPSVNPTklORykgKz0gZGVidWct cGFnZWFsbG9jLm8KIG9iai0kKENPTkZJR19TTEFCKSArPSBzbGFiLm8KIG9iai0kKENPTkZJR19T TFVCKSArPSBzbHViLm8KZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5k ZXggNjRmODJhYS4uNmRhMWYyOCAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVt b3J5LmMKQEAgLTExOCw2ICsxMTgsMjcgQEAgX19zZXR1cCgibm9yYW5kbWFwcyIsIGRpc2FibGVf cmFuZG1hcHMpOwogdW5zaWduZWQgbG9uZyB6ZXJvX3BmbiBfX3JlYWRfbW9zdGx5OwogdW5zaWdu ZWQgbG9uZyBoaWdoZXN0X21lbW1hcF9wZm4gX19yZWFkX21vc3RseTsKIAorI2lmZGVmIENPTkZJ R19VS1NNCit1bnNpZ25lZCBsb25nIHVrc21femVyb19wZm4gX19yZWFkX21vc3RseTsKK3N0cnVj dCBwYWdlICplbXB0eV91a3NtX3plcm9fcGFnZTsKKworc3RhdGljIGludCBfX2luaXQgc2V0dXBf dWtzbV96ZXJvX3BhZ2Uodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJYWRkciA9IF9f Z2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIDApOworCWlmICghYWRkcikK KwkJcGFuaWMoIk9oIGJveSwgdGhhdCBlYXJseSBvdXQgb2YgbWVtb3J5PyIpOworCisJZW1wdHlf dWtzbV96ZXJvX3BhZ2UgPSB2aXJ0X3RvX3BhZ2UoKHZvaWQgKikgYWRkcik7CisJU2V0UGFnZVJl c2VydmVkKGVtcHR5X3Vrc21femVyb19wYWdlKTsKKworCXVrc21femVyb19wZm4gPSBwYWdlX3Rv X3BmbihlbXB0eV91a3NtX3plcm9fcGFnZSk7CisKKwlyZXR1cm4gMDsKK30KK2NvcmVfaW5pdGNh bGwoc2V0dXBfdWtzbV96ZXJvX3BhZ2UpOworI2VuZGlmCisKIEVYUE9SVF9TWU1CT0woemVyb19w Zm4pOwogCiAvKgpAQCAtMTMxLDYgKzE1Miw3IEBAIHN0YXRpYyBpbnQgX19pbml0IGluaXRfemVy b19wZm4odm9pZCkKIGNvcmVfaW5pdGNhbGwoaW5pdF96ZXJvX3Bmbik7CiAKIAorCiAjaWYgZGVm aW5lZChTUExJVF9SU1NfQ09VTlRJTkcpCiAKIHZvaWQgc3luY19tbV9yc3Moc3RydWN0IG1tX3N0 cnVjdCAqbW0pCkBAIC04NzgsNiArOTAwLDExIEBAIGNvcHlfb25lX3B0ZShzdHJ1Y3QgbW1fc3Ry dWN0ICpkc3RfbW0sIHN0cnVjdCBtbV9zdHJ1Y3QgKnNyY19tbSwKIAkJCXJzc1tNTV9BTk9OUEFH RVNdKys7CiAJCWVsc2UKIAkJCXJzc1tNTV9GSUxFUEFHRVNdKys7CisKKwkJLyogU2hvdWxkIHJl dHVybiBOVUxMIGluIHZtX25vcm1hbF9wYWdlKCkgKi8KKwkJdWtzbV9idWdvbl96ZXJvcGFnZShw dGUpOworCX0gZWxzZSB7CisJCXVrc21fbWFwX3plcm9fcGFnZShwdGUpOwogCX0KIAogb3V0X3Nl dF9wdGU6CkBAIC0xMTIwLDggKzExNDcsMTAgQEAgYWdhaW46CiAJCQlwdGVudCA9IHB0ZXBfZ2V0 X2FuZF9jbGVhcl9mdWxsKG1tLCBhZGRyLCBwdGUsCiAJCQkJCQkJdGxiLT5mdWxsbW0pOwogCQkJ dGxiX3JlbW92ZV90bGJfZW50cnkodGxiLCBwdGUsIGFkZHIpOwotCQkJaWYgKHVubGlrZWx5KCFw YWdlKSkKKwkJCWlmICh1bmxpa2VseSghcGFnZSkpIHsKKwkJCQl1a3NtX3VubWFwX3plcm9fcGFn ZShwdGVudCk7CiAJCQkJY29udGludWU7CisJCQl9CiAJCQlpZiAodW5saWtlbHkoZGV0YWlscykg JiYgZGV0YWlscy0+bm9ubGluZWFyX3ZtYQogCQkJICAgICYmIGxpbmVhcl9wYWdlX2luZGV4KGRl dGFpbHMtPm5vbmxpbmVhcl92bWEsCiAJCQkJCQlhZGRyKSAhPSBwYWdlLT5pbmRleCkgewpAQCAt MTk4Miw4ICsyMDExLDEwIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3dfdXNlcl9wYWdlKHN0cnVj dCBwYWdlICpkc3QsIHN0cnVjdCBwYWdlICpzcmMsIHVuc2lnbmVkIGxvCiAJCQljbGVhcl9wYWdl KGthZGRyKTsKIAkJa3VubWFwX2F0b21pYyhrYWRkcik7CiAJCWZsdXNoX2RjYWNoZV9wYWdlKGRz dCk7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJY29weV91c2VyX2hpZ2hwYWdlKGRzdCwgc3JjLCB2 YSwgdm1hKTsKKwkJdWtzbV9jb3dfcGFnZSh2bWEsIHNyYyk7CisJfQogfQogCiAvKgpAQCAtMjE5 Nyw2ICsyMjI4LDcgQEAgZ290dGVuOgogCQluZXdfcGFnZSA9IGFsbG9jX3plcm9lZF91c2VyX2hp Z2hwYWdlX21vdmFibGUodm1hLCBhZGRyZXNzKTsKIAkJaWYgKCFuZXdfcGFnZSkKIAkJCWdvdG8g b29tOworCQl1a3NtX2Nvd19wdGUodm1hLCBvcmlnX3B0ZSk7CiAJfSBlbHNlIHsKIAkJbmV3X3Bh Z2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVJfTU9WQUJMRSwgdm1hLCBhZGRyZXNzKTsK IAkJaWYgKCFuZXdfcGFnZSkKQEAgLTIyMjIsOCArMjI1NCwxMSBAQCBnb3R0ZW46CiAJCQkJZGVj X21tX2NvdW50ZXJfZmFzdChtbSwgTU1fRklMRVBBR0VTKTsKIAkJCQlpbmNfbW1fY291bnRlcl9m YXN0KG1tLCBNTV9BTk9OUEFHRVMpOwogCQkJfQotCQl9IGVsc2UKKwkJCXVrc21fYnVnb25femVy b3BhZ2Uob3JpZ19wdGUpOworCQl9IGVsc2UgeworCQkJdWtzbV91bm1hcF96ZXJvX3BhZ2Uob3Jp Z19wdGUpOwogCQkJaW5jX21tX2NvdW50ZXJfZmFzdChtbSwgTU1fQU5PTlBBR0VTKTsKKwkJfQog CQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkcmVzcywgcHRlX3BmbihvcmlnX3B0ZSkpOwogCQll bnRyeSA9IG1rX3B0ZShuZXdfcGFnZSwgdm1hLT52bV9wYWdlX3Byb3QpOwogCQllbnRyeSA9IG1h eWJlX21rd3JpdGUocHRlX21rZGlydHkoZW50cnkpLCB2bWEpOwpkaWZmIC0tZ2l0IGEvbW0vbW1h cC5jIGIvbW0vbW1hcC5jCmluZGV4IGVkMTFiNDMuLjllODczODMgMTAwNjQ0Ci0tLSBhL21tL21t YXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9u b3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgogI2luY2x1ZGUgPGxpbnV4L3By aW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L2tzbS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3Mu aD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtMjc5LDYgKzI4MCw3IEBAIHN0YXRp YyBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnJlbW92ZV92bWEoc3RydWN0IHZtX2FyZWFfc3RydWN0 ICp2bWEpCiAJaWYgKHZtYS0+dm1fZmlsZSkKIAkJZnB1dCh2bWEtPnZtX2ZpbGUpOwogCW1wb2xf cHV0KHZtYV9wb2xpY3kodm1hKSk7CisJdWtzbV9yZW1vdmVfdm1hKHZtYSk7CiAJa21lbV9jYWNo ZV9mcmVlKHZtX2FyZWFfY2FjaGVwLCB2bWEpOwogCXJldHVybiBuZXh0OwogfQpAQCAtNzM5LDkg Kzc0MSwxNiBAQCBpbnQgdm1hX2FkanVzdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5z aWduZWQgbG9uZyBzdGFydCwKIAlsb25nIGFkanVzdF9uZXh0ID0gMDsKIAlpbnQgcmVtb3ZlX25l eHQgPSAwOwogCisvKgorICogdG8gYXZvaWQgZGVhZGxvY2ssIGtzbV9yZW1vdmVfdm1hIG11c3Qg YmUgZG9uZSBiZWZvcmUgYW55IHNwaW5fbG9jayBpcworICogYWNxdWlyZWQKKyAqLworCXVrc21f cmVtb3ZlX3ZtYSh2bWEpOworCiAJaWYgKG5leHQgJiYgIWluc2VydCkgewogCQlzdHJ1Y3Qgdm1f YXJlYV9zdHJ1Y3QgKmV4cG9ydGVyID0gTlVMTDsKIAorCQl1a3NtX3JlbW92ZV92bWEobmV4dCk7 CiAJCWlmIChlbmQgPj0gbmV4dC0+dm1fZW5kKSB7CiAJCQkvKgogCQkJICogdm1hIGV4cGFuZHMs IG92ZXJsYXBwaW5nIGFsbCB0aGUgbmV4dCwgYW5kCkBAIC04MzUsNiArODQ0LDcgQEAgYWdhaW46 CQkJcmVtb3ZlX25leHQgPSAxICsgKGVuZCA+IG5leHQtPnZtX2VuZCk7CiAJCWVuZF9jaGFuZ2Vk ID0gdHJ1ZTsKIAl9CiAJdm1hLT52bV9wZ29mZiA9IHBnb2ZmOworCiAJaWYgKGFkanVzdF9uZXh0 KSB7CiAJCW5leHQtPnZtX3N0YXJ0ICs9IGFkanVzdF9uZXh0IDw8IFBBR0VfU0hJRlQ7CiAJCW5l eHQtPnZtX3Bnb2ZmICs9IGFkanVzdF9uZXh0OwpAQCAtOTA1LDE2ICs5MTUsMjIgQEAgYWdhaW46 CQkJcmVtb3ZlX25leHQgPSAxICsgKGVuZCA+IG5leHQtPnZtX2VuZCk7CiAJCSAqIHVwIHRoZSBj b2RlIHRvbyBtdWNoIHRvIGRvIGJvdGggaW4gb25lIGdvLgogCQkgKi8KIAkJbmV4dCA9IHZtYS0+ dm1fbmV4dDsKLQkJaWYgKHJlbW92ZV9uZXh0ID09IDIpCisJCWlmIChyZW1vdmVfbmV4dCA9PSAy KSB7CisJCQl1a3NtX3JlbW92ZV92bWEobmV4dCk7CiAJCQlnb3RvIGFnYWluOwotCQllbHNlIGlm IChuZXh0KQorCQl9IGVsc2UgaWYgKG5leHQpIHsKIAkJCXZtYV9nYXBfdXBkYXRlKG5leHQpOwot CQllbHNlCisJCX0gZWxzZSB7CiAJCQltbS0+aGlnaGVzdF92bV9lbmQgPSBlbmQ7CisJCX0KKwl9 IGVsc2UgeworCQlpZiAobmV4dCAmJiAhaW5zZXJ0KQorCQkJdWtzbV92bWFfYWRkX25ldyhuZXh0 KTsKIAl9CiAJaWYgKGluc2VydCAmJiBmaWxlKQogCQl1cHJvYmVfbW1hcChpbnNlcnQpOwogCisJ dWtzbV92bWFfYWRkX25ldyh2bWEpOwogCXZhbGlkYXRlX21tKG1tKTsKIAogCXJldHVybiAwOwpA QCAtMTMwNyw2ICsxMzIzLDkgQEAgdW5zaWduZWQgbG9uZyBkb19tbWFwX3Bnb2ZmKHN0cnVjdCBm aWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJdm1fZmxhZ3MgPSBjYWxjX3ZtX3Byb3Rf Yml0cyhwcm90KSB8IGNhbGNfdm1fZmxhZ19iaXRzKGZsYWdzKSB8CiAJCQltbS0+ZGVmX2ZsYWdz IHwgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQzsKIAorCS8qIElmIHVrc20g aXMgZW5hYmxlZCwgd2UgYWRkIFZNX01FUkdBQkxFIHRvIG5ldyBWTUFzLiAqLworCXVrc21fdm1f ZmxhZ3NfbW9kKCZ2bV9mbGFncyk7CisKIAlpZiAoZmxhZ3MgJiBNQVBfTE9DS0VEKQogCQlpZiAo IWNhbl9kb19tbG9jaygpKQogCQkJcmV0dXJuIC1FUEVSTTsKQEAgLTE2NDgsNiArMTY2Nyw3IEBA IG11bm1hcF9iYWNrOgogCQkJYWxsb3dfd3JpdGVfYWNjZXNzKGZpbGUpOwogCX0KIAlmaWxlID0g dm1hLT52bV9maWxlOworCXVrc21fdm1hX2FkZF9uZXcodm1hKTsKIG91dDoKIAlwZXJmX2V2ZW50 X21tYXAodm1hKTsKIApAQCAtMTY4OSw2ICsxNzA5LDcgQEAgYWxsb3dfd3JpdGVfYW5kX2ZyZWVf dm1hOgogCWlmICh2bV9mbGFncyAmIFZNX0RFTllXUklURSkKIAkJYWxsb3dfd3JpdGVfYWNjZXNz KGZpbGUpOwogZnJlZV92bWE6CisJdWtzbV9yZW1vdmVfdm1hKHZtYSk7CiAJa21lbV9jYWNoZV9m cmVlKHZtX2FyZWFfY2FjaGVwLCB2bWEpOwogdW5hY2N0X2Vycm9yOgogCWlmIChjaGFyZ2VkKQpA QCAtMjQ4NCw2ICsyNTA1LDggQEAgc3RhdGljIGludCBfX3NwbGl0X3ZtYShzdHJ1Y3QgbW1fc3Ry dWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJZWxzZQogCQllcnIgPSB2bWFf YWRqdXN0KHZtYSwgdm1hLT52bV9zdGFydCwgYWRkciwgdm1hLT52bV9wZ29mZiwgbmV3KTsKIAor CXVrc21fdm1hX2FkZF9uZXcobmV3KTsKKwogCS8qIFN1Y2Nlc3MuICovCiAJaWYgKCFlcnIpCiAJ CXJldHVybiAwOwpAQCAtMjcxOSw2ICsyNzQyLDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9f YnJrKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCiAJCXJldHVybiBhZGRy OwogCiAJZmxhZ3MgPSBWTV9EQVRBX0RFRkFVTFRfRkxBR1MgfCBWTV9BQ0NPVU5UIHwgbW0tPmRl Zl9mbGFnczsKKwl1a3NtX3ZtX2ZsYWdzX21vZCgmZmxhZ3MpOwogCiAJZXJyb3IgPSBnZXRfdW5t YXBwZWRfYXJlYShOVUxMLCBhZGRyLCBsZW4sIDAsIE1BUF9GSVhFRCk7CiAJaWYgKGVycm9yICYg flBBR0VfTUFTSykKQEAgLTI3NzcsNiArMjgwMSw3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRv X2Jyayh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQogCXZtYS0+dm1fZmxh Z3MgPSBmbGFnczsKIAl2bWEtPnZtX3BhZ2VfcHJvdCA9IHZtX2dldF9wYWdlX3Byb3QoZmxhZ3Mp OwogCXZtYV9saW5rKG1tLCB2bWEsIHByZXYsIHJiX2xpbmssIHJiX3BhcmVudCk7CisJdWtzbV92 bWFfYWRkX25ldyh2bWEpOwogb3V0OgogCXBlcmZfZXZlbnRfbW1hcCh2bWEpOwogCW1tLT50b3Rh bF92bSArPSBsZW4gPj4gUEFHRV9TSElGVDsKQEAgLTI4MTIsNiArMjgzNywxMiBAQCB2b2lkIGV4 aXRfbW1hcChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIAkvKiBtbSdzIGxhc3QgdXNlciBoYXMgZ29u ZSwgYW5kIGl0cyBhYm91dCB0byBiZSBwdWxsZWQgZG93biAqLwogCW1tdV9ub3RpZmllcl9yZWxl YXNlKG1tKTsKIAorCS8qCisJICogVGFraW5nIHdyaXRlIGxvY2sgb24gbW1hcF9zZW0gZG9lcyBu b3QgaGFybSBvdGhlcnMsCisJICogYnV0IGl0J3MgY3J1Y2lhbCBmb3IgdWtzbSB0byBhdm9pZCBy YWNlcy4KKwkgKi8KKwlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCiAJaWYgKG1tLT5sb2Nr ZWRfdm0pIHsKIAkJdm1hID0gbW0tPm1tYXA7CiAJCXdoaWxlICh2bWEpIHsKQEAgLTI4NDgsNiAr Mjg3OSwxMSBAQCB2b2lkIGV4aXRfbW1hcChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIAl9CiAJdm1f dW5hY2N0X21lbW9yeShucl9hY2NvdW50ZWQpOwogCisJbW0tPm1tYXAgPSBOVUxMOworCW1tLT5t bV9yYiA9IFJCX1JPT1Q7CisJdm1hY2FjaGVfaW52YWxpZGF0ZShtbSk7CisJdXBfd3JpdGUoJm1t LT5tbWFwX3NlbSk7CisKIAlXQVJOX09OKGF0b21pY19sb25nX3JlYWQoJm1tLT5ucl9wdGVzKSA+ CiAJCQkoRklSU1RfVVNFUl9BRERSRVNTK1BNRF9TSVpFLTEpPj5QTURfU0hJRlQpOwogfQpAQCAt Mjk1Niw2ICsyOTkyLDcgQEAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpjb3B5X3ZtYShzdHJ1Y3Qg dm1fYXJlYV9zdHJ1Y3QgKip2bWFwLAogCQkJCW5ld192bWEtPnZtX29wcy0+b3BlbihuZXdfdm1h KTsKIAkJCXZtYV9saW5rKG1tLCBuZXdfdm1hLCBwcmV2LCByYl9saW5rLCByYl9wYXJlbnQpOwog CQkJKm5lZWRfcm1hcF9sb2NrcyA9IGZhbHNlOworCQkJdWtzbV92bWFfYWRkX25ldyhuZXdfdm1h KTsKIAkJfQogCX0KIAlyZXR1cm4gbmV3X3ZtYTsKQEAgLTMwNjksMTAgKzMxMDYsMTAgQEAgc3Rh dGljIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqX19pbnN0YWxsX3NwZWNpYWxfbWFwcGluZygKIAly ZXQgPSBpbnNlcnRfdm1fc3RydWN0KG1tLCB2bWEpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0Owot CiAJbW0tPnRvdGFsX3ZtICs9IGxlbiA+PiBQQUdFX1NISUZUOwogCiAJcGVyZl9ldmVudF9tbWFw KHZtYSk7CisJdWtzbV92bWFfYWRkX25ldyh2bWEpOwogCiAJcmV0dXJuIHZtYTsKIApkaWZmIC0t Z2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jCmluZGV4IDExNmE1MDUuLjhmM2NhZjIgMTAwNjQ0 Ci0tLSBhL21tL3JtYXAuYworKysgYi9tbS9ybWFwLmMKQEAgLTkwNiw5ICs5MDYsOSBAQCB2b2lk IHBhZ2VfbW92ZV9hbm9uX3JtYXAoc3RydWN0IHBhZ2UgKnBhZ2UsCiAKIC8qKgogICogX19wYWdl X3NldF9hbm9uX3JtYXAgLSBzZXQgdXAgbmV3IGFub255bW91cyBybWFwCi0gKiBAcGFnZToJUGFn ZSB0byBhZGQgdG8gcm1hcAkKKyAqIEBwYWdlOglQYWdlIHRvIGFkZCB0byBybWFwCiAgKiBAdm1h OglWTSBhcmVhIHRvIGFkZCBwYWdlIHRvLgotICogQGFkZHJlc3M6CVVzZXIgdmlydHVhbCBhZGRy ZXNzIG9mIHRoZSBtYXBwaW5nCQorICogQGFkZHJlc3M6CVVzZXIgdmlydHVhbCBhZGRyZXNzIG9m IHRoZSBtYXBwaW5nCiAgKiBAZXhjbHVzaXZlOgl0aGUgcGFnZSBpcyBleGNsdXNpdmVseSBvd25l ZCBieSB0aGUgY3VycmVudCBwcm9jZXNzCiAgKi8KIHN0YXRpYyB2b2lkIF9fcGFnZV9zZXRfYW5v bl9ybWFwKHN0cnVjdCBwYWdlICpwYWdlLApkaWZmIC0tZ2l0IGEvbW0vdWtzbS5jIGIvbW0vdWtz bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NDk3NjYKLS0tIC9kZXYv bnVsbAorKysgYi9tbS91a3NtLmMKQEAgLTAsMCArMSw1NTMxIEBACisvKgorICogVWx0cmEgS1NN LiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBOYWkgWGlhCisgKgorICogVGhpcyBpcyBhbiBpbXBy b3ZlbWVudCB1cG9uIEtTTS4gU29tZSBiYXNpYyBkYXRhIHN0cnVjdHVyZXMgYW5kIHJvdXRpbmVz CisgKiBhcmUgYm9ycm93ZWQgZnJvbSBrc20uYyAuCisgKgorICogSXRzIG5ldyBmZWF0dXJlczoK KyAqIDEuIEZ1bGwgc3lzdGVtIHNjYW46CisgKiAgICAgIEl0IGF1dG9tYXRpY2FsbHkgc2NhbnMg YWxsIHVzZXIgcHJvY2Vzc2VzJyBhbm9ueW1vdXMgVk1Bcy4gS2VybmVsLXVzZXIKKyAqICAgICAg aW50ZXJhY3Rpb24gdG8gc3VibWl0IGEgbWVtb3J5IGFyZWEgdG8gS1NNIGlzIG5vIGxvbmdlciBu ZWVkZWQuCisgKgorICogMi4gUmljaCBhcmVhIGRldGVjdGlvbjoKKyAqICAgICAgSXQgYXV0b21h dGljYWxseSBkZXRlY3RzIHJpY2ggYXJlYXMgY29udGFpbmluZyBhYnVuZGFudCBkdXBsaWNhdGVk CisgKiAgICAgIHBhZ2VzIGJhc2VkLiBSaWNoIGFyZWFzIGFyZSBnaXZlbiBhIGZ1bGwgc2NhbiBz cGVlZC4gUG9vciBhcmVhcyBhcmUKKyAqICAgICAgc2FtcGxlZCBhdCBhIHJlYXNvbmFibGUgc3Bl ZWQgd2l0aCB2ZXJ5IGxvdyBDUFUgY29uc3VtcHRpb24uCisgKgorICogMy4gVWx0cmEgUGVyLXBh Z2Ugc2NhbiBzcGVlZCBpbXByb3ZlbWVudDoKKyAqICAgICAgQSBuZXcgaGFzaCBhbGdvcml0aG0g aXMgcHJvcG9zZWQuIEFzIGEgcmVzdWx0LCBvbiBhIG1hY2hpbmUgd2l0aAorICogICAgICBDb3Jl KFRNKTIgUXVhZCBROTMwMCBDUFUgaW4gMzItYml0IG1vZGUgYW5kIDgwME1IWiBERFIyIG1haW4g bWVtb3J5LCBpdAorICogICAgICBjYW4gc2NhbiBtZW1vcnkgYXJlYXMgdGhhdCBkb2VzIG5vdCBj b250YWluIGR1cGxpY2F0ZWQgcGFnZXMgYXQgc3BlZWQgb2YKKyAqICAgICAgNjI3TUIvc2VjIH4g MjQ0NU1CL3NlYyBhbmQgY2FuIG1lcmdlIGR1cGxpY2F0ZWQgYXJlYXMgYXQgc3BlZWQgb2YKKyAq ICAgICAgNDc3TUIvc2VjIH4gOTIzTUIvc2VjLgorICoKKyAqIDQuIFRocmFzaGluZyBhcmVhIGF2 b2lkYW5jZToKKyAqICAgICAgVGhyYXNoaW5nIGFyZWEoYW4gVk1BIHRoYXQgaGFzIGZyZXF1ZW50 IEtzbSBwYWdlIGJyZWFrLW91dCkgY2FuIGJlCisgKiAgICAgIGZpbHRlcmVkIG91dC4gTXkgYmVu Y2htYXJrIHNob3dzIGl0J3MgbW9yZSBlZmZpY2llbnQgdGhhbiBLU00ncyBwZXItcGFnZQorICog ICAgICBoYXNoIHZhbHVlIGJhc2VkIHZvbGF0aWxlIHBhZ2UgZGV0ZWN0aW9uLgorICoKKyAqCisg KiA1LiBNaXNjIGNoYW5nZXMgdXBvbiBLU006CisgKiAgICAgICogSXQgaGFzIGEgZnVsbHkgeDg2 LW9waXRtaXplZCBtZW1jbXAgZGVkaWNhdGVkIGZvciA0LWJ5dGUtYWxpZ25lZCBwYWdlCisgKiAg ICAgICAgY29tcGFyaXNvbi4gSXQncyBtdWNoIGZhc3RlciB0aGFuIGRlZmF1bHQgQyB2ZXJzaW9u IG9uIHg4Ni4KKyAqICAgICAgKiBybWFwX2l0ZW0gbm93IGhhcyBhbiBzdHJ1Y3QgKnBhZ2UgbWVt YmVyIHRvIGxvb3NlbHkgY2FjaGUgYQorICogICAgICAgIGFkZHJlc3MtLT5wYWdlIG1hcHBpbmcs IHdoaWNoIHJlZHVjZXMgdG9vIG11Y2ggdGltZS1jb3N0bHkKKyAqICAgICAgICBmb2xsb3dfcGFn ZSgpLgorICogICAgICAqIFRoZSBWTUEgY3JlYXRpb24vZXhpdCBwcm9jZWR1cmVzIGFyZSBob29r ZWQgdG8gbGV0IHRoZSBVbHRyYSBLU00ga25vdy4KKyAqICAgICAgKiB0cnlfdG9fbWVyZ2VfdHdv X3BhZ2VzKCkgbm93IGNhbiByZXZlcnQgYSBwdGUgaWYgaXQgZmFpbHMuIE5vIGJyZWFrXworICog ICAgICAgIGtzbSBpcyBuZWVkZWQgZm9yIHRoaXMgY2FzZS4KKyAqCisgKiA2LiBGdWxsIFplcm8g UGFnZSBjb25zaWRlcmF0aW9uKGNvbnRyaWJ1dGVkIGJ5IEZpZ28gWmhhbmcpCisgKiAgICBOb3cg dWtzbWQgY29uc2lkZXIgZnVsbCB6ZXJvIHBhZ2VzIGFzIHNwZWNpYWwgcGFnZXMgYW5kIG1lcmdl IHRoZW0gdG8gYW4KKyAqICAgIHNwZWNpYWwgdW5zd2FwcGFibGUgdWtzbSB6ZXJvIHBhZ2UuCisg Ki8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNp bmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxs aW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgv cGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlu bG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXku aD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgor I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNs dWRlIDxsaW51eC9tZW1vcnkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbXVfbm90aWZpZXIuaD4KKyNp bmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgva3NtLmg+CisjaW5jbHVkZSA8 bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRl IDxjcnlwdG8vaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxp bnV4L21hdGg2NC5oPgorI2luY2x1ZGUgPGxpbnV4L2djZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zy ZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcmFkaXgtdHJlZS5oPgorCisvKiBGaXggbWlzc2Vk IGtlcm5lbC5oIGZvciBzdHJpY3Rfc3RydG91bCBmdW5jdGlvbiAqLworI2RlZmluZSBzdHJpY3Rf c3RydG91bCAga3N0cnRvdWwKKworI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUg ImludGVybmFsLmgiCisKKyNpZmRlZiBDT05GSUdfWDg2CisjdW5kZWYgbWVtY21wCisKKyNpZmRl ZiBDT05GSUdfWDg2XzMyCisjZGVmaW5lIG1lbWNtcCBtZW1jbXB4ODZfMzIKKy8qCisgKiBDb21w YXJlIDQtYnl0ZS1hbGlnbmVkIGFkZHJlc3MgczEgYW5kIHMyLCB3aXRoIGxlbmd0aCBuCisgKi8K K2ludCBtZW1jbXB4ODZfMzIodm9pZCAqczEsIHZvaWQgKnMyLCBzaXplX3QgbikKK3sKKwlzaXpl X3QgbnVtID0gbiAvIDQ7CisJcmVnaXN0ZXIgaW50IHJlczsKKworCV9fYXNtX18gX192b2xhdGls ZV9fCisJKAorCSAidGVzdGwgJTMsJTNcblx0IgorCSAicmVwZTsgY21wc2Rcblx0IgorCSAiamUg ICAgICAgIDFmXG5cdCIKKwkgInNiYmwgICAgICAlMCwlMFxuXHQiCisJICJvcmwgICAgICAgJDEs JTBcbiIKKwkgIjE6IgorCSA6ICI9JmEiIChyZXMpLCAiKyZTIiAoczEpLCAiKyZEIiAoczIpLCAi KyZjIiAobnVtKQorCSA6ICIwIiAoMCkKKwkgOiAiY2MiKTsKKworCXJldHVybiByZXM7Cit9CisK Ky8qCisgKiBDaGVjayB0aGUgcGFnZSBpcyBhbGwgemVybyA/CisgKi8KK3N0YXRpYyBpbnQgaXNf ZnVsbF96ZXJvKGNvbnN0IHZvaWQgKnMxLCBzaXplX3QgbGVuKQoreworCXVuc2lnbmVkIGNoYXIg c2FtZTsKKworCWxlbiAvPSA0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18KKwkoInJlcGU7IHNj YXNsOyIKKwkgInNldGUgJTAiCisJIDogIj1xbSIgKHNhbWUpLCAiK0QiIChzMSksICIrYyIgKGxl bikKKwkgOiAiYSIgKDApCisJIDogImNjIik7CisKKwlyZXR1cm4gc2FtZTsKK30KKworCisjZWxp ZiBkZWZpbmVkKENPTkZJR19YODZfNjQpCisjZGVmaW5lIG1lbWNtcCBtZW1jbXB4ODZfNjQKKy8q CisgKiBDb21wYXJlIDgtYnl0ZS1hbGlnbmVkIGFkZHJlc3MgczEgYW5kIHMyLCB3aXRoIGxlbmd0 aCBuCisgKi8KK2ludCBtZW1jbXB4ODZfNjQodm9pZCAqczEsIHZvaWQgKnMyLCBzaXplX3QgbikK K3sKKwlzaXplX3QgbnVtID0gbiAvIDg7CisJcmVnaXN0ZXIgaW50IHJlczsKKworCV9fYXNtX18g X192b2xhdGlsZV9fCisJKAorCSAidGVzdHEgJXEzLCVxM1xuXHQiCisJICJyZXBlOyBjbXBzcVxu XHQiCisJICJqZSAgICAgICAgMWZcblx0IgorCSAic2JicSAgICAgICVxMCwlcTBcblx0IgorCSAi b3JxICAgICAgICQxLCVxMFxuIgorCSAiMToiCisJIDogIj0mYSIgKHJlcyksICIrJlMiIChzMSks ICIrJkQiIChzMiksICIrJmMiIChudW0pCisJIDogIjAiICgwKQorCSA6ICJjYyIpOworCisJcmV0 dXJuIHJlczsKK30KKworc3RhdGljIGludCBpc19mdWxsX3plcm8oY29uc3Qgdm9pZCAqczEsIHNp emVfdCBsZW4pCit7CisJdW5zaWduZWQgY2hhciBzYW1lOworCisJbGVuIC89IDg7CisKKwlfX2Fz bV9fIF9fdm9sYXRpbGVfXworCSgicmVwZTsgc2Nhc3E7IgorCSAic2V0ZSAlMCIKKwkgOiAiPXFt IiAoc2FtZSksICIrRCIgKHMxKSwgIitjIiAobGVuKQorCSA6ICJhIiAoMCkKKwkgOiAiY2MiKTsK KworCXJldHVybiBzYW1lOworfQorCisjZW5kaWYKKyNlbHNlCitzdGF0aWMgaW50IGlzX2Z1bGxf emVybyhjb25zdCB2b2lkICpzMSwgc2l6ZV90IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nICpzcmMg PSBzMTsKKwlpbnQgaTsKKworCWxlbiAvPSBzaXplb2YoKnNyYyk7CisKKwlmb3IgKGkgPSAwOyBp IDwgbGVuOyBpKyspIHsKKwkJaWYgKHNyY1tpXSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVy biAxOworfQorI2VuZGlmCisKKyNkZWZpbmUgVUtTTV9SVU5HX1JPVU5EX0ZJTklTSEVEICAoMSA8 PCAwKQorI2RlZmluZSBUSU1FX1JBVElPX1NDQUxFCTEwMDAwCisKKyNkZWZpbmUgU0xPVF9UUkVF X05PREVfU0hJRlQJOAorI2RlZmluZSBTTE9UX1RSRUVfTk9ERV9TVE9SRV9TSVpFCSgxVUwgPDwg U0xPVF9UUkVFX05PREVfU0hJRlQpCitzdHJ1Y3Qgc2xvdF90cmVlX25vZGUgeworCXVuc2lnbmVk IGxvbmcgc2l6ZTsKKwlzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9kZSBzbm9kZTsKKwl2b2lkICpzdG9y ZXNbU0xPVF9UUkVFX05PREVfU1RPUkVfU0laRV07Cit9OworCitzdGF0aWMgc3RydWN0IGttZW1f Y2FjaGUgKnNsb3RfdHJlZV9ub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBzcmFkaXhfdHJl ZV9ub2RlICpzbG90X3RyZWVfbm9kZV9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBzbG90X3RyZWVf bm9kZSAqcDsKKwlwID0ga21lbV9jYWNoZV96YWxsb2Moc2xvdF90cmVlX25vZGVfY2FjaGVwLCBH RlBfS0VSTkVMKTsKKwlpZiAoIXApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZwLT5zbm9k ZTsKK30KKworc3RhdGljIHZvaWQgc2xvdF90cmVlX25vZGVfZnJlZShzdHJ1Y3Qgc3JhZGl4X3Ry ZWVfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3Qgc2xvdF90cmVlX25vZGUgKnA7CisKKwlwID0gY29u dGFpbmVyX29mKG5vZGUsIHN0cnVjdCBzbG90X3RyZWVfbm9kZSwgc25vZGUpOworCWttZW1fY2Fj aGVfZnJlZShzbG90X3RyZWVfbm9kZV9jYWNoZXAsIHApOworfQorCitzdGF0aWMgdm9pZCBzbG90 X3RyZWVfbm9kZV9leHRlbmQoc3RydWN0IHNyYWRpeF90cmVlX25vZGUgKnBhcmVudCwKKwkJCQkg IHN0cnVjdCBzcmFkaXhfdHJlZV9ub2RlICpjaGlsZCkKK3sKKwlzdHJ1Y3Qgc2xvdF90cmVlX25v ZGUgKnAsICpjOworCisJcCA9IGNvbnRhaW5lcl9vZihwYXJlbnQsIHN0cnVjdCBzbG90X3RyZWVf bm9kZSwgc25vZGUpOworCWMgPSBjb250YWluZXJfb2YoY2hpbGQsIHN0cnVjdCBzbG90X3RyZWVf bm9kZSwgc25vZGUpOworCisJcC0+c2l6ZSArPSBjLT5zaXplOworfQorCit2b2lkIHNsb3RfdHJl ZV9ub2RlX2Fzc2lnbihzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9kZSAqbm9kZSwKKwkJCSAgIHVuc2ln bmVkIGluZGV4LCB2b2lkICppdGVtKQoreworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdCA9IGl0ZW07 CisJc3RydWN0IHNsb3RfdHJlZV9ub2RlICpjdXI7CisKKwlzbG90LT5zbm9kZSA9IG5vZGU7CisJ c2xvdC0+c2luZGV4ID0gaW5kZXg7CisKKwl3aGlsZSAobm9kZSkgeworCQljdXIgPSBjb250YWlu ZXJfb2Yobm9kZSwgc3RydWN0IHNsb3RfdHJlZV9ub2RlLCBzbm9kZSk7CisJCWN1ci0+c2l6ZSAr PSBzbG90LT5wYWdlczsKKwkJbm9kZSA9IG5vZGUtPnBhcmVudDsKKwl9Cit9CisKK3ZvaWQgc2xv dF90cmVlX25vZGVfcm0oc3RydWN0IHNyYWRpeF90cmVlX25vZGUgKm5vZGUsIHVuc2lnbmVkIG9m ZnNldCkKK3sKKwlzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfdHJlZV9ub2Rl ICpjdXI7CisJdW5zaWduZWQgbG9uZyBwYWdlczsKKworCWlmIChub2RlLT5oZWlnaHQgPT0gMSkg eworCQlzbG90ID0gbm9kZS0+c3RvcmVzW29mZnNldF07CisJCXBhZ2VzID0gc2xvdC0+cGFnZXM7 CisJfSBlbHNlIHsKKwkJY3VyID0gY29udGFpbmVyX29mKG5vZGUtPnN0b3Jlc1tvZmZzZXRdLAor CQkJCSAgIHN0cnVjdCBzbG90X3RyZWVfbm9kZSwgc25vZGUpOworCQlwYWdlcyA9IGN1ci0+c2l6 ZTsKKwl9CisKKwl3aGlsZSAobm9kZSkgeworCQljdXIgPSBjb250YWluZXJfb2Yobm9kZSwgc3Ry dWN0IHNsb3RfdHJlZV9ub2RlLCBzbm9kZSk7CisJCWN1ci0+c2l6ZSAtPSBwYWdlczsKKwkJbm9k ZSA9IG5vZGUtPnBhcmVudDsKKwl9Cit9CisKK3Vuc2lnbmVkIGxvbmcgc2xvdF9pdGVyX2luZGV4 OworaW50IHNsb3RfaXRlcih2b2lkICppdGVtLCAgdW5zaWduZWQgbG9uZyBoZWlnaHQpCit7CisJ c3RydWN0IHNsb3RfdHJlZV9ub2RlICpub2RlOworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdDsKKwor CWlmIChoZWlnaHQgPT0gMSkgeworCQlzbG90ID0gaXRlbTsKKwkJaWYgKHNsb3RfaXRlcl9pbmRl eCA8IHNsb3QtPnBhZ2VzKSB7CisJCQkvKmluIHRoaXMgb25lKi8KKwkJCXJldHVybiAxOworCQl9 IGVsc2UgeworCQkJc2xvdF9pdGVyX2luZGV4IC09IHNsb3QtPnBhZ2VzOworCQkJcmV0dXJuIDA7 CisJCX0KKworCX0gZWxzZSB7CisJCW5vZGUgPSBjb250YWluZXJfb2YoaXRlbSwgc3RydWN0IHNs b3RfdHJlZV9ub2RlLCBzbm9kZSk7CisJCWlmIChzbG90X2l0ZXJfaW5kZXggPCBub2RlLT5zaXpl KSB7CisJCQkvKmluIHRoaXMgb25lKi8KKwkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJc2xv dF9pdGVyX2luZGV4IC09IG5vZGUtPnNpemU7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KK30KKwor CitzdGF0aWMgaW5saW5lIHZvaWQgc2xvdF90cmVlX2luaXRfcm9vdChzdHJ1Y3Qgc3JhZGl4X3Ry ZWVfcm9vdCAqcm9vdCkKK3sKKwlpbml0X3NyYWRpeF90cmVlX3Jvb3Qocm9vdCwgU0xPVF9UUkVF X05PREVfU0hJRlQpOworCXJvb3QtPmFsbG9jID0gc2xvdF90cmVlX25vZGVfYWxsb2M7CisJcm9v dC0+ZnJlZSA9IHNsb3RfdHJlZV9ub2RlX2ZyZWU7CisJcm9vdC0+ZXh0ZW5kID0gc2xvdF90cmVl X25vZGVfZXh0ZW5kOworCXJvb3QtPmFzc2lnbiA9IHNsb3RfdHJlZV9ub2RlX2Fzc2lnbjsKKwly b290LT5ybSA9IHNsb3RfdHJlZV9ub2RlX3JtOworfQorCit2b2lkIHNsb3RfdHJlZV9pbml0KHZv aWQpCit7CisJc2xvdF90cmVlX25vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInNsb3Rf dHJlZV9ub2RlIiwKKwkJCQlzaXplb2Yoc3RydWN0IHNsb3RfdHJlZV9ub2RlKSwgMCwKKwkJCQlT TEFCX1BBTklDIHwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQkJTlVMTCk7Cit9CisKKworLyog RWFjaCBydW5nIG9mIHRoaXMgbGFkZGVyIGlzIGEgbGlzdCBvZiBWTUFzIGhhdmluZyBhIHNhbWUg c2NhbiByYXRpbyAqLworc3RydWN0IHNjYW5fcnVuZyB7CisJLy9zdHJ1Y3QgbGlzdF9oZWFkIHNj YW5uZWRfbGlzdDsKKwlzdHJ1Y3Qgc3JhZGl4X3RyZWVfcm9vdCB2bWFfcm9vdDsKKwlzdHJ1Y3Qg c3JhZGl4X3RyZWVfcm9vdCB2bWFfcm9vdDI7CisKKwlzdHJ1Y3Qgdm1hX3Nsb3QgKmN1cnJlbnRf c2NhbjsKKwl1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OworCisJLyoKKwkgKiBUaGUgaW5p dGlhbCB2YWx1ZSBmb3IgY3VycmVudF9vZmZzZXQsIGl0IHNob3VsZCBsb29wIG92ZXIKKwkgKiBb MH4gc3RlcCAtIDFdIHRvIGxldCBhbGwgc2xvdCBoYXZlIGl0cyBjaGFuY2UgdG8gYmUgc2Nhbm5l ZC4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIG9mZnNldF9pbml0OworCXVuc2lnbmVkIGxvbmcgc3Rl cDsgLyogZHluYW1pYyBzdGVwIGZvciBjdXJyZW50X29mZnNldCAqLworCXVuc2lnbmVkIGludCBm bGFnczsKKwl1bnNpZ25lZCBsb25nIHBhZ2VzX3RvX3NjYW47CisJLy91bnNpZ25lZCBsb25nIGZ1 bGx5X3NjYW5uZWRfc2xvdHM7CisJLyoKKwkgKiBhIGxpdHRsZSBiaXQgdHJpY2t5IC0gaWYgY3B1 X3RpbWVfcmF0aW8gPiAwLCB0aGVuIHRoZSB2YWx1ZSBpcyB0aGUKKwkgKiB0aGUgY3B1IHRpbWUg cmF0aW8gaXQgY2FuIHNwZW5kIGluIHJ1bmdfaSBmb3IgZXZlcnkgc2NhbgorCSAqIHBlcmlvZC4g aWYgPCAwLCB0aGVuIGl0IGlzIHRoZSBjcHUgdGltZSByYXRpbyByZWxhdGl2ZSB0byB0aGUKKwkg KiBtYXggY3B1IHBlcmNlbnRhZ2UgdXNlciBzcGVjaWZpZWQuIEJvdGggaW4gdW5pdCBvZgorCSAq IDEvVElNRV9SQVRJT19TQ0FMRQorCSAqLworCWludCBjcHVfcmF0aW87CisKKwkvKgorCSAqIEhv dyBsb25nIGl0IHdpbGwgdGFrZSBmb3IgYWxsIHNsb3RzIGluIHRoaXMgcnVuZyB0byBiZSBmdWxs eQorCSAqIHNjYW5uZWQ/IElmIGl0J3MgemVybywgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgY292 ZXIgdGltZToKKwkgKiBpdCdzIGZ1bGx5IHNjYW5uZWQuCisJICovCisJdW5zaWduZWQgaW50IGNv dmVyX21zZWNzOworCS8vdW5zaWduZWQgbG9uZyB2bWFfbnVtOworCS8vdW5zaWduZWQgbG9uZyBw YWdlczsgLyogU3VtIG9mIGFsbCBzbG90J3MgcGFnZXMgaW4gcnVuZyAqLworfTsKKworLyoqCisg KiBub2RlIG9mIGVpdGhlciB0aGUgc3RhYmxlIG9yIHVuc3RhbGUgcmJ0cmVlCisgKgorICovCitz dHJ1Y3QgdHJlZV9ub2RlIHsKKwlzdHJ1Y3QgcmJfbm9kZSBub2RlOyAvKiBsaW5rIGluIHRoZSBt YWluICh1bilzdGFibGUgcmJ0cmVlICovCisJc3RydWN0IHJiX3Jvb3Qgc3ViX3Jvb3Q7IC8qIHJi X3Jvb3QgZm9yIHN1YmxldmVsIGNvbGxpc2lvbiByYnRyZWUgKi8KKwl1MzIgaGFzaDsKKwl1bnNp Z25lZCBsb25nIGNvdW50OyAvKiBUT0RPOiBtZXJnZWQgd2l0aCBzdWJfcm9vdCAqLworCXN0cnVj dCBsaXN0X2hlYWQgYWxsX2xpc3Q7IC8qIGFsbCB0cmVlIG5vZGVzIGluIHN0YWJsZS91bnN0YWJs ZSB0cmVlICovCit9OworCisvKioKKyAqIHN0cnVjdCBzdGFibGVfbm9kZSAtIG5vZGUgb2YgdGhl IHN0YWJsZSByYnRyZWUKKyAqIEBub2RlOiByYiBub2RlIG9mIHRoaXMga3NtIHBhZ2UgaW4gdGhl IHN0YWJsZSB0cmVlCisgKiBAaGxpc3Q6IGhsaXN0IGhlYWQgb2Ygcm1hcF9pdGVtcyB1c2luZyB0 aGlzIGtzbSBwYWdlCisgKiBAa3BmbjogcGFnZSBmcmFtZSBudW1iZXIgb2YgdGhpcyBrc20gcGFn ZQorICovCitzdHJ1Y3Qgc3RhYmxlX25vZGUgeworCXN0cnVjdCByYl9ub2RlIG5vZGU7IC8qIGxp bmsgaW4gc3ViLXJidHJlZSAqLworCXN0cnVjdCB0cmVlX25vZGUgKnRyZWVfbm9kZTsgLyogaXQn cyB0cmVlIG5vZGUgcm9vdCBpbiBzdGFibGUgdHJlZSwgTlVMTCBpZiBpdCdzIGluIGhlbGwgbGlz dCAqLworCXN0cnVjdCBobGlzdF9oZWFkIGhsaXN0OworCXVuc2lnbmVkIGxvbmcga3BmbjsKKwl1 MzIgaGFzaF9tYXg7IC8qIGlmID09MCB0aGVuIGl0J3Mgbm90IGJlZW4gY2FsY3VsYXRlZCB5ZXQg Ki8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGFsbF9saXN0OyAvKiBpbiBhIGxpc3QgZm9yIGFsbCBzdGFi bGUgbm9kZXMgKi8KK307CisKKy8qKgorICogc3RydWN0IG5vZGVfdm1hIC0gZ3JvdXAgcm1hcF9p dGVtcyBsaW5rZWQgaW4gYSBzYW1lIHN0YWJsZQorICogbm9kZSB0b2dldGhlci4KKyAqLworc3Ry dWN0IG5vZGVfdm1hIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB2bWFfc2xvdCAqc2xvdDsKKwkJdW5z aWduZWQgbG9uZyBrZXk7ICAvKiBzbG90IGlzIHVzZWQgYXMga2V5IHNvcnRlZCBvbiBobGlzdCAq LworCX07CisJc3RydWN0IGhsaXN0X25vZGUgaGxpc3Q7CisJc3RydWN0IGhsaXN0X2hlYWQgcm1h cF9obGlzdDsKKwlzdHJ1Y3Qgc3RhYmxlX25vZGUgKmhlYWQ7Cit9OworCisvKioKKyAqIHN0cnVj dCBybWFwX2l0ZW0gLSByZXZlcnNlIG1hcHBpbmcgaXRlbSBmb3IgdmlydHVhbCBhZGRyZXNzZXMK KyAqIEBybWFwX2xpc3Q6IG5leHQgcm1hcF9pdGVtIGluIG1tX3Nsb3QncyBzaW5nbHktbGlua2Vk IHJtYXBfbGlzdAorICogQGFub25fdm1hOiBwb2ludGVyIHRvIGFub25fdm1hIGZvciB0aGlzIG1t LGFkZHJlc3MsIHdoZW4gaW4gc3RhYmxlIHRyZWUKKyAqIEBtbTogdGhlIG1lbW9yeSBzdHJ1Y3R1 cmUgdGhpcyBybWFwX2l0ZW0gaXMgcG9pbnRpbmcgaW50bworICogQGFkZHJlc3M6IHRoZSB2aXJ0 dWFsIGFkZHJlc3MgdGhpcyBybWFwX2l0ZW0gdHJhY2tzICgrIGZsYWdzIGluIGxvdyBiaXRzKQor ICogQG5vZGU6IHJiIG5vZGUgb2YgdGhpcyBybWFwX2l0ZW0gaW4gdGhlIHVuc3RhYmxlIHRyZWUK KyAqIEBoZWFkOiBwb2ludGVyIHRvIHN0YWJsZV9ub2RlIGhlYWRpbmcgdGhpcyBsaXN0IGluIHRo ZSBzdGFibGUgdHJlZQorICogQGhsaXN0OiBsaW5rIGludG8gaGxpc3Qgb2Ygcm1hcF9pdGVtcyBo YW5naW5nIG9mZiB0aGF0IHN0YWJsZV9ub2RlCisgKi8KK3N0cnVjdCBybWFwX2l0ZW0geworCXN0 cnVjdCB2bWFfc2xvdCAqc2xvdDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25n IGFkZHJlc3M7CS8qICsgbG93IGJpdHMgdXNlZCBmb3IgZmxhZ3MgYmVsb3cgKi8KKwl1bnNpZ25l ZCBsb25nIGhhc2hfcm91bmQ7CisJdW5zaWduZWQgbG9uZyBlbnRyeV9pbmRleDsKKwl1bmlvbiB7 CisJCXN0cnVjdCB7Lyogd2hlbiBpbiB1bnN0YWJsZSB0cmVlICovCisJCQlzdHJ1Y3QgcmJfbm9k ZSBub2RlOworCQkJc3RydWN0IHRyZWVfbm9kZSAqdHJlZV9ub2RlOworCQkJdTMyIGhhc2hfbWF4 OworCQl9OworCQlzdHJ1Y3QgeyAvKiB3aGVuIGluIHN0YWJsZSB0cmVlICovCisJCQlzdHJ1Y3Qg bm9kZV92bWEgKmhlYWQ7CisJCQlzdHJ1Y3QgaGxpc3Rfbm9kZSBobGlzdDsKKwkJCXN0cnVjdCBh bm9uX3ZtYSAqYW5vbl92bWE7CisJCX07CisJfTsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0 KSkpOworCitzdHJ1Y3Qgcm1hcF9saXN0X2VudHJ5IHsKKwl1bmlvbiB7CisJCXN0cnVjdCBybWFw X2l0ZW0gKml0ZW07CisJCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl9OworCS8qIGxvd2VzdCBiaXQg aXMgdXNlZCBmb3IgaXNfYWRkciB0YWcgKi8KK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkp OyAvKiA0IGFsaWduZWQgdG8gZml0IGluIHRvIHBhZ2VzKi8KKworCisvKiBCYXNpYyBkYXRhIHN0 cnVjdHVyZSBkZWZpbml0aW9uIGVuZHMgKi8KKworCisvKgorICogRmxhZ3MgZm9yIHJtYXBfaXRl bSB0byBqdWRnZSBpZiBpdCdzIGxpc3RlZCBpbiB0aGUgc3RhYmxlL3Vuc3RhYmxlIHRyZWUuCisg KiBUaGUgZmxhZ3MgdXNlIHRoZSBsb3cgYml0cyBvZiBybWFwX2l0ZW0uYWRkcmVzcworICovCisj ZGVmaW5lIFVOU1RBQkxFX0ZMQUcJMHgxCisjZGVmaW5lIFNUQUJMRV9GTEFHCTB4MgorI2RlZmlu ZSBnZXRfcm1hcF9hZGRyKHgpCSgoeCktPmFkZHJlc3MgJiBQQUdFX01BU0spCisKKy8qCisgKiBy bWFwX2xpc3RfZW50cnkgaGVscGVycworICovCisjZGVmaW5lIElTX0FERFJfRkxBRwkxCisjZGVm aW5lIGlzX2FkZHIocHRyKQkJKCh1bnNpZ25lZCBsb25nKShwdHIpICYgSVNfQUREUl9GTEFHKQor I2RlZmluZSBzZXRfaXNfYWRkcihwdHIpCSgocHRyKSB8PSBJU19BRERSX0ZMQUcpCisjZGVmaW5l IGdldF9jbGVhbl9hZGRyKHB0cikJKCgocHRyKSAmIH4oX190eXBlb2ZfXyhwdHIpKUlTX0FERFJf RkxBRykpCisKKworLyoKKyAqIEhpZ2ggc3BlZWQgY2FjaGVzIGZvciBmcmVxdWVudGx5IGFsbG9j YXRlZCBhbmQgZnJlZWQgc3RydWN0cworICovCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnJt YXBfaXRlbV9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc3RhYmxlX25vZGVfY2Fj aGU7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm5vZGVfdm1hX2NhY2hlOworc3RhdGljIHN0 cnVjdCBrbWVtX2NhY2hlICp2bWFfc2xvdF9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNo ZSAqdHJlZV9ub2RlX2NhY2hlOworI2RlZmluZSBVS1NNX0tNRU1fQ0FDSEUoX19zdHJ1Y3QsIF9f ZmxhZ3MpIGttZW1fY2FjaGVfY3JlYXRlKCJ1a3NtXyIjX19zdHJ1Y3QsXAorCQlzaXplb2Yoc3Ry dWN0IF9fc3RydWN0KSwgX19hbGlnbm9mX18oc3RydWN0IF9fc3RydWN0KSxcCisJCShfX2ZsYWdz KSwgTlVMTCkKKworLyogQXJyYXkgb2YgYWxsIHNjYW5fcnVuZywgdWtzbV9zY2FuX2xhZGRlclsw XSBoYXZpbmcgdGhlIG1pbmltdW0gc2NhbiByYXRpbyAqLworI2RlZmluZSBTQ0FOX0xBRERFUl9T SVpFIDQKK3N0YXRpYyBzdHJ1Y3Qgc2Nhbl9ydW5nIHVrc21fc2Nhbl9sYWRkZXJbU0NBTl9MQURE RVJfU0laRV07CisKKy8qIFRoZSBldmFsdWF0aW9uIHJvdW5kcyB1a3NtZCBoYXMgZmluaXNoZWQg Ki8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdWtzbV9ldmFsX3JvdW5kID0gMTsKKworLyoK KyAqIHdlIGFkZCAxIHRvIHRoaXMgdmFyIHdoZW4gd2UgY29uc2lkZXIgd2Ugc2hvdWxkIHJlYnVp bGQgdGhlIHdob2xlCisgKiB1bnN0YWJsZSB0cmVlLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9u ZyB1a3NtX2hhc2hfcm91bmQgPSAxOworCisvKgorICogSG93IG1hbnkgdGltZXMgdGhlIHdob2xl IG1lbW9yeSBpcyBzY2FubmVkLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGZ1bGx5 X3NjYW5uZWRfcm91bmQgPSAxOworCisvKiBUaGUgdG90YWwgbnVtYmVyIG9mIHZpcnR1YWwgcGFn ZXMgb2YgYWxsIHZtYSBzbG90cyAqLworc3RhdGljIHU2NCB1a3NtX3BhZ2VzX3RvdGFsOworCisv KiBUaGUgbnVtYmVyIG9mIHBhZ2VzIGhhcyBiZWVuIHNjYW5uZWQgc2luY2UgdGhlIHN0YXJ0IHVw ICovCitzdGF0aWMgdTY0IHVrc21fcGFnZXNfc2Nhbm5lZDsKKworc3RhdGljIHU2NCBzY2FubmVk X3ZpcnR1YWxfcGFnZXM7CisKKy8qIFRoZSBudW1iZXIgb2YgcGFnZXMgaGFzIGJlZW4gc2Nhbm5l ZCBzaW5jZSBsYXN0IGVuY29kZV9iZW5lZml0IGNhbGwgKi8KK3N0YXRpYyB1NjQgdWtzbV9wYWdl c19zY2FubmVkX2xhc3Q7CisKKy8qIElmIHRoZSBzY2FubmVkIG51bWJlciBpcyB0b29vIGxhcmdl LCB3ZSBlbmNvZGUgaXQgaGVyZSAqLworc3RhdGljIHU2NCBwYWdlc19zY2FubmVkX3N0b3JlZDsK Kworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZXNfc2Nhbm5lZF9iYXNlOworCisvKiBUaGUgbnVt YmVyIG9mIG5vZGVzIGluIHRoZSBzdGFibGUgdHJlZSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcg dWtzbV9wYWdlc19zaGFyZWQ7CisKKy8qIFRoZSBudW1iZXIgb2YgcGFnZSBzbG90cyBhZGRpdGlv bmFsbHkgc2hhcmluZyB0aG9zZSBub2RlcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdWtzbV9w YWdlc19zaGFyaW5nOworCisvKiBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSB1bnN0YWJsZSB0 cmVlICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB1a3NtX3BhZ2VzX3Vuc2hhcmVkOworCisvKgor ICogTWlsbGlzZWNvbmRzIGtzbWQgc2hvdWxkIHNsZWVwIGJldHdlZW4gc2NhbnMsCisgKiA+PSAx MDBtcyB0byBiZSBjb25zaXN0ZW50IHdpdGgKKyAqIHNjYW5fdGltZV90b19zbGVlcF9tc2VjKCkK KyAqLworc3RhdGljIHVuc2lnbmVkIGludCB1a3NtX3NsZWVwX2ppZmZpZXM7CisKKy8qIFRoZSBy ZWFsIHZhbHVlIGZvciB0aGUgdWtzbWQgbmV4dCBzbGVlcCAqLworc3RhdGljIHVuc2lnbmVkIGlu dCB1a3NtX3NsZWVwX3JlYWw7CisKKy8qIFNhdmVkIHZhbHVlIGZvciB1c2VyIGlucHV0IHVrc21f c2xlZXBfamlmZmllcyB3aGVuIGl0J3MgZW5sYXJnZWQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQg dWtzbV9zbGVlcF9zYXZlZDsKKworLyogTWF4IHBlcmNlbnRhZ2Ugb2YgY3B1IHV0aWxpemF0aW9u IGtzbWQgY2FuIHRha2UgdG8gc2NhbiBpbiBvbmUgYmF0Y2ggKi8KK3N0YXRpYyB1bnNpZ25lZCBp bnQgdWtzbV9tYXhfY3B1X3BlcmNlbnRhZ2U7CisKK3N0YXRpYyBpbnQgdWtzbV9jcHVfZ292ZXJu b3I7CisKK3N0YXRpYyBjaGFyICp1a3NtX2NwdV9nb3Zlcm5vcl9zdHJbNF0gPSB7ICJmdWxsIiwg Im1lZGl1bSIsICJsb3ciLCAicXVpZXQiIH07CisKK3N0cnVjdCB1a3NtX2NwdV9wcmVzZXRfcyB7 CisJaW50IGNwdV9yYXRpb1tTQ0FOX0xBRERFUl9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgY292ZXJf bXNlY3NbU0NBTl9MQURERVJfU0laRV07CisJdW5zaWduZWQgaW50IG1heF9jcHU7IC8qIHBlcmNl bnRhZ2UgKi8KK307CisKK3N0cnVjdCB1a3NtX2NwdV9wcmVzZXRfcyB1a3NtX2NwdV9wcmVzZXRb NF0gPSB7CisJeyB7MjAsIDQwLCAtMjUwMCwgLTEwMDAwfSwgezEwMDAsIDUwMCwgMjAwLCA1MH0s IDk1fSwKKwl7IHsyMCwgMzAsIC0yNTAwLCAtMTAwMDB9LCB7MTAwMCwgNTAwLCA0MDAsIDEwMH0s IDUwfSwKKwl7IHsxMCwgMjAsIC01MDAwLCAtMTAwMDB9LCB7MTUwMCwgMTAwMCwgMTAwMCwgMjUw fSwgMjB9LAorCXsgezEwLCAyMCwgNDAsIDc1fSwgezIwMDAsIDEwMDAsIDEwMDAsIDEwMDB9LCAx fSwKK307CisKKy8qIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB1a3NtX2VtYV9wYWdlX3RpbWUgaWYg aXQncyBub3QgaW5pdGlhbGl6ZWQgKi8KKyNkZWZpbmUgVUtTTV9QQUdFX1RJTUVfREVGQVVMVAk1 MDAKKworLypjb3N0IHRvIHNjYW4gb25lIHBhZ2UgYnkgZXhwb3Rpb25hbCBtb3ZpbmcgYXZlcmFn ZSBpbiBuc2VjcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdWtzbV9lbWFfcGFnZV90aW1lID0g VUtTTV9QQUdFX1RJTUVfREVGQVVMVDsKKworLyogVGhlIGV4cG90aW9uYWwgbW92aW5nIGF2ZXJh Z2UgYWxwaGEgd2VpZ2h0LCBpbiBwZXJjZW50YWdlLiAqLworI2RlZmluZSBFTUFfQUxQSEEJMjAK KworLyoKKyAqIFRoZSB0aHJlc2hvbGQgdXNlZCB0byBmaWx0ZXIgb3V0IHRocmFzaGluZyBhcmVh cywKKyAqIElmIGl0ID09IDAsIGZpbHRlcmluZyBpcyBkaXNhYmxlZCwgb3RoZXJ3aXNlIGl0J3Mg dGhlIHBlcmNlbnRhZ2UgdXAtYm91bmQKKyAqIG9mIHRoZSB0aHJhc2hpbmcgcmF0aW8gb2YgYWxs IGFyZWFzLiBBbnkgYXJlYSB3aXRoIGEgYmlnZ2VyIHRocmFzaGluZyByYXRpbworICogd2lsbCBi ZSBjb25zaWRlcmVkIGFzIGhhdmluZyBhIHplcm8gZHVwbGljYXRpb24gcmF0aW8uCisgKi8KK3N0 YXRpYyB1bnNpZ25lZCBpbnQgdWtzbV90aHJhc2hfdGhyZXNob2xkID0gNTA7CisKKy8qIEhvdyBt dWNoIGRlZHVwIHJhdGlvIGlzIGNvbnNpZGVyZWQgdG8gYmUgYWJ1bmRhbnQqLworc3RhdGljIHVu c2lnbmVkIGludCB1a3NtX2FidW5kYW50X3RocmVzaG9sZCA9IDEwOworCisvKiBBbGwgc2xvdHMg aGF2aW5nIG1lcmdlZCBwYWdlcyBpbiB0aGlzIGV2YWwgcm91bmQuICovCitzdHJ1Y3QgbGlzdF9o ZWFkIHZtYV9zbG90X2RlZHVwID0gTElTVF9IRUFEX0lOSVQodm1hX3Nsb3RfZGVkdXApOworCisv KiBIb3cgbWFueSB0aW1lcyB0aGUga3NtZCBoYXMgc2xlcHQgc2luY2Ugc3RhcnR1cCAqLworc3Rh dGljIHVuc2lnbmVkIGxvbmcgbG9uZyB1a3NtX3NsZWVwX3RpbWVzOworCisjZGVmaW5lIFVLU01f UlVOX1NUT1AJMAorI2RlZmluZSBVS1NNX1JVTl9NRVJHRQkxCitzdGF0aWMgdW5zaWduZWQgaW50 IHVrc21fcnVuID0gMTsKKworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHVrc21fdGhy ZWFkX3dhaXQpOworc3RhdGljIERFRklORV9NVVRFWCh1a3NtX3RocmVhZF9tdXRleCk7CisKKy8q CisgKiBMaXN0IHZtYV9zbG90X25ldyBpcyBmb3IgbmV3bHkgY3JlYXRlZCB2bWFfc2xvdCB3YWl0 aW5nIHRvIGJlIGFkZGVkIGJ5CisgKiBrc21kLiBJZiBvbmUgY2Fubm90IGJlIGFkZGVkKGUuZy4g ZHVlIHRvIGl0J3MgdG9vIHNtYWxsKSwgaXQncyBtb3ZlZCB0bworICogdm1hX3Nsb3Rfbm9hZGQu IHZtYV9zbG90X2RlbCBpcyB0aGUgbGlzdCBmb3Igdm1hX3Nsb3Qgd2hvc2UgY29ycmVzcG9uZGlu ZworICogVk1BIGhhcyBiZWVuIHJlbW92ZWQvZnJlZWQuCisgKi8KK3N0cnVjdCBsaXN0X2hlYWQg dm1hX3Nsb3RfbmV3ID0gTElTVF9IRUFEX0lOSVQodm1hX3Nsb3RfbmV3KTsKK3N0cnVjdCBsaXN0 X2hlYWQgdm1hX3Nsb3Rfbm9hZGQgPSBMSVNUX0hFQURfSU5JVCh2bWFfc2xvdF9ub2FkZCk7Citz dHJ1Y3QgbGlzdF9oZWFkIHZtYV9zbG90X2RlbCA9IExJU1RfSEVBRF9JTklUKHZtYV9zbG90X2Rl bCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHZtYV9zbG90X2xpc3RfbG9jayk7CisKKy8qIFRo ZSB1bnN0YWJsZSB0cmVlIGhlYWRzICovCitzdGF0aWMgc3RydWN0IHJiX3Jvb3Qgcm9vdF91bnN0 YWJsZV90cmVlID0gUkJfUk9PVDsKKworLyoKKyAqIEFsbCB0cmVlX25vZGVzIGFyZSBpbiBhIGxp c3QgdG8gYmUgZnJlZWQgYXQgb25jZSB3aGVuIHVuc3RhYmxlIHRyZWUgaXMKKyAqIGZyZWVkIGFm dGVyIGVhY2ggc2NhbiByb3VuZC4KKyAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgdW5zdGFi bGVfdHJlZV9ub2RlX2xpc3QgPQorCQkJCUxJU1RfSEVBRF9JTklUKHVuc3RhYmxlX3RyZWVfbm9k ZV9saXN0KTsKKworLyogTGlzdCBjb250YWlucyBhbGwgc3RhYmxlIG5vZGVzICovCitzdGF0aWMg c3RydWN0IGxpc3RfaGVhZCBzdGFibGVfbm9kZV9saXN0ID0gTElTVF9IRUFEX0lOSVQoc3RhYmxl X25vZGVfbGlzdCk7CisKKy8qCisgKiBXaGVuIHRoZSBoYXNoIHN0cmVuZ3RoIGlzIGNoYW5nZWQs IHRoZSBzdGFibGUgdHJlZSBtdXN0IGJlIGRlbHRhX2hhc2hlZCBhbmQKKyAqIHJlLXN0cnVjdHVy ZWQuIFdlIHVzZSB0d28gc2V0IG9mIGJlbG93IHN0cnVjdHMgdG8gc3BlZWQgdXAgdGhlCisgKiBy ZS1zdHJ1Y3R1cmluZyBvZiBzdGFibGUgdHJlZS4KKyAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hl YWQKK3N0YWJsZV90cmVlX25vZGVfbGlzdFsyXSA9IHtMSVNUX0hFQURfSU5JVChzdGFibGVfdHJl ZV9ub2RlX2xpc3RbMF0pLAorCQkJICAgIExJU1RfSEVBRF9JTklUKHN0YWJsZV90cmVlX25vZGVf bGlzdFsxXSl9OworCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqc3RhYmxlX3RyZWVfbm9kZV9s aXN0cCA9ICZzdGFibGVfdHJlZV9ub2RlX2xpc3RbMF07CitzdGF0aWMgc3RydWN0IHJiX3Jvb3Qg cm9vdF9zdGFibGVfdHJlZVsyXSA9IHtSQl9ST09ULCBSQl9ST09UfTsKK3N0YXRpYyBzdHJ1Y3Qg cmJfcm9vdCAqcm9vdF9zdGFibGVfdHJlZXAgPSAmcm9vdF9zdGFibGVfdHJlZVswXTsKK3N0YXRp YyB1bnNpZ25lZCBsb25nIHN0YWJsZV90cmVlX2luZGV4OworCisvKiBUaGUgaGFzaCBzdHJlbmd0 aCBuZWVkZWQgdG8gaGFzaCBhIGZ1bGwgcGFnZSAqLworI2RlZmluZSBIQVNIX1NUUkVOR1RIX0ZV TEwJCShQQUdFX1NJWkUgLyBzaXplb2YodTMyKSkKKworLyogVGhlIGhhc2ggc3RyZW5ndGggbmVl ZGVkIGZvciBsb29wLWJhY2sgaGFzaGluZyAqLworI2RlZmluZSBIQVNIX1NUUkVOR1RIX01BWAkJ KEhBU0hfU1RSRU5HVEhfRlVMTCArIDEwKQorCisvKiBUaGUgcmFuZG9tIG9mZnNldHMgaW4gYSBw YWdlICovCitzdGF0aWMgdTMyICpyYW5kb21fbnVtczsKKworLyogVGhlIGhhc2ggc3RyZW5ndGgg Ki8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhhc2hfc3RyZW5ndGggPSBIQVNIX1NUUkVOR1RIX0ZV TEwgPj4gNDsKKworLyogVGhlIGRlbHRhIHZhbHVlIGVhY2ggdGltZSB0aGUgaGFzaCBzdHJlbmd0 aCBpbmNyZWFzZXMgb3IgZGVjcmVhc2VzICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoYXNoX3N0 cmVuZ3RoX2RlbHRhOworI2RlZmluZSBIQVNIX1NUUkVOR1RIX0RFTFRBX01BWAk1CisKKy8qIFRo ZSB0aW1lIHdlIGhhdmUgc2F2ZWQgZHVlIHRvIHJhbmRvbV9zYW1wbGVfaGFzaCAqLworc3RhdGlj IHU2NCByc2hhc2hfcG9zOworCisvKiBUaGUgdGltZSB3ZSBoYXZlIHdhc3RlZCBkdWUgdG8gaGFz aCBjb2xsaXNpb24gKi8KK3N0YXRpYyB1NjQgcnNoYXNoX25lZzsKKworc3RydWN0IHVrc21fYmVu ZWZpdCB7CisJdTY0IHBvczsKKwl1NjQgbmVnOworCXU2NCBzY2FubmVkOworCXVuc2lnbmVkIGxv bmcgYmFzZTsKK30gYmVuZWZpdDsKKworLyoKKyAqIFRoZSByZWxhdGl2ZSBjb3N0IG9mIG1lbWNt cCwgY29tcGFyZWQgdG8gMSB0aW1lIHVuaXQgb2YgcmFuZG9tIHNhbXBsZQorICogaGFzaCwgdGhp cyB2YWx1ZSBpcyB0ZXN0ZWQgd2hlbiBrc20gbW9kdWxlIGlzIGluaXRpYWxpemVkCisgKi8KK3N0 YXRpYyB1bnNpZ25lZCBsb25nIG1lbWNtcF9jb3N0OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyAg cnNoYXNoX25lZ19jb250X3plcm87CitzdGF0aWMgdW5zaWduZWQgbG9uZyAgcnNoYXNoX2NvbnRf b2JzY3VyZTsKKworLyogVGhlIHBvc3NpYmxlIHN0YXRlcyBvZiBoYXNoIHN0cmVuZ3RoIGFkanVz dG1lbnQgaGV1cmlzdGljICovCitlbnVtIHJzaGFzaF9zdGF0ZXMgeworCQlSU0hBU0hfU1RJTEws CisJCVJTSEFTSF9UUllVUCwKKwkJUlNIQVNIX1RSWURPV04sCisJCVJTSEFTSF9ORVcsCisJCVJT SEFTSF9QUkVfU1RJTEwsCit9OworCisvKiBUaGUgcG9zc2libGUgZGlyZWN0aW9uIHdlIGFyZSBh Ym91dCB0byBhZGp1c3QgaGFzaCBzdHJlbmd0aCAqLworZW51bSByc2hhc2hfZGlyZWN0IHsKKwlH T19VUCwKKwlHT19ET1dOLAorCU9CU0NVUkUsCisJU1RJTEwsCit9OworCisvKiByYW5kb20gc2Ft cGxpbmcgaGFzaCBzdGF0ZSBtYWNoaW5lICovCitzdGF0aWMgc3RydWN0IHsKKwllbnVtIHJzaGFz aF9zdGF0ZXMgc3RhdGU7CisJZW51bSByc2hhc2hfZGlyZWN0IHByZV9kaXJlY3Q7CisJdTggYmVs b3dfY291bnQ7CisJLyogS2VlcCBhIGxvb2t1cCB3aW5kb3cgb2Ygc2l6ZSA1LCBpZmYgYWJvdmVf Y291bnQvYmVsb3dfY291bnQgPiAzCisJICogaW4gdGhpcyB3aW5kb3cgd2Ugc3RvcCB0cnlpbmcu CisJICovCisJdTggbG9va3VwX3dpbmRvd19pbmRleDsKKwl1NjQgc3RhYmxlX2JlbmVmaXQ7CisJ dW5zaWduZWQgbG9uZyB0dXJuX3BvaW50X2Rvd247CisJdW5zaWduZWQgbG9uZyB0dXJuX2JlbmVm aXRfZG93bjsKKwl1bnNpZ25lZCBsb25nIHR1cm5fcG9pbnRfdXA7CisJdW5zaWduZWQgbG9uZyB0 dXJuX2JlbmVmaXRfdXA7CisJdW5zaWduZWQgbG9uZyBzdGFibGVfcG9pbnQ7Cit9IHJzaGFzaF9z dGF0ZTsKKworLyp6ZXJvIHBhZ2UgaGFzaCB0YWJsZSwgaGFzaF9zdHJlbmd0aCBbMCB+IEhBU0hf U1RSRU5HVEhfTUFYXSovCitzdGF0aWMgdTMyICp6ZXJvX2hhc2hfdGFibGU7CisKK3N0YXRpYyBp bmxpbmUgc3RydWN0IG5vZGVfdm1hICphbGxvY19ub2RlX3ZtYSh2b2lkKQoreworCXN0cnVjdCBu b2RlX3ZtYSAqbm9kZV92bWE7CisJbm9kZV92bWEgPSBrbWVtX2NhY2hlX3phbGxvYyhub2RlX3Zt YV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5vZGVfdm1hKSB7CisJCUlOSVRfSExJU1RfSEVB RCgmbm9kZV92bWEtPnJtYXBfaGxpc3QpOworCQlJTklUX0hMSVNUX05PREUoJm5vZGVfdm1hLT5o bGlzdCk7CisJfQorCXJldHVybiBub2RlX3ZtYTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZy ZWVfbm9kZV92bWEoc3RydWN0IG5vZGVfdm1hICpub2RlX3ZtYSkKK3sKKwlrbWVtX2NhY2hlX2Zy ZWUobm9kZV92bWFfY2FjaGUsIG5vZGVfdm1hKTsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVj dCB2bWFfc2xvdCAqYWxsb2Nfdm1hX3Nsb3Qodm9pZCkKK3sKKwlzdHJ1Y3Qgdm1hX3Nsb3QgKnNs b3Q7CisKKwkvKgorCSAqIEluIGNhc2Uga3NtIGlzIG5vdCBpbml0aWFsaXplZCBieSBub3cuCisJ ICogT29wcywgd2UgbmVlZCB0byBjb25zaWRlciB0aGUgY2FsbCBzaXRlIG9mIHVrc21faW5pdCgp IGluIHRoZSBmdXR1cmUuCisJICovCisJaWYgKCF2bWFfc2xvdF9jYWNoZSkKKwkJcmV0dXJuIE5V TEw7CisKKwlzbG90ID0ga21lbV9jYWNoZV96YWxsb2Modm1hX3Nsb3RfY2FjaGUsIEdGUF9LRVJO RUwpOworCWlmIChzbG90KSB7CisJCUlOSVRfTElTVF9IRUFEKCZzbG90LT5zbG90X2xpc3QpOwor CQlJTklUX0xJU1RfSEVBRCgmc2xvdC0+ZGVkdXBfbGlzdCk7CisJCXNsb3QtPmZsYWdzIHw9IFVL U01fU0xPVF9ORUVEX1JFUkFORDsKKwl9CisJcmV0dXJuIHNsb3Q7Cit9CisKK3N0YXRpYyBpbmxp bmUgdm9pZCBmcmVlX3ZtYV9zbG90KHN0cnVjdCB2bWFfc2xvdCAqdm1hX3Nsb3QpCit7CisJa21l bV9jYWNoZV9mcmVlKHZtYV9zbG90X2NhY2hlLCB2bWFfc2xvdCk7Cit9CisKKworCitzdGF0aWMg aW5saW5lIHN0cnVjdCBybWFwX2l0ZW0gKmFsbG9jX3JtYXBfaXRlbSh2b2lkKQoreworCXN0cnVj dCBybWFwX2l0ZW0gKnJtYXBfaXRlbTsKKworCXJtYXBfaXRlbSA9IGttZW1fY2FjaGVfemFsbG9j KHJtYXBfaXRlbV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJtYXBfaXRlbSkgeworCQkvKiBi dWcgb24gbG93ZXN0IGJpdCBpcyBub3QgY2xlYXIgZm9yIGZsYWcgdXNlICovCisJCUJVR19PTihp c19hZGRyKHJtYXBfaXRlbSkpOworCX0KKwlyZXR1cm4gcm1hcF9pdGVtOworfQorCitzdGF0aWMg aW5saW5lIHZvaWQgZnJlZV9ybWFwX2l0ZW0oc3RydWN0IHJtYXBfaXRlbSAqcm1hcF9pdGVtKQor eworCXJtYXBfaXRlbS0+c2xvdCA9IE5VTEw7CS8qIGRlYnVnIHNhZmV0eSAqLworCWttZW1fY2Fj aGVfZnJlZShybWFwX2l0ZW1fY2FjaGUsIHJtYXBfaXRlbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUg c3RydWN0IHN0YWJsZV9ub2RlICphbGxvY19zdGFibGVfbm9kZSh2b2lkKQoreworCXN0cnVjdCBz dGFibGVfbm9kZSAqbm9kZTsKKwlub2RlID0ga21lbV9jYWNoZV9hbGxvYyhzdGFibGVfbm9kZV9j YWNoZSwgR0ZQX0tFUk5FTCB8IEdGUF9BVE9NSUMpOworCWlmICghbm9kZSkKKwkJcmV0dXJuIE5V TEw7CisKKwlJTklUX0hMSVNUX0hFQUQoJm5vZGUtPmhsaXN0KTsKKwlsaXN0X2FkZCgmbm9kZS0+ YWxsX2xpc3QsICZzdGFibGVfbm9kZV9saXN0KTsKKwlyZXR1cm4gbm9kZTsKK30KKworc3RhdGlj IGlubGluZSB2b2lkIGZyZWVfc3RhYmxlX25vZGUoc3RydWN0IHN0YWJsZV9ub2RlICpzdGFibGVf bm9kZSkKK3sKKwlsaXN0X2RlbCgmc3RhYmxlX25vZGUtPmFsbF9saXN0KTsKKwlrbWVtX2NhY2hl X2ZyZWUoc3RhYmxlX25vZGVfY2FjaGUsIHN0YWJsZV9ub2RlKTsKK30KKworc3RhdGljIGlubGlu ZSBzdHJ1Y3QgdHJlZV9ub2RlICphbGxvY190cmVlX25vZGUoc3RydWN0IGxpc3RfaGVhZCAqbGlz dCkKK3sKKwlzdHJ1Y3QgdHJlZV9ub2RlICpub2RlOworCW5vZGUgPSBrbWVtX2NhY2hlX3phbGxv Yyh0cmVlX25vZGVfY2FjaGUsIEdGUF9LRVJORUwgfCBHRlBfQVRPTUlDKTsKKwlpZiAoIW5vZGUp CisJCXJldHVybiBOVUxMOworCisJbGlzdF9hZGQoJm5vZGUtPmFsbF9saXN0LCBsaXN0KTsKKwly ZXR1cm4gbm9kZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfdHJlZV9ub2RlKHN0cnVj dCB0cmVlX25vZGUgKm5vZGUpCit7CisJbGlzdF9kZWwoJm5vZGUtPmFsbF9saXN0KTsKKwlrbWVt X2NhY2hlX2ZyZWUodHJlZV9ub2RlX2NhY2hlLCBub2RlKTsKK30KKworc3RhdGljIHZvaWQgdWtz bV9kcm9wX2Fub25fdm1hKHN0cnVjdCBybWFwX2l0ZW0gKnJtYXBfaXRlbSkKK3sKKwlzdHJ1Y3Qg YW5vbl92bWEgKmFub25fdm1hID0gcm1hcF9pdGVtLT5hbm9uX3ZtYTsKKworCXB1dF9hbm9uX3Zt YShhbm9uX3ZtYSk7Cit9CisKKworLyoqCisgKiBSZW1vdmUgYSBzdGFibGUgbm9kZSBmcm9tIHN0 YWJsZV90cmVlLCBtYXkgdW5saW5rIGZyb20gaXRzIHRyZWVfbm9kZSBhbmQKKyAqIG1heSByZW1v dmUgaXRzIHBhcmVudCB0cmVlX25vZGUgaWYgbm8gb3RoZXIgc3RhYmxlIG5vZGUgaXMgcGVuZGlu Zy4KKyAqCisgKiBAc3RhYmxlX25vZGUgCVRoZSBub2RlIG5lZWQgdG8gYmUgcmVtb3ZlZAorICog QHVubGlua19yYiAJCVdpbGwgdGhpcyBub2RlIGJlIHVubGlua2VkIGZyb20gdGhlIHJidHJlZT8K KyAqIEByZW1vdmVfdHJlZV8Jbm9kZSBXaWxsIGl0cyB0cmVlX25vZGUgYmUgcmVtb3ZlZCBpZiBl bXB0eT8KKyAqLworc3RhdGljIHZvaWQgcmVtb3ZlX25vZGVfZnJvbV9zdGFibGVfdHJlZShzdHJ1 Y3Qgc3RhYmxlX25vZGUgKnN0YWJsZV9ub2RlLAorCQkJCQkgaW50IHVubGlua19yYiwgIGludCBy ZW1vdmVfdHJlZV9ub2RlKQoreworCXN0cnVjdCBub2RlX3ZtYSAqbm9kZV92bWE7CisJc3RydWN0 IHJtYXBfaXRlbSAqcm1hcF9pdGVtOworCXN0cnVjdCBobGlzdF9ub2RlICpuOworCisJaWYgKCFo bGlzdF9lbXB0eSgmc3RhYmxlX25vZGUtPmhsaXN0KSkgeworCQlobGlzdF9mb3JfZWFjaF9lbnRy eV9zYWZlKG5vZGVfdm1hLCBuLAorCQkJCQkgICZzdGFibGVfbm9kZS0+aGxpc3QsIGhsaXN0KSB7 CisJCQlobGlzdF9mb3JfZWFjaF9lbnRyeShybWFwX2l0ZW0sICZub2RlX3ZtYS0+cm1hcF9obGlz dCwgaGxpc3QpIHsKKwkJCQl1a3NtX3BhZ2VzX3NoYXJpbmctLTsKKworCQkJCXVrc21fZHJvcF9h bm9uX3ZtYShybWFwX2l0ZW0pOworCQkJCXJtYXBfaXRlbS0+YWRkcmVzcyAmPSBQQUdFX01BU0s7 CisJCQl9CisJCQlmcmVlX25vZGVfdm1hKG5vZGVfdm1hKTsKKwkJCWNvbmRfcmVzY2hlZCgpOwor CQl9CisKKwkJLyogdGhlIGxhc3Qgb25lIGlzIGNvdW50ZWQgYXMgc2hhcmVkICovCisJCXVrc21f cGFnZXNfc2hhcmVkLS07CisJCXVrc21fcGFnZXNfc2hhcmluZysrOworCX0KKworCWlmIChzdGFi bGVfbm9kZS0+dHJlZV9ub2RlICYmIHVubGlua19yYikgeworCQlyYl9lcmFzZSgmc3RhYmxlX25v ZGUtPm5vZGUsCisJCQkgJnN0YWJsZV9ub2RlLT50cmVlX25vZGUtPnN1Yl9yb290KTsKKworCQlp ZiAoUkJfRU1QVFlfUk9PVCgmc3RhYmxlX25vZGUtPnRyZWVfbm9kZS0+c3ViX3Jvb3QpICYmCisJ CSAgICByZW1vdmVfdHJlZV9ub2RlKSB7CisJCQlyYl9lcmFzZSgmc3RhYmxlX25vZGUtPnRyZWVf bm9kZS0+bm9kZSwKKwkJCQkgcm9vdF9zdGFibGVfdHJlZXApOworCQkJZnJlZV90cmVlX25vZGUo c3RhYmxlX25vZGUtPnRyZWVfbm9kZSk7CisJCX0gZWxzZSB7CisJCQlzdGFibGVfbm9kZS0+dHJl ZV9ub2RlLT5jb3VudC0tOworCQl9CisJfQorCisJZnJlZV9zdGFibGVfbm9kZShzdGFibGVfbm9k ZSk7Cit9CisKKworLyoKKyAqIGdldF91a3NtX3BhZ2U6IGNoZWNrcyBpZiB0aGUgcGFnZSBpbmRp Y2F0ZWQgYnkgdGhlIHN0YWJsZSBub2RlCisgKiBpcyBzdGlsbCBpdHMga3NtIHBhZ2UsIGRlc3Bp dGUgaGF2aW5nIGhlbGQgbm8gcmVmZXJlbmNlIHRvIGl0LgorICogSW4gd2hpY2ggY2FzZSB3ZSBj YW4gdHJ1c3QgdGhlIGNvbnRlbnQgb2YgdGhlIHBhZ2UsIGFuZCBpdAorICogcmV0dXJucyB0aGUg Z290dGVuIHBhZ2U7IGJ1dCBpZiB0aGUgcGFnZSBoYXMgbm93IGJlZW4gemFwcGVkLAorICogcmVt b3ZlIHRoZSBzdGFsZSBub2RlIGZyb20gdGhlIHN0YWJsZSB0cmVlIGFuZCByZXR1cm4gTlVMTC4K KyAqCisgKiBZb3Ugd291bGQgZXhwZWN0IHRoZSBzdGFibGVfbm9kZSB0byBob2xkIGEgcmVmZXJl bmNlIHRvIHRoZSBrc20gcGFnZS4KKyAqIEJ1dCBpZiBpdCBpbmNyZW1lbnRzIHRoZSBwYWdlJ3Mg Y291bnQsIHN3YXBwaW5nIG91dCBoYXMgdG8gd2FpdCBmb3IKKyAqIGtzbWQgdG8gY29tZSBhcm91 bmQgYWdhaW4gYmVmb3JlIGl0IGNhbiBmcmVlIHRoZSBwYWdlLCB3aGljaCBtYXkgdGFrZQorICog c2Vjb25kcyBvciBldmVuIG1pbnV0ZXM6IG11Y2ggdG9vIHVucmVzcG9uc2l2ZS4gIFNvIGluc3Rl YWQgd2UgdXNlIGEKKyAqICJrZXlob2xlIHJlZmVyZW5jZSI6IGFjY2VzcyB0byB0aGUga3NtIHBh Z2UgZnJvbSB0aGUgc3RhYmxlIG5vZGUgcGVlcHMKKyAqIG91dCB0aHJvdWdoIGl0cyBrZXlob2xl IHRvIHNlZSBpZiB0aGF0IHBhZ2Ugc3RpbGwgaG9sZHMgdGhlIHJpZ2h0IGtleSwKKyAqIHBvaW50 aW5nIGJhY2sgdG8gdGhpcyBzdGFibGUgbm9kZS4gIFRoaXMgcmVsaWVzIG9uIGZyZWVpbmcgYSBQ YWdlQW5vbgorICogcGFnZSB0byByZXNldCBpdHMgcGFnZS0+bWFwcGluZyB0byBOVUxMLCBhbmQg cmVsaWVzIG9uIG5vIG90aGVyIHVzZSBvZgorICogYSBwYWdlIHRvIHB1dCBzb21ldGhpbmcgdGhh dCBtaWdodCBsb29rIGxpa2Ugb3VyIGtleSBpbiBwYWdlLT5tYXBwaW5nLgorICoKKyAqIGluY2x1 ZGUvbGludXgvcGFnZW1hcC5oIHBhZ2VfY2FjaGVfZ2V0X3NwZWN1bGF0aXZlKCkgaXMgYSBnb29k IHJlZmVyZW5jZSwKKyAqIGJ1dCB0aGlzIGlzIGRpZmZlcmVudCAtIG1hZGUgc2ltcGxlciBieSB1 a3NtX3RocmVhZF9tdXRleCBiZWluZyBoZWxkLCBidXQKKyAqIGludGVyZXN0aW5nIGZvciBhc3N1 bWluZyB0aGF0IG5vIG90aGVyIHVzZSBvZiB0aGUgc3RydWN0IHBhZ2UgY291bGQgZXZlcgorICog cHV0IG91ciBleHBlY3RlZF9tYXBwaW5nIGludG8gcGFnZS0+bWFwcGluZyAob3IgYSBmaWVsZCBv ZiB0aGUgdW5pb24gd2hpY2gKKyAqIGNvaW5jaWRlcyB3aXRoIHBhZ2UtPm1hcHBpbmcpLiAgVGhl IFJDVSBjYWxscyBhcmUgbm90IGZvciBLU00gYXQgYWxsLCBidXQKKyAqIHRvIGtlZXAgdGhlIHBh Z2VfY291bnQgcHJvdG9jb2wgZGVzY3JpYmVkIHdpdGggcGFnZV9jYWNoZV9nZXRfc3BlY3VsYXRp dmUuCisgKgorICogTm90ZTogaXQgaXMgcG9zc2libGUgdGhhdCBnZXRfdWtzbV9wYWdlKCkgd2ls bCByZXR1cm4gTlVMTCBvbmUgbW9tZW50LAorICogdGhlbiBwYWdlIHRoZSBuZXh0LCBpZiB0aGUg cGFnZSBpcyBpbiBiZXR3ZWVuIHBhZ2VfZnJlZXplX3JlZnMoKSBhbmQKKyAqIHBhZ2VfdW5mcmVl emVfcmVmcygpOiB0aGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gYW55d2hlcmUsIHRoZSBwYWdl CisgKiBpcyBvbiBpdHMgd2F5IHRvIGJlaW5nIGZyZWVkOyBidXQgaXQgaXMgYW4gYW5vbWFseSB0 byBiZWFyIGluIG1pbmQuCisgKgorICogQHVubGlua19yYjogCQlpZiB0aGUgcmVtb3ZhbCBvZiB0 aGlzIG5vZGUgd2lsbCBmaXJzdGx5IHVubGluayBmcm9tCisgKiBpdHMgcmJ0cmVlLiBzdGFibGVf bm9kZV9yZWluc2VydCB3aWxsIHByZXZlbnQgdGhpcyB3aGVuIHJlc3RydWN0dXJpbmcgdGhlCisg KiBub2RlIGZyb20gaXRzIG9sZCB0cmVlLgorICoKKyAqIEByZW1vdmVfdHJlZV9ub2RlOglpZiB0 aGlzIGlzIHRoZSBsYXN0IG9uZSBvZiBpdHMgdHJlZV9ub2RlLCB3aWxsIHRoZQorICogdHJlZV9u b2RlIGJlIGZyZWVkID8gSWYgd2UgYXJlIGluc2VydGluZyBzdGFibGUgbm9kZSwgdGhpcyB0cmVl X25vZGUgbWF5CisgKiBiZSByZXVzZWQsIHNvIGRvbid0IGZyZWUgaXQuCisgKi8KK3N0YXRpYyBz dHJ1Y3QgcGFnZSAqZ2V0X3Vrc21fcGFnZShzdHJ1Y3Qgc3RhYmxlX25vZGUgKnN0YWJsZV9ub2Rl LAorCQkJCSBpbnQgdW5saW5rX3JiLCBpbnQgcmVtb3ZlX3RyZWVfbm9kZSkKK3sKKwlzdHJ1Y3Qg cGFnZSAqcGFnZTsKKwl2b2lkICpleHBlY3RlZF9tYXBwaW5nOworCisJcGFnZSA9IHBmbl90b19w YWdlKHN0YWJsZV9ub2RlLT5rcGZuKTsKKwlleHBlY3RlZF9tYXBwaW5nID0gKHZvaWQgKilzdGFi bGVfbm9kZSArCisJCQkJKFBBR0VfTUFQUElOR19BTk9OIHwgUEFHRV9NQVBQSU5HX0tTTSk7CisJ cmN1X3JlYWRfbG9jaygpOworCWlmIChwYWdlLT5tYXBwaW5nICE9IGV4cGVjdGVkX21hcHBpbmcp CisJCWdvdG8gc3RhbGU7CisJaWYgKCFnZXRfcGFnZV91bmxlc3NfemVybyhwYWdlKSkKKwkJZ290 byBzdGFsZTsKKwlpZiAocGFnZS0+bWFwcGluZyAhPSBleHBlY3RlZF9tYXBwaW5nKSB7CisJCXB1 dF9wYWdlKHBhZ2UpOworCQlnb3RvIHN0YWxlOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwly ZXR1cm4gcGFnZTsKK3N0YWxlOgorCXJjdV9yZWFkX3VubG9jaygpOworCXJlbW92ZV9ub2RlX2Zy b21fc3RhYmxlX3RyZWUoc3RhYmxlX25vZGUsIHVubGlua19yYiwgcmVtb3ZlX3RyZWVfbm9kZSk7 CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFJlbW92aW5nIHJtYXBfaXRlbSBmcm9tIHN0 YWJsZSBvciB1bnN0YWJsZSB0cmVlLgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNsZWFuIHRoZSBp bmZvcm1hdGlvbiBmcm9tIHRoZSBzdGFibGUvdW5zdGFibGUgdHJlZS4KKyAqLworc3RhdGljIGlu bGluZSB2b2lkIHJlbW92ZV9ybWFwX2l0ZW1fZnJvbV90cmVlKHN0cnVjdCBybWFwX2l0ZW0gKnJt YXBfaXRlbSkKK3sKKwlpZiAocm1hcF9pdGVtLT5hZGRyZXNzICYgU1RBQkxFX0ZMQUcpIHsKKwkJ c3RydWN0IHN0YWJsZV9ub2RlICpzdGFibGVfbm9kZTsKKwkJc3RydWN0IG5vZGVfdm1hICpub2Rl X3ZtYTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJbm9kZV92bWEgPSBybWFwX2l0ZW0tPmhl YWQ7CisJCXN0YWJsZV9ub2RlID0gbm9kZV92bWEtPmhlYWQ7CisJCXBhZ2UgPSBnZXRfdWtzbV9w YWdlKHN0YWJsZV9ub2RlLCAxLCAxKTsKKwkJaWYgKCFwYWdlKQorCQkJZ290byBvdXQ7CisKKwkJ LyoKKwkJICogcGFnZSBsb2NrIGlzIG5lZWRlZCBiZWNhdXNlIGl0J3MgcmFjaW5nIHdpdGgKKwkJ ICogdHJ5X3RvX3VubWFwX2tzbSgpLCBldGMuCisJCSAqLworCQlsb2NrX3BhZ2UocGFnZSk7CisJ CWhsaXN0X2RlbCgmcm1hcF9pdGVtLT5obGlzdCk7CisKKwkJaWYgKGhsaXN0X2VtcHR5KCZub2Rl X3ZtYS0+cm1hcF9obGlzdCkpIHsKKwkJCWhsaXN0X2RlbCgmbm9kZV92bWEtPmhsaXN0KTsKKwkJ CWZyZWVfbm9kZV92bWEobm9kZV92bWEpOworCQl9CisJCXVubG9ja19wYWdlKHBhZ2UpOworCisJ CXB1dF9wYWdlKHBhZ2UpOworCQlpZiAoaGxpc3RfZW1wdHkoJnN0YWJsZV9ub2RlLT5obGlzdCkp IHsKKwkJCS8qIGRvIE5PVCBjYWxsIHJlbW92ZV9ub2RlX2Zyb21fc3RhYmxlX3RyZWUoKSBoZXJl LAorCQkJICogaXQncyBwb3NzaWJsZSBmb3IgYSBmb3JrZWQgcm1hcF9pdGVtIG5vdCBpbgorCQkJ ICogc3RhYmxlIHRyZWUgd2hpbGUgdGhlIGluLXRyZWUgcm1hcF9pdGVtcyB3ZXJlCisJCQkgKiBk ZWxldGVkLgorCQkJICovCisJCQl1a3NtX3BhZ2VzX3NoYXJlZC0tOworCQl9IGVsc2UKKwkJCXVr c21fcGFnZXNfc2hhcmluZy0tOworCisKKwkJdWtzbV9kcm9wX2Fub25fdm1hKHJtYXBfaXRlbSk7 CisJfSBlbHNlIGlmIChybWFwX2l0ZW0tPmFkZHJlc3MgJiBVTlNUQUJMRV9GTEFHKSB7CisJCWlm IChybWFwX2l0ZW0tPmhhc2hfcm91bmQgPT0gdWtzbV9oYXNoX3JvdW5kKSB7CisKKwkJCXJiX2Vy YXNlKCZybWFwX2l0ZW0tPm5vZGUsCisJCQkJICZybWFwX2l0ZW0tPnRyZWVfbm9kZS0+c3ViX3Jv b3QpOworCQkJaWYgKFJCX0VNUFRZX1JPT1QoJnJtYXBfaXRlbS0+dHJlZV9ub2RlLT5zdWJfcm9v dCkpIHsKKwkJCQlyYl9lcmFzZSgmcm1hcF9pdGVtLT50cmVlX25vZGUtPm5vZGUsCisJCQkJCSAm cm9vdF91bnN0YWJsZV90cmVlKTsKKworCQkJCWZyZWVfdHJlZV9ub2RlKHJtYXBfaXRlbS0+dHJl ZV9ub2RlKTsKKwkJCX0gZWxzZQorCQkJCXJtYXBfaXRlbS0+dHJlZV9ub2RlLT5jb3VudC0tOwor CQl9CisJCXVrc21fcGFnZXNfdW5zaGFyZWQtLTsKKwl9CisKKwlybWFwX2l0ZW0tPmFkZHJlc3Mg Jj0gUEFHRV9NQVNLOworCXJtYXBfaXRlbS0+aGFzaF9tYXggPSAwOworCitvdXQ6CisJY29uZF9y ZXNjaGVkKCk7CQkvKiB3ZSdyZSBjYWxsZWQgZnJvbSBtYW55IGxvbmcgbG9vcHMgKi8KK30KKwor c3RhdGljIGlubGluZSBpbnQgc2xvdF9pbl91a3NtKHN0cnVjdCB2bWFfc2xvdCAqc2xvdCkKK3sK KwlyZXR1cm4gbGlzdF9lbXB0eSgmc2xvdC0+c2xvdF9saXN0KTsKK30KKworLyoKKyAqIFRlc3Qg aWYgdGhlIG1tIGlzIGV4aXRpbmcKKyAqLworc3RhdGljIGlubGluZSBib29sIHVrc21fdGVzdF9l eGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXJldHVybiBhdG9taWNfcmVhZCgmbW0tPm1t X3VzZXJzKSA9PSAwOworfQorCisvKioKKyAqIE5lZWQgdG8gZG8gdHdvIHRoaW5nczoKKyAqIDEu IGNoZWNrIGlmIHNsb3Qgd2FzIG1vdmVkIHRvIGRlbCBsaXN0CisgKiAyLiBtYWtlIHN1cmUgdGhl IG1tYXBfc2VtIGlzIG1hbmlwdWxhdGVkIHVuZGVyIHZhbGlkIHZtYS4KKyAqCisgKiBNeSBjb25j ZXJuIGhlcmUgaXMgdGhhdCBpbiBzb21lIGNhc2VzLCB0aGlzIG1heSBtYWtlCisgKiB2bWFfc2xv dF9saXN0X2xvY2soKSB3YWl0ZXJzIHRvIHNlcmlhbGl6ZWQgZnVydGhlciBieSBzb21lCisgKiBz ZW0tPndhaXRfbG9jaywgY2FuIHRoaXMgcmVhbGx5IGJlIGV4cGVuc2l2ZT8KKyAqCisgKgorICog QHJldHVybgorICogMDogaWYgc3VjY2Vzc2Z1bGx5IGxvY2tlZCBtbWFwX3NlbQorICogLUVOT0VO VDogdGhpcyBzbG90IHdhcyBtb3ZlZCB0byBkZWwgbGlzdAorICogLUVCVVNZOiB2bWEgbG9jayBm YWlsZWQKKyAqLworc3RhdGljIGludCB0cnlfZG93bl9yZWFkX3Nsb3RfbW1hcF9zZW0oc3RydWN0 IHZtYV9zbG90ICpzbG90KQoreworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVj dCBtbV9zdHJ1Y3QgKm1tOworCXN0cnVjdCByd19zZW1hcGhvcmUgKnNlbTsKKworCXNwaW5fbG9j aygmdm1hX3Nsb3RfbGlzdF9sb2NrKTsKKworCS8qIHRoZSBzbG90X2xpc3Qgd2FzIHJlbW92ZWQg YW5kIGluaXRlZCBmcm9tIG5ldyBsaXN0LCB3aGVuIGl0IGVudGVycworCSAqIHVrc21fbGlzdC4g SWYgbm93IGl0J3Mgbm90IGVtcHR5LCB0aGVuIGl0IG11c3QgYmUgbW92ZWQgdG8gZGVsIGxpc3QK KwkgKi8KKwlpZiAoIXNsb3RfaW5fdWtzbShzbG90KSkgeworCQlzcGluX3VubG9jaygmdm1hX3Ns b3RfbGlzdF9sb2NrKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJQlVHX09OKHNsb3QtPnBh Z2VzICE9IHZtYV9wYWdlcyhzbG90LT52bWEpKTsKKwkvKiBPaywgdm1hIHN0aWxsIHZhbGlkICov CisJdm1hID0gc2xvdC0+dm1hOworCW1tID0gdm1hLT52bV9tbTsKKwlzZW0gPSAmbW0tPm1tYXBf c2VtOworCisJaWYgKHVrc21fdGVzdF9leGl0KG1tKSkgeworCQlzcGluX3VubG9jaygmdm1hX3Ns b3RfbGlzdF9sb2NrKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaWYgKGRvd25fcmVhZF90 cnlsb2NrKHNlbSkpIHsKKwkJc3Bpbl91bmxvY2soJnZtYV9zbG90X2xpc3RfbG9jayk7CisJCXJl dHVybiAwOworCX0KKworCXNwaW5fdW5sb2NrKCZ2bWFfc2xvdF9saXN0X2xvY2spOworCXJldHVy biAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwordm1hX3BhZ2VfYWRk cmVzcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJ cGdvZmZfdCBwZ29mZiA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gUEFHRV9T SElGVCk7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzOworCisJYWRkcmVzcyA9IHZtYS0+dm1fc3Rh cnQgKyAoKHBnb2ZmIC0gdm1hLT52bV9wZ29mZikgPDwgUEFHRV9TSElGVCk7CisJaWYgKHVubGlr ZWx5KGFkZHJlc3MgPCB2bWEtPnZtX3N0YXJ0IHx8IGFkZHJlc3MgPj0gdm1hLT52bV9lbmQpKSB7 CisJCS8qIHBhZ2Ugc2hvdWxkIGJlIHdpdGhpbiBAdm1hIG1hcHBpbmcgcmFuZ2UgKi8KKwkJcmV0 dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiBhZGRyZXNzOworfQorCisKKy8qIHJldHVybiAwIG9u IHN1Y2Nlc3Mgd2l0aCB0aGUgaXRlbSdzIG1tYXBfc2VtIGxvY2tlZCAqLworc3RhdGljIGlubGlu ZSBpbnQgZ2V0X21lcmdlYWJsZV9wYWdlX2xvY2tfbW1hcChzdHJ1Y3Qgcm1hcF9pdGVtICppdGVt KQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdCA9IGl0 ZW0tPnNsb3Q7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwor CS8qCisJICogdHJ5X2Rvd25fcmVhZF9zbG90X21tYXBfc2VtKCkgcmV0dXJucyBub24temVybyBp ZiB0aGUgc2xvdAorCSAqIGhhcyBiZWVuIHJlbW92ZWQgYnkgdWtzbV9yZW1vdmVfdm1hKCkuCisJ ICovCisJaWYgKHRyeV9kb3duX3JlYWRfc2xvdF9tbWFwX3NlbShzbG90KSkKKwkJcmV0dXJuIC1F QlVTWTsKKworCW1tID0gc2xvdC0+dm1hLT52bV9tbTsKKworCWlmICh1a3NtX3Rlc3RfZXhpdCht bSkpCisJCWdvdG8gZmFpbG91dF91cDsKKworCXBhZ2UgPSBpdGVtLT5wYWdlOworCXJjdV9yZWFk X2xvY2soKTsKKwlpZiAoIWdldF9wYWdlX3VubGVzc196ZXJvKHBhZ2UpKSB7CisJCXJjdV9yZWFk X3VubG9jaygpOworCQlnb3RvIGZhaWxvdXRfdXA7CisJfQorCisJLyogTm8gbmVlZCB0byBjb25z aWRlciBodWdlIHBhZ2UgaGVyZS4gKi8KKwlpZiAoaXRlbS0+c2xvdC0+dm1hLT5hbm9uX3ZtYSAh PSBwYWdlX2Fub25fdm1hKHBhZ2UpIHx8CisJICAgIHZtYV9wYWdlX2FkZHJlc3MocGFnZSwgaXRl bS0+c2xvdC0+dm1hKSAhPSBnZXRfcm1hcF9hZGRyKGl0ZW0pKSB7CisJCS8qCisJCSAqIFRPRE86 CisJCSAqIHNob3VsZCB3ZSByZWxlYXNlIHRoaXMgaXRlbSBiZWNhc2Ugb2YgaXRzIHN0YWxlIHBh Z2UKKwkJICogbWFwcGluZz8KKwkJICovCisJCXB1dF9wYWdlKHBhZ2UpOworCQlyY3VfcmVhZF91 bmxvY2soKTsKKwkJZ290byBmYWlsb3V0X3VwOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwly ZXR1cm4gMDsKKworZmFpbG91dF91cDoKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXJldHVy biBlcnI7Cit9CisKKy8qCisgKiBXaGF0IGtpbmQgb2YgVk1BIGlzIGNvbnNpZGVyZWQgPworICov CitzdGF0aWMgaW5saW5lIGludCB2bWFfY2FuX2VudGVyKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAq dm1hKQoreworCXJldHVybiB1a3NtX2ZsYWdzX2Nhbl9zY2FuKHZtYS0+dm1fZmxhZ3MpOworfQor CisvKgorICogQ2FsbGVkIHdoZW5ldmVyIGEgZnJlc2ggbmV3IHZtYSBpcyBjcmVhdGVkIEEgbmV3 IHZtYV9zbG90LgorICogaXMgY3JlYXRlZCBhbmQgaW5zZXJ0ZWQgaW50byBhIGdsb2JhbCBsaXN0 IE11c3QgYmUgY2FsbGVkLgorICogYWZ0ZXIgdm1hIGlzIGluc2VydGVkIHRvIGl0cyBtbSAgICAg IAkJICAgIC4KKyAqLwordm9pZCB1a3NtX3ZtYV9hZGRfbmV3KHN0cnVjdCB2bV9hcmVhX3N0cnVj dCAqdm1hKQoreworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdDsKKworCWlmICghdm1hX2Nhbl9lbnRl cih2bWEpKSB7CisJCXZtYS0+dWtzbV92bWFfc2xvdCA9IE5VTEw7CisJCXJldHVybjsKKwl9CisK KwlzbG90ID0gYWxsb2Nfdm1hX3Nsb3QoKTsKKwlpZiAoIXNsb3QpIHsKKwkJdm1hLT51a3NtX3Zt YV9zbG90ID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKworCXZtYS0+dWtzbV92bWFfc2xvdCA9IHNs b3Q7CisJdm1hLT52bV9mbGFncyB8PSBWTV9NRVJHRUFCTEU7CisJc2xvdC0+dm1hID0gdm1hOwor CXNsb3QtPm1tID0gdm1hLT52bV9tbTsKKwlzbG90LT5jdGltZV9qID0gamlmZmllczsKKwlzbG90 LT5wYWdlcyA9IHZtYV9wYWdlcyh2bWEpOworCXNwaW5fbG9jaygmdm1hX3Nsb3RfbGlzdF9sb2Nr KTsKKwlsaXN0X2FkZF90YWlsKCZzbG90LT5zbG90X2xpc3QsICZ2bWFfc2xvdF9uZXcpOworCXNw aW5fdW5sb2NrKCZ2bWFfc2xvdF9saXN0X2xvY2spOworfQorCisvKgorICogQ2FsbGVkIGFmdGVy IHZtYSBpcyB1bmxpbmtlZCBmcm9tIGl0cyBtbQorICovCit2b2lkIHVrc21fcmVtb3ZlX3ZtYShz dHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3Q7CisK KwlpZiAoIXZtYS0+dWtzbV92bWFfc2xvdCkKKwkJcmV0dXJuOworCisJc2xvdCA9IHZtYS0+dWtz bV92bWFfc2xvdDsKKwlzcGluX2xvY2soJnZtYV9zbG90X2xpc3RfbG9jayk7CisJaWYgKHNsb3Rf aW5fdWtzbShzbG90KSkgeworCQkvKioKKwkJICogVGhpcyBzbG90IGhhcyBiZWVuIGFkZGVkIGJ5 IGtzbWQsIHNvIG1vdmUgdG8gdGhlIGRlbCBsaXN0CisJCSAqIHdhaXRpbmcga3NtZCB0byBmcmVl IGl0LgorCQkgKi8KKwkJbGlzdF9hZGRfdGFpbCgmc2xvdC0+c2xvdF9saXN0LCAmdm1hX3Nsb3Rf ZGVsKTsKKwl9IGVsc2UgeworCQkvKioKKwkJICogSXQncyBzdGlsbCBvbiBuZXcgbGlzdC4gSXQn cyBvayB0byBmcmVlIHNsb3QgZGlyZWN0bHkuCisJCSAqLworCQlsaXN0X2RlbCgmc2xvdC0+c2xv dF9saXN0KTsKKwkJZnJlZV92bWFfc2xvdChzbG90KTsKKwl9CisJc3Bpbl91bmxvY2soJnZtYV9z bG90X2xpc3RfbG9jayk7CisJdm1hLT51a3NtX3ZtYV9zbG90ID0gTlVMTDsKK30KKworLyogICAz Mi8zIDwgdGhleSA8IDMyLzIgKi8KKyNkZWZpbmUgc2hpZnRsCTgKKyNkZWZpbmUgc2hpZnRyCTEy CisKKyNkZWZpbmUgSEFTSF9GUk9NX1RPKGZyb20sIHRvKSAJCQkJXAorZm9yIChpbmRleCA9IGZy b207IGluZGV4IDwgdG87IGluZGV4KyspIHsJCVwKKwlwb3MgPSByYW5kb21fbnVtc1tpbmRleF07 CQkJXAorCWhhc2ggKz0ga2V5W3Bvc107CQkJCVwKKwloYXNoICs9IChoYXNoIDw8IHNoaWZ0bCk7 CQkJXAorCWhhc2ggXj0gKGhhc2ggPj4gc2hpZnRyKTsJCQlcCit9CisKKworI2RlZmluZSBIQVNI X0ZST01fRE9XTl9UTyhmcm9tLCB0bykgCQkJXAorZm9yIChpbmRleCA9IGZyb20gLSAxOyBpbmRl eCA+PSB0bzsgaW5kZXgtLSkgewkJXAorCWhhc2ggXj0gKGhhc2ggPj4gc2hpZnRyKTsJCQlcCisJ aGFzaCBePSAoaGFzaCA+PiAoc2hpZnRyKjIpKTsJCQlcCisJaGFzaCAtPSAoaGFzaCA8PCBzaGlm dGwpOwkJCVwKKwloYXNoICs9IChoYXNoIDw8IChzaGlmdGwqMikpOwkJCVwKKwlwb3MgPSByYW5k b21fbnVtc1tpbmRleF07CQkJXAorCWhhc2ggLT0ga2V5W3Bvc107CQkJCVwKK30KKworLyoKKyAq IFRoZSBtYWluIHJhbmRvbSBzYW1wbGUgaGFzaCBmdW5jdGlvbi4KKyAqLworc3RhdGljIHUzMiBy YW5kb21fc2FtcGxlX2hhc2godm9pZCAqYWRkciwgdTMyIGhhc2hfc3RyZW5ndGgpCit7CisJdTMy IGhhc2ggPSAweGRlYWRiZWVmOworCWludCBpbmRleCwgcG9zLCBsb29wID0gaGFzaF9zdHJlbmd0 aDsKKwl1MzIgKmtleSA9ICh1MzIgKilhZGRyOworCisJaWYgKGxvb3AgPiBIQVNIX1NUUkVOR1RI X0ZVTEwpCisJCWxvb3AgPSBIQVNIX1NUUkVOR1RIX0ZVTEw7CisKKwlIQVNIX0ZST01fVE8oMCwg bG9vcCk7CisKKwlpZiAoaGFzaF9zdHJlbmd0aCA+IEhBU0hfU1RSRU5HVEhfRlVMTCkgeworCQls b29wID0gaGFzaF9zdHJlbmd0aCAtIEhBU0hfU1RSRU5HVEhfRlVMTDsKKwkJSEFTSF9GUk9NX1RP KDAsIGxvb3ApOworCX0KKworCXJldHVybiBoYXNoOworfQorCisKKy8qKgorICogSXQncyB1c2Vk IHdoZW4gaGFzaCBzdHJlbmd0aCBpcyBhZGp1c3RlZAorICoKKyAqIEBhZGRyIFRoZSBwYWdlJ3Mg dmlydHVhbCBhZGRyZXNzCisgKiBAZnJvbSBUaGUgb3JpZ2luYWwgaGFzaCBzdHJlbmd0aAorICog QHRvICAgVGhlIGhhc2ggc3RyZW5ndGggY2hhbmdlZCB0bworICogQGhhc2ggVGhlIGhhc2ggdmFs dWUgZ2VuZXJhdGVkIHdpdGggImZyb20iIGhhc2ggdmFsdWUKKyAqCisgKiByZXR1cm4gdGhlIGhh c2ggdmFsdWUKKyAqLworc3RhdGljIHUzMiBkZWx0YV9oYXNoKHZvaWQgKmFkZHIsIGludCBmcm9t LCBpbnQgdG8sIHUzMiBoYXNoKQoreworCXUzMiAqa2V5ID0gKHUzMiAqKWFkZHI7CisJaW50IGlu ZGV4LCBwb3M7IC8qIG1ha2Ugc3VyZSB0aGV5IGFyZSBpbnQgdHlwZSAqLworCisJaWYgKHRvID4g ZnJvbSkgeworCQlpZiAoZnJvbSA+PSBIQVNIX1NUUkVOR1RIX0ZVTEwpIHsKKwkJCWZyb20gLT0g SEFTSF9TVFJFTkdUSF9GVUxMOworCQkJdG8gLT0gSEFTSF9TVFJFTkdUSF9GVUxMOworCQkJSEFT SF9GUk9NX1RPKGZyb20sIHRvKTsKKwkJfSBlbHNlIGlmICh0byA8PSBIQVNIX1NUUkVOR1RIX0ZV TEwpIHsKKwkJCUhBU0hfRlJPTV9UTyhmcm9tLCB0byk7CisJCX0gZWxzZSB7CisJCQlIQVNIX0ZS T01fVE8oZnJvbSwgSEFTSF9TVFJFTkdUSF9GVUxMKTsKKwkJCUhBU0hfRlJPTV9UTygwLCB0byAt IEhBU0hfU1RSRU5HVEhfRlVMTCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZnJvbSA8PSBIQVNI X1NUUkVOR1RIX0ZVTEwpIHsKKwkJCUhBU0hfRlJPTV9ET1dOX1RPKGZyb20sIHRvKTsKKwkJfSBl bHNlIGlmICh0byA+PSBIQVNIX1NUUkVOR1RIX0ZVTEwpIHsKKwkJCWZyb20gLT0gSEFTSF9TVFJF TkdUSF9GVUxMOworCQkJdG8gLT0gSEFTSF9TVFJFTkdUSF9GVUxMOworCQkJSEFTSF9GUk9NX0RP V05fVE8oZnJvbSwgdG8pOworCQl9IGVsc2UgeworCQkJSEFTSF9GUk9NX0RPV05fVE8oZnJvbSAt IEhBU0hfU1RSRU5HVEhfRlVMTCwgMCk7CisJCQlIQVNIX0ZST01fRE9XTl9UTyhIQVNIX1NUUkVO R1RIX0ZVTEwsIHRvKTsKKwkJfQorCX0KKworCXJldHVybiBoYXNoOworfQorCisKKworCisjZGVm aW5lIENBTl9PVkVSRkxPV19VNjQoeCwgZGVsdGEpIChVNjRfTUFYIC0gKHgpIDwgKGRlbHRhKSkK KworLyoqCisgKgorICogQ2FsbGVkIHdoZW46IHJzaGFzaF9wb3Mgb3IgcnNoYXNoX25lZyBpcyBh Ym91dCB0byBvdmVyZmxvdyBvciBhIHNjYW4gcm91bmQKKyAqIGhhcyBmaW5pc2hlZC4KKyAqCisg KiByZXR1cm4gMCBpZiBubyBwYWdlIGhhcyBiZWVuIHNjYW5uZWQgc2luY2UgbGFzdCBjYWxsLCAx IG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZW5jb2RlX2JlbmVmaXQodm9pZCkK K3sKKwl1NjQgc2Nhbm5lZF9kZWx0YSwgcG9zX2RlbHRhLCBuZWdfZGVsdGE7CisJdW5zaWduZWQg bG9uZyBiYXNlID0gYmVuZWZpdC5iYXNlOworCisJc2Nhbm5lZF9kZWx0YSA9IHVrc21fcGFnZXNf c2Nhbm5lZCAtIHVrc21fcGFnZXNfc2Nhbm5lZF9sYXN0OworCisJaWYgKCFzY2FubmVkX2RlbHRh KQorCQlyZXR1cm4gMDsKKworCXNjYW5uZWRfZGVsdGEgPj49IGJhc2U7CisJcG9zX2RlbHRhID0g cnNoYXNoX3BvcyA+PiBiYXNlOworCW5lZ19kZWx0YSA9IHJzaGFzaF9uZWcgPj4gYmFzZTsKKwor CWlmIChDQU5fT1ZFUkZMT1dfVTY0KGJlbmVmaXQucG9zLCBwb3NfZGVsdGEpIHx8CisJICAgIENB Tl9PVkVSRkxPV19VNjQoYmVuZWZpdC5uZWcsIG5lZ19kZWx0YSkgfHwKKwkgICAgQ0FOX09WRVJG TE9XX1U2NChiZW5lZml0LnNjYW5uZWQsIHNjYW5uZWRfZGVsdGEpKSB7CisJCWJlbmVmaXQuc2Nh bm5lZCA+Pj0gMTsKKwkJYmVuZWZpdC5uZWcgPj49IDE7CisJCWJlbmVmaXQucG9zID4+PSAxOwor CQliZW5lZml0LmJhc2UrKzsKKwkJc2Nhbm5lZF9kZWx0YSA+Pj0gMTsKKwkJcG9zX2RlbHRhID4+ PSAxOworCQluZWdfZGVsdGEgPj49IDE7CisJfQorCisJYmVuZWZpdC5wb3MgKz0gcG9zX2RlbHRh OworCWJlbmVmaXQubmVnICs9IG5lZ19kZWx0YTsKKwliZW5lZml0LnNjYW5uZWQgKz0gc2Nhbm5l ZF9kZWx0YTsKKworCUJVR19PTighYmVuZWZpdC5zY2FubmVkKTsKKworCXJzaGFzaF9wb3MgPSBy c2hhc2hfbmVnID0gMDsKKwl1a3NtX3BhZ2VzX3NjYW5uZWRfbGFzdCA9IHVrc21fcGFnZXNfc2Nh bm5lZDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzZXRfYmVuZWZp dCh2b2lkKQoreworCWJlbmVmaXQucG9zID0gMDsKKwliZW5lZml0Lm5lZyA9IDA7CisJYmVuZWZp dC5iYXNlID0gMDsKKwliZW5lZml0LnNjYW5uZWQgPSAwOworfQorCitzdGF0aWMgaW5saW5lIHZv aWQgaW5jX3JzaGFzaF9wb3ModW5zaWduZWQgbG9uZyBkZWx0YSkKK3sKKwlpZiAoQ0FOX09WRVJG TE9XX1U2NChyc2hhc2hfcG9zLCBkZWx0YSkpCisJCWVuY29kZV9iZW5lZml0KCk7CisKKwlyc2hh c2hfcG9zICs9IGRlbHRhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5jX3JzaGFzaF9uZWco dW5zaWduZWQgbG9uZyBkZWx0YSkKK3sKKwlpZiAoQ0FOX09WRVJGTE9XX1U2NChyc2hhc2hfbmVn LCBkZWx0YSkpCisJCWVuY29kZV9iZW5lZml0KCk7CisKKwlyc2hhc2hfbmVnICs9IGRlbHRhOwor fQorCisKK3N0YXRpYyBpbmxpbmUgdTMyIHBhZ2VfaGFzaChzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5z aWduZWQgbG9uZyBoYXNoX3N0cmVuZ3RoLAorCQkJICAgIGludCBjb3N0X2FjY291bnRpbmcpCit7 CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBsb25nIGRlbHRhOworCisJdm9pZCAqYWRkciA9IGttYXBf YXRvbWljKHBhZ2UpOworCisJdmFsID0gcmFuZG9tX3NhbXBsZV9oYXNoKGFkZHIsIGhhc2hfc3Ry ZW5ndGgpOworCWt1bm1hcF9hdG9taWMoYWRkcik7CisKKwlpZiAoY29zdF9hY2NvdW50aW5nKSB7 CisJCWlmIChIQVNIX1NUUkVOR1RIX0ZVTEwgPiBoYXNoX3N0cmVuZ3RoKQorCQkJZGVsdGEgPSBI QVNIX1NUUkVOR1RIX0ZVTEwgLSBoYXNoX3N0cmVuZ3RoOworCQllbHNlCisJCQlkZWx0YSA9IDA7 CisKKwkJaW5jX3JzaGFzaF9wb3MoZGVsdGEpOworCX0KKworCXJldHVybiB2YWw7Cit9CisKK3N0 YXRpYyBpbnQgbWVtY21wX3BhZ2VzKHN0cnVjdCBwYWdlICpwYWdlMSwgc3RydWN0IHBhZ2UgKnBh Z2UyLAorCQkJaW50IGNvc3RfYWNjb3VudGluZykKK3sKKwljaGFyICphZGRyMSwgKmFkZHIyOwor CWludCByZXQ7CisKKwlhZGRyMSA9IGttYXBfYXRvbWljKHBhZ2UxKTsKKwlhZGRyMiA9IGttYXBf YXRvbWljKHBhZ2UyKTsKKwlyZXQgPSBtZW1jbXAoYWRkcjEsIGFkZHIyLCBQQUdFX1NJWkUpOwor CWt1bm1hcF9hdG9taWMoYWRkcjIpOworCWt1bm1hcF9hdG9taWMoYWRkcjEpOworCisJaWYgKGNv c3RfYWNjb3VudGluZykKKwkJaW5jX3JzaGFzaF9uZWcobWVtY21wX2Nvc3QpOworCisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGFnZXNfaWRlbnRpY2FsKHN0cnVjdCBwYWdl ICpwYWdlMSwgc3RydWN0IHBhZ2UgKnBhZ2UyKQoreworCXJldHVybiAhbWVtY21wX3BhZ2VzKHBh Z2UxLCBwYWdlMiwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3BhZ2VfZnVsbF96ZXJv KHN0cnVjdCBwYWdlICpwYWdlKQoreworCWNoYXIgKmFkZHI7CisJaW50IHJldDsKKworCWFkZHIg PSBrbWFwX2F0b21pYyhwYWdlKTsKKwlyZXQgPSBpc19mdWxsX3plcm8oYWRkciwgUEFHRV9TSVpF KTsKKwlrdW5tYXBfYXRvbWljKGFkZHIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlu dCB3cml0ZV9wcm90ZWN0X3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBw YWdlICpwYWdlLAorCQkJICAgICAgcHRlX3QgKm9yaWdfcHRlLCBwdGVfdCAqb2xkX3B0ZSkKK3sK KwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CisJdW5zaWduZWQgbG9uZyBhZGRy OworCXB0ZV90ICpwdGVwOworCXNwaW5sb2NrX3QgKnB0bDsKKwlpbnQgc3dhcHBlZDsKKwlpbnQg ZXJyID0gLUVGQVVMVDsKKwl1bnNpZ25lZCBsb25nIG1tdW5fc3RhcnQ7CS8qIEZvciBtbXVfbm90 aWZpZXJzICovCisJdW5zaWduZWQgbG9uZyBtbXVuX2VuZDsJCS8qIEZvciBtbXVfbm90aWZpZXJz ICovCisKKwlhZGRyID0gcGFnZV9hZGRyZXNzX2luX3ZtYShwYWdlLCB2bWEpOworCWlmIChhZGRy ID09IC1FRkFVTFQpCisJCWdvdG8gb3V0OworCisJQlVHX09OKFBhZ2VUcmFuc0NvbXBvdW5kKHBh Z2UpKTsKKworCW1tdW5fc3RhcnQgPSBhZGRyOworCW1tdW5fZW5kICAgPSBhZGRyICsgUEFHRV9T SVpFOworCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KG1tLCBtbXVuX3N0YXJ0 LCBtbXVuX2VuZCk7CisKKwlwdGVwID0gcGFnZV9jaGVja19hZGRyZXNzKHBhZ2UsIG1tLCBhZGRy LCAmcHRsLCAwKTsKKwlpZiAoIXB0ZXApCisJCWdvdG8gb3V0X21uOworCisJaWYgKG9sZF9wdGUp CisJCSpvbGRfcHRlID0gKnB0ZXA7CisKKwlpZiAocHRlX3dyaXRlKCpwdGVwKSB8fCBwdGVfZGly dHkoKnB0ZXApKSB7CisJCXB0ZV90IGVudHJ5OworCisJCXN3YXBwZWQgPSBQYWdlU3dhcENhY2hl KHBhZ2UpOworCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkciwgcGFnZV90b19wZm4ocGFnZSkp OworCQkvKgorCQkgKiBPayB0aGlzIGlzIHRyaWNreSwgd2hlbiBnZXRfdXNlcl9wYWdlc19mYXN0 KCkgcnVuIGl0IGRvZXNudAorCQkgKiB0YWtlIGFueSBsb2NrLCB0aGVyZWZvcmUgdGhlIGNoZWNr IHRoYXQgd2UgYXJlIGdvaW5nIHRvIG1ha2UKKwkJICogd2l0aCB0aGUgcGFnZWNvdW50IGFnYWlu c3QgdGhlIG1hcGNvdW50IGlzIHJhY2V5IGFuZAorCQkgKiBPX0RJUkVDVCBjYW4gaGFwcGVuIHJp Z2h0IGFmdGVyIHRoZSBjaGVjay4KKwkJICogU28gd2UgY2xlYXIgdGhlIHB0ZSBhbmQgZmx1c2gg dGhlIHRsYiBiZWZvcmUgdGhlIGNoZWNrCisJCSAqIHRoaXMgYXNzdXJlIHVzIHRoYXQgbm8gT19E SVJFQ1QgY2FuIGhhcHBlbiBhZnRlciB0aGUgY2hlY2sKKwkJICogb3IgaW4gdGhlIG1pZGRsZSBv ZiB0aGUgY2hlY2suCisJCSAqLworCQllbnRyeSA9IHB0ZXBfY2xlYXJfZmx1c2godm1hLCBhZGRy LCBwdGVwKTsKKwkJLyoKKwkJICogQ2hlY2sgdGhhdCBubyBPX0RJUkVDVCBvciBzaW1pbGFyIEkv TyBpcyBpbiBwcm9ncmVzcyBvbiB0aGUKKwkJICogcGFnZQorCQkgKi8KKwkJaWYgKHBhZ2VfbWFw Y291bnQocGFnZSkgKyAxICsgc3dhcHBlZCAhPSBwYWdlX2NvdW50KHBhZ2UpKSB7CisJCQlzZXRf cHRlX2F0KG1tLCBhZGRyLCBwdGVwLCBlbnRyeSk7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0K KwkJaWYgKHB0ZV9kaXJ0eShlbnRyeSkpCisJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJZW50 cnkgPSBwdGVfbWtjbGVhbihwdGVfd3Jwcm90ZWN0KGVudHJ5KSk7CisJCXNldF9wdGVfYXRfbm90 aWZ5KG1tLCBhZGRyLCBwdGVwLCBlbnRyeSk7CisJfQorCSpvcmlnX3B0ZSA9ICpwdGVwOworCWVy ciA9IDA7CisKK291dF91bmxvY2s6CisJcHRlX3VubWFwX3VubG9jayhwdGVwLCBwdGwpOworb3V0 X21uOgorCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZChtbSwgbW11bl9zdGFydCwg bW11bl9lbmQpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKyNkZWZpbmUgTUVSR0VfRVJSX1BH RVJSCQkxIC8qIHRoZSBwYWdlIGlzIGludmFsaWQgY2Fubm90IGNvbnRpbnVlICovCisjZGVmaW5l IE1FUkdFX0VSUl9DT0xMSQkJMiAvKiB0aGVyZSBpcyBhIGNvbGxpc2lvbiAqLworI2RlZmluZSBN RVJHRV9FUlJfQ09MTElfTUFYCTMgLyogY29sbGlzaW9uIGF0IHRoZSBtYXggaGFzaCBzdHJlbmd0 aCAqLworI2RlZmluZSBNRVJHRV9FUlJfQ0hBTkdFRAk0IC8qIHRoZSBwYWdlIGhhcyBjaGFuZ2Vk IHNpbmNlIGxhc3QgaGFzaCAqLworCisKKy8qKgorICogcmVwbGFjZV9wYWdlIC0gcmVwbGFjZSBw YWdlIGluIHZtYSBieSBuZXcga3NtIHBhZ2UKKyAqIEB2bWE6ICAgICAgdm1hIHRoYXQgaG9sZHMg dGhlIHB0ZSBwb2ludGluZyB0byBwYWdlCisgKiBAcGFnZTogICAgIHRoZSBwYWdlIHdlIGFyZSBy ZXBsYWNpbmcgYnkga3BhZ2UKKyAqIEBrcGFnZTogICAgdGhlIGtzbSBwYWdlIHdlIHJlcGxhY2Ug cGFnZSBieQorICogQG9yaWdfcHRlOiB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIHB0ZQorICoK KyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBNRVJHRV9FUlJfUEdFUlIgb24gZmFpbHVyZS4KKyAq Lworc3RhdGljIGludCByZXBsYWNlX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0 cnVjdCBwYWdlICpwYWdlLAorCQkJc3RydWN0IHBhZ2UgKmtwYWdlLCBwdGVfdCBvcmlnX3B0ZSkK K3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CisJcGdkX3QgKnBnZDsKKwlw dWRfdCAqcHVkOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZXA7CisJc3BpbmxvY2tfdCAqcHRs OworCXB0ZV90IGVudHJ5OworCisJdW5zaWduZWQgbG9uZyBhZGRyOworCWludCBlcnIgPSBNRVJH RV9FUlJfUEdFUlI7CisJdW5zaWduZWQgbG9uZyBtbXVuX3N0YXJ0OwkvKiBGb3IgbW11X25vdGlm aWVycyAqLworCXVuc2lnbmVkIGxvbmcgbW11bl9lbmQ7CQkvKiBGb3IgbW11X25vdGlmaWVycyAq LworCisJYWRkciA9IHBhZ2VfYWRkcmVzc19pbl92bWEocGFnZSwgdm1hKTsKKwlpZiAoYWRkciA9 PSAtRUZBVUxUKQorCQlnb3RvIG91dDsKKworCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHIpOwor CWlmICghcGdkX3ByZXNlbnQoKnBnZCkpCisJCWdvdG8gb3V0OworCisJcHVkID0gcHVkX29mZnNl dChwZ2QsIGFkZHIpOworCWlmICghcHVkX3ByZXNlbnQoKnB1ZCkpCisJCWdvdG8gb3V0OworCisJ cG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpOworCUJVR19PTihwbWRfdHJhbnNfaHVnZSgqcG1k KSk7CisJaWYgKCFwbWRfcHJlc2VudCgqcG1kKSkKKwkJZ290byBvdXQ7CisKKwltbXVuX3N0YXJ0 ID0gYWRkcjsKKwltbXVuX2VuZCAgID0gYWRkciArIFBBR0VfU0laRTsKKwltbXVfbm90aWZpZXJf aW52YWxpZGF0ZV9yYW5nZV9zdGFydChtbSwgbW11bl9zdGFydCwgbW11bl9lbmQpOworCisJcHRl cCA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkciwgJnB0bCk7CisJaWYgKCFwdGVf c2FtZSgqcHRlcCwgb3JpZ19wdGUpKSB7CisJCXB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTsK KwkJZ290byBvdXRfbW47CisJfQorCisJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHIsIHB0ZV9w Zm4oKnB0ZXApKTsKKwlwdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkciwgcHRlcCk7CisJZW50cnkg PSBta19wdGUoa3BhZ2UsIHZtYS0+dm1fcGFnZV9wcm90KTsKKworCS8qIHNwZWNpYWwgdHJlYXRt ZW50IGlzIG5lZWRlZCBmb3IgemVyb19wYWdlICovCisJaWYgKChwYWdlX3RvX3BmbihrcGFnZSkg PT0gdWtzbV96ZXJvX3BmbikgfHwKKwkJCQkocGFnZV90b19wZm4oa3BhZ2UpID09IHplcm9fcGZu KSkKKwkJZW50cnkgPSBwdGVfbWtzcGVjaWFsKGVudHJ5KTsKKwllbHNlIHsKKwkJZ2V0X3BhZ2Uo a3BhZ2UpOworCQlwYWdlX2FkZF9hbm9uX3JtYXAoa3BhZ2UsIHZtYSwgYWRkcik7CisJfQorCisJ c2V0X3B0ZV9hdF9ub3RpZnkobW0sIGFkZHIsIHB0ZXAsIGVudHJ5KTsKKworCXBhZ2VfcmVtb3Zl X3JtYXAocGFnZSk7CisJaWYgKCFwYWdlX21hcHBlZChwYWdlKSkKKwkJdHJ5X3RvX2ZyZWVfc3dh cChwYWdlKTsKKwlwdXRfcGFnZShwYWdlKTsKKworCXB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRs KTsKKwllcnIgPSAwOworb3V0X21uOgorCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2Vu ZChtbSwgbW11bl9zdGFydCwgbW11bl9lbmQpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKwor LyoqCisgKiAgRnVsbHkgaGFzaCBhIHBhZ2Ugd2l0aCBIQVNIX1NUUkVOR1RIX01BWCByZXR1cm4g YSBub24temVybyBoYXNoIHZhbHVlLiBUaGUKKyAqICB6ZXJvIGhhc2ggdmFsdWUgYXQgSEFTSF9T VFJFTkdUSF9NQVggaXMgdXNlZCB0byBpbmRpY2F0ZWQgdGhhdCBpdHMKKyAqICBoYXNoX21heCBt ZW1iZXIgaGFzIG5vdCBiZWVuIGNhbGN1bGF0ZWQuCisgKgorICogQHBhZ2UgVGhlIHBhZ2UgbmVl ZHMgdG8gYmUgaGFzaGVkCisgKiBAaGFzaF9vbGQgVGhlIGhhc2ggdmFsdWUgY2FsY3VsYXRlZCB3 aXRoIGN1cnJlbnQgaGFzaCBzdHJlbmd0aAorICoKKyAqIHJldHVybiB0aGUgbmV3IGhhc2ggdmFs dWUgY2FsY3VsYXRlZCBhdCBIQVNIX1NUUkVOR1RIX01BWAorICovCitzdGF0aWMgaW5saW5lIHUz MiBwYWdlX2hhc2hfbWF4KHN0cnVjdCBwYWdlICpwYWdlLCB1MzIgaGFzaF9vbGQpCit7CisJdTMy IGhhc2hfbWF4ID0gMDsKKwl2b2lkICphZGRyOworCisJYWRkciA9IGttYXBfYXRvbWljKHBhZ2Up OworCWhhc2hfbWF4ID0gZGVsdGFfaGFzaChhZGRyLCBoYXNoX3N0cmVuZ3RoLAorCQkJICAgICAg SEFTSF9TVFJFTkdUSF9NQVgsIGhhc2hfb2xkKTsKKworCWt1bm1hcF9hdG9taWMoYWRkcik7CisK KwlpZiAoIWhhc2hfbWF4KQorCQloYXNoX21heCA9IDE7CisKKwlpbmNfcnNoYXNoX25lZyhIQVNI X1NUUkVOR1RIX01BWCAtIGhhc2hfc3RyZW5ndGgpOworCXJldHVybiBoYXNoX21heDsKK30KKwor LyoKKyAqIFdlIGNvbXBhcmUgdGhlIGhhc2ggYWdhaW4sIHRvIGVuc3VyZSB0aGF0IGl0IGlzIHJl YWxseSBhIGhhc2ggY29sbGlzaW9uCisgKiBpbnN0ZWFkIG9mIGJlaW5nIGNhdXNlZCBieSBwYWdl IHdyaXRlLgorICovCitzdGF0aWMgaW5saW5lIGludCBjaGVja19jb2xsaXNpb24oc3RydWN0IHJt YXBfaXRlbSAqcm1hcF9pdGVtLAorCQkJCSAgdTMyIGhhc2gpCit7CisJaW50IGVycjsKKwlzdHJ1 Y3QgcGFnZSAqcGFnZSA9IHJtYXBfaXRlbS0+cGFnZTsKKworCS8qIGlmIHRoaXMgcm1hcF9pdGVt IGhhcyBhbHJlYWR5IGJlZW4gaGFzaF9tYXhlZCwgdGhlbiB0aGUgY29sbGlzaW9uCisJICogbXVz dCBhcHBlYXJzIGluIHRoZSBzZWNvbmQtbGV2ZWwgcmJ0cmVlIHNlYXJjaC4gSW4gdGhpcyBjYXNl IHdlIGNoZWNrCisJICogaWYgaXRzIGhhc2hfbWF4IHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQuIE90 aGVyd2lzZSwgdGhlIGNvbGxpc2lvbgorCSAqIGhhcHBlbnMgaW4gdGhlIGZpcnN0LWxldmVsIHJi dHJlZSBzZWFyY2gsIHNvIHdlIGNoZWNrIGFnYWluc3QgaXQncworCSAqIGN1cnJlbnQgaGFzaCB2 YWx1ZS4KKwkgKi8KKwlpZiAocm1hcF9pdGVtLT5oYXNoX21heCkgeworCQlpbmNfcnNoYXNoX25l ZyhtZW1jbXBfY29zdCk7CisJCWluY19yc2hhc2hfbmVnKEhBU0hfU1RSRU5HVEhfTUFYIC0gaGFz aF9zdHJlbmd0aCk7CisKKwkJaWYgKHJtYXBfaXRlbS0+aGFzaF9tYXggPT0gcGFnZV9oYXNoX21h eChwYWdlLCBoYXNoKSkKKwkJCWVyciA9IE1FUkdFX0VSUl9DT0xMSTsKKwkJZWxzZQorCQkJZXJy ID0gTUVSR0VfRVJSX0NIQU5HRUQ7CisJfSBlbHNlIHsKKwkJaW5jX3JzaGFzaF9uZWcobWVtY21w X2Nvc3QgKyBoYXNoX3N0cmVuZ3RoKTsKKworCQlpZiAocGFnZV9oYXNoKHBhZ2UsIGhhc2hfc3Ry ZW5ndGgsIDApID09IGhhc2gpCisJCQllcnIgPSBNRVJHRV9FUlJfQ09MTEk7CisJCWVsc2UKKwkJ CWVyciA9IE1FUkdFX0VSUl9DSEFOR0VEOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRp YyBzdHJ1Y3QgcGFnZSAqcGFnZV90cmFuc19jb21wb3VuZF9hbm9uKHN0cnVjdCBwYWdlICpwYWdl KQoreworCWlmIChQYWdlVHJhbnNDb21wb3VuZChwYWdlKSkgeworCQlzdHJ1Y3QgcGFnZSAqaGVh ZCA9IGNvbXBvdW5kX2hlYWQocGFnZSk7CisJCS8qCisJCSAqIGhlYWQgbWF5IGFjdHVhbGx5IGJl IHNwbGl0dGVkIGFuZCBmcmVlZCBmcm9tIHVuZGVyCisJCSAqIHVzIGJ1dCBpdCdzIG9rIGhlcmUu CisJCSAqLworCQlpZiAoUGFnZUFub24oaGVhZCkpCisJCQlyZXR1cm4gaGVhZDsKKwl9CisJcmV0 dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcGFnZV90cmFuc19jb21wb3VuZF9hbm9uX3NwbGl0 KHN0cnVjdCBwYWdlICpwYWdlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBwYWdlICp0cmFu c2h1Z2VfaGVhZCA9IHBhZ2VfdHJhbnNfY29tcG91bmRfYW5vbihwYWdlKTsKKwlpZiAodHJhbnNo dWdlX2hlYWQpIHsKKwkJLyogR2V0IHRoZSByZWZlcmVuY2Ugb24gdGhlIGhlYWQgdG8gc3BsaXQg aXQuICovCisJCWlmIChnZXRfcGFnZV91bmxlc3NfemVybyh0cmFuc2h1Z2VfaGVhZCkpIHsKKwkJ CS8qCisJCQkgKiBSZWNoZWNrIHdlIGdvdCB0aGUgcmVmZXJlbmNlIHdoaWxlIHRoZSBoZWFkCisJ CQkgKiB3YXMgc3RpbGwgYW5vbnltb3VzLgorCQkJICovCisJCQlpZiAoUGFnZUFub24odHJhbnNo dWdlX2hlYWQpKQorCQkJCXJldCA9IHNwbGl0X2h1Z2VfcGFnZSh0cmFuc2h1Z2VfaGVhZCk7CisJ CQllbHNlCisJCQkJLyoKKwkJCQkgKiBSZXRyeSBsYXRlciBpZiBzcGxpdF9odWdlX3BhZ2UgcnVu CisJCQkJICogZnJvbSB1bmRlciB1cy4KKwkJCQkgKi8KKwkJCQlyZXQgPSAxOworCQkJcHV0X3Bh Z2UodHJhbnNodWdlX2hlYWQpOworCQl9IGVsc2UKKwkJCS8qIFJldHJ5IGxhdGVyIGlmIHNwbGl0 X2h1Z2VfcGFnZSBydW4gZnJvbSB1bmRlciB1cy4gKi8KKwkJCXJldCA9IDE7CisJfQorCXJldHVy biByZXQ7Cit9CisKKy8qKgorICogVHJ5IHRvIG1lcmdlIGEgcm1hcF9pdGVtLnBhZ2Ugd2l0aCBh IGtwYWdlIGluIHN0YWJsZSBub2RlLiBrcGFnZSBtdXN0CisgKiBhbHJlYWR5IGJlIGEga3NtIHBh Z2UuCisgKgorICogQHJldHVybiAwIGlmIHRoZSBwYWdlcyB3ZXJlIG1lcmdlZCwgLUVGQVVMVCBv dGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgdHJ5X3RvX21lcmdlX3dpdGhfdWtzbV9wYWdlKHN0 cnVjdCBybWFwX2l0ZW0gKnJtYXBfaXRlbSwKKwkJCQkgICAgICBzdHJ1Y3QgcGFnZSAqa3BhZ2Us IHUzMiBoYXNoKQoreworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gcm1hcF9pdGVtLT5z bG90LT52bWE7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCXB0ZV90IG9y aWdfcHRlID0gX19wdGUoMCk7CisJaW50IGVyciA9IE1FUkdFX0VSUl9QR0VSUjsKKwlzdHJ1Y3Qg cGFnZSAqcGFnZTsKKworCWlmICh1a3NtX3Rlc3RfZXhpdChtbSkpCisJCWdvdG8gb3V0OworCisJ cGFnZSA9IHJtYXBfaXRlbS0+cGFnZTsKKworCWlmIChwYWdlID09IGtwYWdlKSB7IC8qIGtzbSBw YWdlIGZvcmtlZCAqLworCQllcnIgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoUGFnZVRy YW5zQ29tcG91bmQocGFnZSkgJiYgcGFnZV90cmFuc19jb21wb3VuZF9hbm9uX3NwbGl0KHBhZ2Up KQorCQlnb3RvIG91dDsKKwlCVUdfT04oUGFnZVRyYW5zQ29tcG91bmQocGFnZSkpOworCisJaWYg KCFQYWdlQW5vbihwYWdlKSB8fCAhUGFnZUtzbShrcGFnZSkpCisJCWdvdG8gb3V0OworCisJLyoK KwkgKiBXZSBuZWVkIHRoZSBwYWdlIGxvY2sgdG8gcmVhZCBhIHN0YWJsZSBQYWdlU3dhcENhY2hl IGluCisJICogd3JpdGVfcHJvdGVjdF9wYWdlKCkuICBXZSB1c2UgdHJ5bG9ja19wYWdlKCkgaW5z dGVhZCBvZgorCSAqIGxvY2tfcGFnZSgpIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byB3YWl0IGhl cmUgLSB3ZQorCSAqIHByZWZlciB0byBjb250aW51ZSBzY2FubmluZyBhbmQgbWVyZ2luZyBkaWZm ZXJlbnQgcGFnZXMsCisJICogdGhlbiBjb21lIGJhY2sgdG8gdGhpcyBwYWdlIHdoZW4gaXQgaXMg dW5sb2NrZWQuCisJICovCisJaWYgKCF0cnlsb2NrX3BhZ2UocGFnZSkpCisJCWdvdG8gb3V0Owor CS8qCisJICogSWYgdGhpcyBhbm9ueW1vdXMgcGFnZSBpcyBtYXBwZWQgb25seSBoZXJlLCBpdHMg cHRlIG1heSBuZWVkCisJICogdG8gYmUgd3JpdGUtcHJvdGVjdGVkLiAgSWYgaXQncyBtYXBwZWQg ZWxzZXdoZXJlLCBhbGwgb2YgaXRzCisJICogcHRlcyBhcmUgbmVjZXNzYXJpbHkgYWxyZWFkeSB3 cml0ZS1wcm90ZWN0ZWQuICBCdXQgaW4gZWl0aGVyCisJICogY2FzZSwgd2UgbmVlZCB0byBsb2Nr IGFuZCBjaGVjayBwYWdlX2NvdW50IGlzIG5vdCByYWlzZWQuCisJICovCisJaWYgKHdyaXRlX3By b3RlY3RfcGFnZSh2bWEsIHBhZ2UsICZvcmlnX3B0ZSwgTlVMTCkgPT0gMCkgeworCQlpZiAocGFn ZXNfaWRlbnRpY2FsKHBhZ2UsIGtwYWdlKSkKKwkJCWVyciA9IHJlcGxhY2VfcGFnZSh2bWEsIHBh Z2UsIGtwYWdlLCBvcmlnX3B0ZSk7CisJCWVsc2UKKwkJCWVyciA9IGNoZWNrX2NvbGxpc2lvbihy bWFwX2l0ZW0sIGhhc2gpOworCX0KKworCWlmICgodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkg JiYga3BhZ2UgJiYgIWVycikgeworCQltdW5sb2NrX3ZtYV9wYWdlKHBhZ2UpOworCQlpZiAoIVBh Z2VNbG9ja2VkKGtwYWdlKSkgeworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlsb2NrX3BhZ2Uo a3BhZ2UpOworCQkJbWxvY2tfdm1hX3BhZ2Uoa3BhZ2UpOworCQkJcGFnZSA9IGtwYWdlOwkJLyog Zm9yIGZpbmFsIHVubG9jayAqLworCQl9CisJfQorCisJdW5sb2NrX3BhZ2UocGFnZSk7CitvdXQ6 CisJcmV0dXJuIGVycjsKK30KKworCisKKy8qKgorICogSWYgdHdvIHBhZ2VzIGZhaWwgdG8gbWVy Z2UgaW4gdHJ5X3RvX21lcmdlX3R3b19wYWdlcywgdGhlbiB3ZSBoYXZlIGEgY2hhbmNlCisgKiB0 byByZXN0b3JlIGEgcGFnZSBtYXBwaW5nIHRoYXQgaGFzIGJlZW4gY2hhbmdlZCBpbiB0cnlfdG9f bWVyZ2VfdHdvX3BhZ2VzLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitzdGF0 aWMgaW50IHJlc3RvcmVfdWtzbV9wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwg dW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgICBwdGVfdCBvcmlnX3B0ZSwgcHRlX3Qgd3BydF9w dGUpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCXBnZF90ICpwZ2Q7 CisJcHVkX3QgKnB1ZDsKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwdGVwOworCXNwaW5sb2NrX3Qg KnB0bDsKKworCWludCBlcnIgPSAtRUZBVUxUOworCisJcGdkID0gcGdkX29mZnNldChtbSwgYWRk cik7CisJaWYgKCFwZ2RfcHJlc2VudCgqcGdkKSkKKwkJZ290byBvdXQ7CisKKwlwdWQgPSBwdWRf b2Zmc2V0KHBnZCwgYWRkcik7CisJaWYgKCFwdWRfcHJlc2VudCgqcHVkKSkKKwkJZ290byBvdXQ7 CisKKwlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7CisJaWYgKCFwbWRfcHJlc2VudCgqcG1k KSkKKwkJZ290byBvdXQ7CisKKwlwdGVwID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBh ZGRyLCAmcHRsKTsKKwlpZiAoIXB0ZV9zYW1lKCpwdGVwLCB3cHJ0X3B0ZSkpIHsKKwkJLyogYWxy ZWFkeSBjb3BpZWQsIGxldCBpdCBiZSAqLworCQlwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7 CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogR29vZCBib3ksIHN0aWxsIGhlcmUuIFdoZW4g d2Ugc3RpbGwgZ2V0IHRoZSBrc20gcGFnZSwgaXQgZG9lcyBub3QKKwkgKiByZXR1cm4gdG8gdGhl IGZyZWUgcGFnZSBwb29sLCB0aGVyZSBpcyBubyB3YXkgdGhhdCBhIHB0ZSB3YXMgY2hhbmdlZAor CSAqIHRvIG90aGVyIHBhZ2UgYW5kIGdldHMgYmFjayB0byB0aGlzIHBhZ2UuIEFuZCByZW1pbmQg dGhhdCBrc20gcGFnZQorCSAqIGRvIG5vdCByZXVzZSBpbiBkb193cF9wYWdlKCkuIFNvIGl0J3Mg c2FmZSB0byByZXN0b3JlIHRoZSBvcmlnaW5hbAorCSAqIHB0ZS4KKwkgKi8KKwlmbHVzaF9jYWNo ZV9wYWdlKHZtYSwgYWRkciwgcHRlX3BmbigqcHRlcCkpOworCXB0ZXBfY2xlYXJfZmx1c2godm1h LCBhZGRyLCBwdGVwKTsKKwlzZXRfcHRlX2F0X25vdGlmeShtbSwgYWRkciwgcHRlcCwgb3JpZ19w dGUpOworCisJcHRlX3VubWFwX3VubG9jayhwdGVwLCBwdGwpOworCWVyciA9IDA7CitvdXQ6CisJ cmV0dXJuIGVycjsKK30KKworLyoqCisgKiB0cnlfdG9fbWVyZ2VfdHdvX3BhZ2VzKCkgLSB0YWtl IHR3byBpZGVudGljYWwgcGFnZXMgYW5kIHByZXBhcmUKKyAqIHRoZW0gdG8gYmUgbWVyZ2VkIGlu dG8gb25lIHBhZ2Uocm1hcF9pdGVtLT5wYWdlKQorICoKKyAqIEByZXR1cm4gMCBpZiB3ZSBzdWNj ZXNzZnVsbHkgbWVyZ2VkIHR3byBpZGVudGljYWwgcGFnZXMgaW50bworICogICAgICAgICBvbmUg a3NtIHBhZ2UuIE1FUkdFX0VSUl9DT0xMSSBpZiBpdCdzIG9ubHkgYSBoYXNoIGNvbGxpc2lvbgor ICogICAgICAgICBzZWFyY2ggaW4gcmJ0cmVlLiBNRVJHRV9FUlJfQ0hBTkdFRCBpZiBybWFwX2l0 ZW0gaGFzIGJlZW4KKyAqICAgICAgICAgY2hhbmdlZCBzaW5jZSBpdCdzIGhhc2hlZC4gTUVSR0Vf RVJSX1BHRVJSIG90aGVyd2lzZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgdHJ5X3RvX21lcmdlX3R3 b19wYWdlcyhzdHJ1Y3Qgcm1hcF9pdGVtICpybWFwX2l0ZW0sCisJCQkJICBzdHJ1Y3Qgcm1hcF9p dGVtICp0cmVlX3JtYXBfaXRlbSwKKwkJCQkgIHUzMiBoYXNoKQoreworCXB0ZV90IG9yaWdfcHRl MSA9IF9fcHRlKDApLCBvcmlnX3B0ZTIgPSBfX3B0ZSgwKTsKKwlwdGVfdCB3cHJ0X3B0ZTEgPSBf X3B0ZSgwKSwgd3BydF9wdGUyID0gX19wdGUoMCk7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2 bWExID0gcm1hcF9pdGVtLT5zbG90LT52bWE7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEy ID0gdHJlZV9ybWFwX2l0ZW0tPnNsb3QtPnZtYTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJtYXBf aXRlbS0+cGFnZTsKKwlzdHJ1Y3QgcGFnZSAqdHJlZV9wYWdlID0gdHJlZV9ybWFwX2l0ZW0tPnBh Z2U7CisJaW50IGVyciA9IE1FUkdFX0VSUl9QR0VSUjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAq c2F2ZWRfbWFwcGluZzsKKworCisJaWYgKHJtYXBfaXRlbS0+cGFnZSA9PSB0cmVlX3JtYXBfaXRl bS0+cGFnZSkKKwkJZ290byBvdXQ7CisKKwlpZiAoUGFnZVRyYW5zQ29tcG91bmQocGFnZSkgJiYg cGFnZV90cmFuc19jb21wb3VuZF9hbm9uX3NwbGl0KHBhZ2UpKQorCQlnb3RvIG91dDsKKwlCVUdf T04oUGFnZVRyYW5zQ29tcG91bmQocGFnZSkpOworCisJaWYgKFBhZ2VUcmFuc0NvbXBvdW5kKHRy ZWVfcGFnZSkgJiYgcGFnZV90cmFuc19jb21wb3VuZF9hbm9uX3NwbGl0KHRyZWVfcGFnZSkpCisJ CWdvdG8gb3V0OworCUJVR19PTihQYWdlVHJhbnNDb21wb3VuZCh0cmVlX3BhZ2UpKTsKKworCWlm ICghUGFnZUFub24ocGFnZSkgfHwgIVBhZ2VBbm9uKHRyZWVfcGFnZSkpCisJCWdvdG8gb3V0Owor CisJaWYgKCF0cnlsb2NrX3BhZ2UocGFnZSkpCisJCWdvdG8gb3V0OworCisKKwlpZiAod3JpdGVf cHJvdGVjdF9wYWdlKHZtYTEsIHBhZ2UsICZ3cHJ0X3B0ZTEsICZvcmlnX3B0ZTEpICE9IDApIHsK KwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogV2hpbGUg d2UgaG9sZCBwYWdlIGxvY2ssIHVwZ3JhZGUgcGFnZSBmcm9tCisJICogUGFnZUFub24rYW5vbl92 bWEgdG8gUGFnZUtzbStOVUxMIHN0YWJsZV9ub2RlOgorCSAqIHN0YWJsZV90cmVlX2luc2VydCgp IHdpbGwgdXBkYXRlIHN0YWJsZV9ub2RlLgorCSAqLworCXNhdmVkX21hcHBpbmcgPSBwYWdlLT5t YXBwaW5nOworCXNldF9wYWdlX3N0YWJsZV9ub2RlKHBhZ2UsIE5VTEwpOworCW1hcmtfcGFnZV9h Y2Nlc3NlZChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKworCWlmICghdHJ5bG9ja19wYWdl KHRyZWVfcGFnZSkpCisJCWdvdG8gcmVzdG9yZV9vdXQ7CisKKwlpZiAod3JpdGVfcHJvdGVjdF9w YWdlKHZtYTIsIHRyZWVfcGFnZSwgJndwcnRfcHRlMiwgJm9yaWdfcHRlMikgIT0gMCkgeworCQl1 bmxvY2tfcGFnZSh0cmVlX3BhZ2UpOworCQlnb3RvIHJlc3RvcmVfb3V0OworCX0KKworCWlmIChw YWdlc19pZGVudGljYWwocGFnZSwgdHJlZV9wYWdlKSkgeworCQllcnIgPSByZXBsYWNlX3BhZ2Uo dm1hMiwgdHJlZV9wYWdlLCBwYWdlLCB3cHJ0X3B0ZTIpOworCQlpZiAoZXJyKSB7CisJCQl1bmxv Y2tfcGFnZSh0cmVlX3BhZ2UpOworCQkJZ290byByZXN0b3JlX291dDsKKwkJfQorCisJCWlmICgo dm1hMi0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpKSB7CisJCQltdW5sb2NrX3ZtYV9wYWdlKHRyZWVf cGFnZSk7CisJCQlpZiAoIVBhZ2VNbG9ja2VkKHBhZ2UpKSB7CisJCQkJdW5sb2NrX3BhZ2UodHJl ZV9wYWdlKTsKKwkJCQlsb2NrX3BhZ2UocGFnZSk7CisJCQkJbWxvY2tfdm1hX3BhZ2UocGFnZSk7 CisJCQkJdHJlZV9wYWdlID0gcGFnZTsgLyogZm9yIGZpbmFsIHVubG9jayAqLworCQkJfQorCQl9 CisKKwkJdW5sb2NrX3BhZ2UodHJlZV9wYWdlKTsKKworCQlnb3RvIG91dDsgLyogc3VjY2VzcyAq LworCisJfSBlbHNlIHsKKwkJaWYgKHRyZWVfcm1hcF9pdGVtLT5oYXNoX21heCAmJgorCQkgICAg dHJlZV9ybWFwX2l0ZW0tPmhhc2hfbWF4ID09IHJtYXBfaXRlbS0+aGFzaF9tYXgpIHsKKwkJCWVy ciA9IE1FUkdFX0VSUl9DT0xMSV9NQVg7CisJCX0gZWxzZSBpZiAocGFnZV9oYXNoKHBhZ2UsIGhh c2hfc3RyZW5ndGgsIDApID09CisJCSAgICBwYWdlX2hhc2godHJlZV9wYWdlLCBoYXNoX3N0cmVu Z3RoLCAwKSkgeworCQkJaW5jX3JzaGFzaF9uZWcobWVtY21wX2Nvc3QgKyBoYXNoX3N0cmVuZ3Ro ICogMik7CisJCQllcnIgPSBNRVJHRV9FUlJfQ09MTEk7CisJCX0gZWxzZSB7CisJCQllcnIgPSBN RVJHRV9FUlJfQ0hBTkdFRDsKKwkJfQorCisJCXVubG9ja19wYWdlKHRyZWVfcGFnZSk7CisJfQor CityZXN0b3JlX291dDoKKwlsb2NrX3BhZ2UocGFnZSk7CisJaWYgKCFyZXN0b3JlX3Vrc21fcGFn ZV9wdGUodm1hMSwgZ2V0X3JtYXBfYWRkcihybWFwX2l0ZW0pLAorCQkJCSAgb3JpZ19wdGUxLCB3 cHJ0X3B0ZTEpKQorCQlwYWdlLT5tYXBwaW5nID0gc2F2ZWRfbWFwcGluZzsKKworCXVubG9ja19w YWdlKHBhZ2UpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhh c2hfY21wKHUzMiBuZXdfdmFsLCB1MzIgbm9kZV92YWwpCit7CisJaWYgKG5ld192YWwgPiBub2Rl X3ZhbCkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAobmV3X3ZhbCA8IG5vZGVfdmFsKQorCQlyZXR1 cm4gLTE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1MzIgcm1hcF9p dGVtX2hhc2hfbWF4KHN0cnVjdCBybWFwX2l0ZW0gKml0ZW0sIHUzMiBoYXNoKQoreworCXUzMiBo YXNoX21heCA9IGl0ZW0tPmhhc2hfbWF4OworCisJaWYgKCFoYXNoX21heCkgeworCQloYXNoX21h eCA9IHBhZ2VfaGFzaF9tYXgoaXRlbS0+cGFnZSwgaGFzaCk7CisKKwkJaXRlbS0+aGFzaF9tYXgg PSBoYXNoX21heDsKKwl9CisKKwlyZXR1cm4gaGFzaF9tYXg7Cit9CisKKworCisvKioKKyAqIHN0 YWJsZV90cmVlX3NlYXJjaCgpIC0gc2VhcmNoIHRoZSBzdGFibGUgdHJlZSBmb3IgYSBwYWdlCisg KgorICogQGl0ZW06IAl0aGUgcm1hcF9pdGVtIHdlIGFyZSBjb21wYXJpbmcgd2l0aAorICogQGhh c2g6IAl0aGUgaGFzaCB2YWx1ZSBvZiB0aGlzIGl0ZW0tPnBhZ2UgYWxyZWFkeSBjYWxjdWxhdGVk CisgKgorICogQHJldHVybiAJdGhlIHBhZ2Ugd2UgaGF2ZSBmb3VuZCwgTlVMTCBvdGhlcndpc2Uu IFRoZSBwYWdlIHJldHVybmVkIGhhcworICogICAgICAgICAJYmVlbiBnb3R0ZW4uCisgKi8KK3N0 YXRpYyBzdHJ1Y3QgcGFnZSAqc3RhYmxlX3RyZWVfc2VhcmNoKHN0cnVjdCBybWFwX2l0ZW0gKml0 ZW0sIHUzMiBoYXNoKQoreworCXN0cnVjdCByYl9ub2RlICpub2RlID0gcm9vdF9zdGFibGVfdHJl ZXAtPnJiX25vZGU7CisJc3RydWN0IHRyZWVfbm9kZSAqdHJlZV9ub2RlOworCXVuc2lnbmVkIGxv bmcgaGFzaF9tYXg7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBpdGVtLT5wYWdlOworCXN0cnVjdCBz dGFibGVfbm9kZSAqc3RhYmxlX25vZGU7CisKKwlzdGFibGVfbm9kZSA9IHBhZ2Vfc3RhYmxlX25v ZGUocGFnZSk7CisJaWYgKHN0YWJsZV9ub2RlKSB7CisJCS8qIGtzbSBwYWdlIGZvcmtlZCwgdGhh dCBpcworCQkgKiBpZiAoUGFnZUtzbShwYWdlKSAmJiAhaW5fc3RhYmxlX3RyZWUocm1hcF9pdGVt KSkKKwkJICogaXQncyBhY3R1YWxseSBnb3R0ZW4gb25jZSBvdXRzaWRlLgorCQkgKi8KKwkJZ2V0 X3BhZ2UocGFnZSk7CisJCXJldHVybiBwYWdlOworCX0KKworCXdoaWxlIChub2RlKSB7CisJCWlu dCBjbXA7CisKKwkJdHJlZV9ub2RlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IHRyZWVfbm9kZSwg bm9kZSk7CisKKwkJY21wID0gaGFzaF9jbXAoaGFzaCwgdHJlZV9ub2RlLT5oYXNoKTsKKworCQlp ZiAoY21wIDwgMCkKKwkJCW5vZGUgPSBub2RlLT5yYl9sZWZ0OworCQllbHNlIGlmIChjbXAgPiAw KQorCQkJbm9kZSA9IG5vZGUtPnJiX3JpZ2h0OworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwlp ZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOworCisJaWYgKHRyZWVfbm9kZS0+Y291bnQgPT0gMSkg eworCQlzdGFibGVfbm9kZSA9IHJiX2VudHJ5KHRyZWVfbm9kZS0+c3ViX3Jvb3QucmJfbm9kZSwK KwkJCQkgICAgICAgc3RydWN0IHN0YWJsZV9ub2RlLCBub2RlKTsKKwkJQlVHX09OKCFzdGFibGVf bm9kZSk7CisKKwkJZ290byBnZXRfcGFnZV9vdXQ7CisJfQorCisJLyoKKwkgKiBvaywgd2UgaGF2 ZSB0byBzZWFyY2ggdGhlIHNlY29uZAorCSAqIGxldmVsIHN1YnRyZWUsIGhhc2ggdGhlIHBhZ2Ug dG8gYQorCSAqIGZ1bGwgc3RyZW5ndGguCisJICovCisJbm9kZSA9IHRyZWVfbm9kZS0+c3ViX3Jv b3QucmJfbm9kZTsKKwlCVUdfT04oIW5vZGUpOworCWhhc2hfbWF4ID0gcm1hcF9pdGVtX2hhc2hf bWF4KGl0ZW0sIGhhc2gpOworCisJd2hpbGUgKG5vZGUpIHsKKwkJaW50IGNtcDsKKworCQlzdGFi bGVfbm9kZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBzdGFibGVfbm9kZSwgbm9kZSk7CisKKwkJ Y21wID0gaGFzaF9jbXAoaGFzaF9tYXgsIHN0YWJsZV9ub2RlLT5oYXNoX21heCk7CisKKwkJaWYg KGNtcCA8IDApCisJCQlub2RlID0gbm9kZS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoY21wID4gMCkK KwkJCW5vZGUgPSBub2RlLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJZ290byBnZXRfcGFnZV9vdXQ7 CisJfQorCisJcmV0dXJuIE5VTEw7CisKK2dldF9wYWdlX291dDoKKwlwYWdlID0gZ2V0X3Vrc21f cGFnZShzdGFibGVfbm9kZSwgMSwgMSk7CisJcmV0dXJuIHBhZ2U7Cit9CisKK3N0YXRpYyBpbnQg dHJ5X21lcmdlX3JtYXBfaXRlbShzdHJ1Y3Qgcm1hcF9pdGVtICppdGVtLAorCQkJICAgICAgIHN0 cnVjdCBwYWdlICprcGFnZSwKKwkJCSAgICAgICBzdHJ1Y3QgcGFnZSAqdHJlZV9wYWdlKQorewor CXNwaW5sb2NrX3QgKnB0bDsKKwlwdGVfdCAqcHRlcDsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJ c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBpdGVtLT5zbG90LT52bWE7CisKKwlhZGRyID0g Z2V0X3JtYXBfYWRkcihpdGVtKTsKKwlwdGVwID0gcGFnZV9jaGVja19hZGRyZXNzKGtwYWdlLCB2 bWEtPnZtX21tLCBhZGRyLCAmcHRsLCAwKTsKKwlpZiAoIXB0ZXApCisJCXJldHVybiAwOworCisJ aWYgKHB0ZV93cml0ZSgqcHRlcCkpIHsKKwkJLyogaGFzIGNoYW5nZWQsIGFib3J0ISAqLworCQlw dGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7CisJCXJldHVybiAwOworCX0KKworCWdldF9wYWdl KHRyZWVfcGFnZSk7CisJcGFnZV9hZGRfYW5vbl9ybWFwKHRyZWVfcGFnZSwgdm1hLCBhZGRyKTsK KworCWZsdXNoX2NhY2hlX3BhZ2Uodm1hLCBhZGRyLCBwdGVfcGZuKCpwdGVwKSk7CisJcHRlcF9j bGVhcl9mbHVzaCh2bWEsIGFkZHIsIHB0ZXApOworCXNldF9wdGVfYXRfbm90aWZ5KHZtYS0+dm1f bW0sIGFkZHIsIHB0ZXAsCisJCQkgIG1rX3B0ZSh0cmVlX3BhZ2UsIHZtYS0+dm1fcGFnZV9wcm90 KSk7CisKKwlwYWdlX3JlbW92ZV9ybWFwKGtwYWdlKTsKKwlwdXRfcGFnZShrcGFnZSk7CisKKwlw dGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiB0 cnlfdG9fbWVyZ2Vfd2l0aF9zdGFibGVfcGFnZSgpIC0gd2hlbiB0d28gcm1hcF9pdGVtcyBuZWVk IHRvIGJlIGluc2VydGVkCisgKiBpbnRvIHN0YWJsZSB0cmVlLCB0aGUgcGFnZSB3YXMgZm91bmQg dG8gYmUgaWRlbnRpY2FsIHRvIGEgc3RhYmxlIGtzbSBwYWdlLAorICogdGhpcyBpcyB0aGUgbGFz dCBjaGFuY2Ugd2UgY2FuIG1lcmdlIHRoZW0gaW50byBvbmUuCisgKgorICogQGl0ZW0xOgl0aGUg cm1hcF9pdGVtIGhvbGRpbmcgdGhlIHBhZ2Ugd2hpY2ggd2Ugd2FudGVkIHRvIGluc2VydAorICog ICAgICAgCWludG8gc3RhYmxlIHRyZWUuCisgKiBAaXRlbTI6CXRoZSBvdGhlciBybWFwX2l0ZW0g d2UgZm91bmQgd2hlbiB1bnN0YWJsZSB0cmVlIHNlYXJjaAorICogQG9sZHBhZ2U6CXRoZSBwYWdl IGN1cnJlbnRseSBtYXBwZWQgYnkgdGhlIHR3byBybWFwX2l0ZW1zCisgKiBAdHJlZV9wYWdlOiAJ dGhlIHBhZ2Ugd2UgZm91bmQgaWRlbnRpY2FsIGluIHN0YWJsZSB0cmVlIG5vZGUKKyAqIEBzdWNj ZXNzMToJcmV0dXJuIGlmIGl0ZW0xIGlzIHN1Y2Nlc3NmdWxseSBtZXJnZWQKKyAqIEBzdWNjZXNz MjoJcmV0dXJuIGlmIGl0ZW0yIGlzIHN1Y2Nlc3NmdWxseSBtZXJnZWQKKyAqLworc3RhdGljIHZv aWQgdHJ5X21lcmdlX3dpdGhfc3RhYmxlKHN0cnVjdCBybWFwX2l0ZW0gKml0ZW0xLAorCQkJCSAg c3RydWN0IHJtYXBfaXRlbSAqaXRlbTIsCisJCQkJICBzdHJ1Y3QgcGFnZSAqKmtwYWdlLAorCQkJ CSAgc3RydWN0IHBhZ2UgKnRyZWVfcGFnZSwKKwkJCQkgIGludCAqc3VjY2VzczEsIGludCAqc3Vj Y2VzczIpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWExID0gaXRlbTEtPnNsb3QtPnZt YTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTIgPSBpdGVtMi0+c2xvdC0+dm1hOworCSpz dWNjZXNzMSA9IDA7CisJKnN1Y2Nlc3MyID0gMDsKKworCWlmICh1bmxpa2VseSgqa3BhZ2UgPT0g dHJlZV9wYWdlKSkgeworCQkvKiBJIGRvbid0IHRoaW5rIHRoaXMgY2FuIHJlYWxseSBoYXBwZW4g Ki8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVUtTTTogdW5leHBlY3RlZCBjb25kaXRpb24gZGV0 ZWN0ZWQgaW4gIgorCQkJInRyeV9tZXJnZV93aXRoX3N0YWJsZSgpIC0tICprcGFnZSA9PSB0cmVl X3BhZ2UgIVxuIik7CisJCSpzdWNjZXNzMSA9IDE7CisJCSpzdWNjZXNzMiA9IDE7CisJCXJldHVy bjsKKwl9CisKKwlpZiAoIVBhZ2VBbm9uKCprcGFnZSkgfHwgIVBhZ2VLc20oKmtwYWdlKSkKKwkJ Z290byBmYWlsZWQ7CisKKwlpZiAoIXRyeWxvY2tfcGFnZSh0cmVlX3BhZ2UpKQorCQlnb3RvIGZh aWxlZDsKKworCS8qIElmIHRoZSBvbGRwYWdlIGlzIHN0aWxsIGtzbSBhbmQgc3RpbGwgcG9pbnRl ZAorCSAqIHRvIGluIHRoZSByaWdodCBwbGFjZSwgYW5kIHN0aWxsIHdyaXRlIHByb3RlY3RlZCwK KwkgKiB3ZSBhcmUgY29uZmlkZW50IGl0J3Mgbm90IGNoYW5nZWQsIG5vIG5lZWQgdG8KKwkgKiBt ZW1jbXAgYW55bW9yZS4KKwkgKiBiZSB3YXJlLCB3ZSBjYW5ub3QgdGFrZSBuZXN0ZWQgcHRlIGxv Y2tzLAorCSAqIGRlYWRsb2NrIHJpc2suCisJICovCisJaWYgKCF0cnlfbWVyZ2Vfcm1hcF9pdGVt KGl0ZW0xLCAqa3BhZ2UsIHRyZWVfcGFnZSkpCisJCWdvdG8gdW5sb2NrX2ZhaWxlZDsKKworCS8q IG9rLCB0aGVuIHZtYTIsIHJlbWluZCB0aGF0IHB0ZTEgYWxyZWFkeSBzZXQgKi8KKwlpZiAoIXRy eV9tZXJnZV9ybWFwX2l0ZW0oaXRlbTIsICprcGFnZSwgdHJlZV9wYWdlKSkKKwkJZ290byBzdWNj ZXNzXzE7CisKKwkqc3VjY2VzczIgPSAxOworc3VjY2Vzc18xOgorCSpzdWNjZXNzMSA9IDE7CisK KworCWlmICgoKnN1Y2Nlc3MxICYmIHZtYTEtPnZtX2ZsYWdzICYgVk1fTE9DS0VEKSB8fAorCSAg ICAoKnN1Y2Nlc3MyICYmIHZtYTItPnZtX2ZsYWdzICYgVk1fTE9DS0VEKSkgeworCQltdW5sb2Nr X3ZtYV9wYWdlKCprcGFnZSk7CisJCWlmICghUGFnZU1sb2NrZWQodHJlZV9wYWdlKSkKKwkJCW1s b2NrX3ZtYV9wYWdlKHRyZWVfcGFnZSk7CisJfQorCisJLyoKKwkgKiBXZSBkbyBub3QgbmVlZCBv bGRwYWdlIGFueSBtb3JlIGluIHRoZSBjYWxsZXIsIHNvIGNhbiBicmVhayB0aGUgbG9jaworCSAq IG5vdy4KKwkgKi8KKwl1bmxvY2tfcGFnZSgqa3BhZ2UpOworCSprcGFnZSA9IHRyZWVfcGFnZTsg LyogR2V0IHVubG9ja2VkIG91dHNpZGUuICovCisJcmV0dXJuOworCit1bmxvY2tfZmFpbGVkOgor CXVubG9ja19wYWdlKHRyZWVfcGFnZSk7CitmYWlsZWQ6CisJcmV0dXJuOworfQorCitzdGF0aWMg aW5saW5lIHZvaWQgc3RhYmxlX25vZGVfaGFzaF9tYXgoc3RydWN0IHN0YWJsZV9ub2RlICpub2Rl LAorCQkJCQkgc3RydWN0IHBhZ2UgKnBhZ2UsIHUzMiBoYXNoKQoreworCXUzMiBoYXNoX21heCA9 IG5vZGUtPmhhc2hfbWF4OworCisJaWYgKCFoYXNoX21heCkgeworCQloYXNoX21heCA9IHBhZ2Vf aGFzaF9tYXgocGFnZSwgaGFzaCk7CisJCW5vZGUtPmhhc2hfbWF4ID0gaGFzaF9tYXg7CisJfQor fQorCitzdGF0aWMgaW5saW5lCitzdHJ1Y3Qgc3RhYmxlX25vZGUgKm5ld19zdGFibGVfbm9kZShz dHJ1Y3QgdHJlZV9ub2RlICp0cmVlX25vZGUsCisJCQkJICAgIHN0cnVjdCBwYWdlICprcGFnZSwg dTMyIGhhc2hfbWF4KQoreworCXN0cnVjdCBzdGFibGVfbm9kZSAqbmV3X3N0YWJsZV9ub2RlOwor CisJbmV3X3N0YWJsZV9ub2RlID0gYWxsb2Nfc3RhYmxlX25vZGUoKTsKKwlpZiAoIW5ld19zdGFi bGVfbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwluZXdfc3RhYmxlX25vZGUtPmtwZm4gPSBwYWdl X3RvX3BmbihrcGFnZSk7CisJbmV3X3N0YWJsZV9ub2RlLT5oYXNoX21heCA9IGhhc2hfbWF4Owor CW5ld19zdGFibGVfbm9kZS0+dHJlZV9ub2RlID0gdHJlZV9ub2RlOworCXNldF9wYWdlX3N0YWJs ZV9ub2RlKGtwYWdlLCBuZXdfc3RhYmxlX25vZGUpOworCisJcmV0dXJuIG5ld19zdGFibGVfbm9k ZTsKK30KKworc3RhdGljIGlubGluZQorc3RydWN0IHN0YWJsZV9ub2RlICpmaXJzdF9sZXZlbF9p bnNlcnQoc3RydWN0IHRyZWVfbm9kZSAqdHJlZV9ub2RlLAorCQkJCSAgICAgICBzdHJ1Y3Qgcm1h cF9pdGVtICpybWFwX2l0ZW0sCisJCQkJICAgICAgIHN0cnVjdCBybWFwX2l0ZW0gKnRyZWVfcm1h cF9pdGVtLAorCQkJCSAgICAgICBzdHJ1Y3QgcGFnZSAqKmtwYWdlLCB1MzIgaGFzaCwKKwkJCQkg ICAgICAgaW50ICpzdWNjZXNzMSwgaW50ICpzdWNjZXNzMikKK3sKKwlpbnQgY21wOworCXN0cnVj dCBwYWdlICp0cmVlX3BhZ2U7CisJdTMyIGhhc2hfbWF4ID0gMDsKKwlzdHJ1Y3Qgc3RhYmxlX25v ZGUgKnN0YWJsZV9ub2RlLCAqbmV3X3Nub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBO VUxMLCAqKm5ldzsKKworCS8qIHRoaXMgdHJlZSBub2RlIGNvbnRhaW5zIG5vIHN1Yi10cmVlIHll dCAqLworCXN0YWJsZV9ub2RlID0gcmJfZW50cnkodHJlZV9ub2RlLT5zdWJfcm9vdC5yYl9ub2Rl LAorCQkJICAgICAgIHN0cnVjdCBzdGFibGVfbm9kZSwgbm9kZSk7CisKKwl0cmVlX3BhZ2UgPSBn ZXRfdWtzbV9wYWdlKHN0YWJsZV9ub2RlLCAxLCAwKTsKKwlpZiAodHJlZV9wYWdlKSB7CisJCWNt cCA9IG1lbWNtcF9wYWdlcygqa3BhZ2UsIHRyZWVfcGFnZSwgMSk7CisJCWlmICghY21wKSB7CisJ CQl0cnlfbWVyZ2Vfd2l0aF9zdGFibGUocm1hcF9pdGVtLCB0cmVlX3JtYXBfaXRlbSwga3BhZ2Us CisJCQkJCSAgICAgIHRyZWVfcGFnZSwgc3VjY2VzczEsIHN1Y2Nlc3MyKTsKKwkJCXB1dF9wYWdl KHRyZWVfcGFnZSk7CisJCQlpZiAoISpzdWNjZXNzMSAmJiAhKnN1Y2Nlc3MyKQorCQkJCWdvdG8g ZmFpbGVkOworCisJCQlyZXR1cm4gc3RhYmxlX25vZGU7CisKKwkJfSBlbHNlIHsKKwkJCS8qCisJ CQkgKiBjb2xsaXNpb24gaW4gZmlyc3QgbGV2ZWwgdHJ5IHRvIGNyZWF0ZSBhIHN1YnRyZWUuCisJ CQkgKiBBIG5ldyBub2RlIG5lZWQgdG8gYmUgY3JlYXRlZC4KKwkJCSAqLworCQkJcHV0X3BhZ2Uo dHJlZV9wYWdlKTsKKworCQkJc3RhYmxlX25vZGVfaGFzaF9tYXgoc3RhYmxlX25vZGUsIHRyZWVf cGFnZSwKKwkJCQkJICAgICB0cmVlX25vZGUtPmhhc2gpOworCQkJaGFzaF9tYXggPSBybWFwX2l0 ZW1faGFzaF9tYXgocm1hcF9pdGVtLCBoYXNoKTsKKwkJCWNtcCA9IGhhc2hfY21wKGhhc2hfbWF4 LCBzdGFibGVfbm9kZS0+aGFzaF9tYXgpOworCisJCQlwYXJlbnQgPSAmc3RhYmxlX25vZGUtPm5v ZGU7CisJCQlpZiAoY21wIDwgMCkgeworCQkJCW5ldyA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCQl9 IGVsc2UgaWYgKGNtcCA+IDApIHsKKwkJCQluZXcgPSAmcGFyZW50LT5yYl9yaWdodDsKKwkJCX0g ZWxzZSB7CisJCQkJZ290byBmYWlsZWQ7CisJCQl9CisJCX0KKworCX0gZWxzZSB7CisJCS8qIHRo ZSBvbmx5IHN0YWJsZV9ub2RlIGRlbGV0ZWQsIHdlIHJldXNlIGl0cyB0cmVlX25vZGUuCisJCSAq LworCQlwYXJlbnQgPSBOVUxMOworCQluZXcgPSAmdHJlZV9ub2RlLT5zdWJfcm9vdC5yYl9ub2Rl OworCX0KKworCW5ld19zbm9kZSA9IG5ld19zdGFibGVfbm9kZSh0cmVlX25vZGUsICprcGFnZSwg aGFzaF9tYXgpOworCWlmICghbmV3X3Nub2RlKQorCQlnb3RvIGZhaWxlZDsKKworCXJiX2xpbmtf bm9kZSgmbmV3X3Nub2RlLT5ub2RlLCBwYXJlbnQsIG5ldyk7CisJcmJfaW5zZXJ0X2NvbG9yKCZu ZXdfc25vZGUtPm5vZGUsICZ0cmVlX25vZGUtPnN1Yl9yb290KTsKKwl0cmVlX25vZGUtPmNvdW50 Kys7CisJKnN1Y2Nlc3MxID0gKnN1Y2Nlc3MyID0gMTsKKworCXJldHVybiBuZXdfc25vZGU7CisK K2ZhaWxlZDoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZQorc3RydWN0IHN0YWJs ZV9ub2RlICpzdGFibGVfc3VidHJlZV9pbnNlcnQoc3RydWN0IHRyZWVfbm9kZSAqdHJlZV9ub2Rl LAorCQkJCQkgIHN0cnVjdCBybWFwX2l0ZW0gKnJtYXBfaXRlbSwKKwkJCQkJICBzdHJ1Y3Qgcm1h cF9pdGVtICp0cmVlX3JtYXBfaXRlbSwKKwkJCQkJICBzdHJ1Y3QgcGFnZSAqKmtwYWdlLCB1MzIg aGFzaCwKKwkJCQkJICBpbnQgKnN1Y2Nlc3MxLCBpbnQgKnN1Y2Nlc3MyKQoreworCXN0cnVjdCBw YWdlICp0cmVlX3BhZ2U7CisJdTMyIGhhc2hfbWF4OworCXN0cnVjdCBzdGFibGVfbm9kZSAqc3Rh YmxlX25vZGUsICpuZXdfc25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipuZXc7CisK K3Jlc2VhcmNoOgorCXBhcmVudCA9IE5VTEw7CisJbmV3ID0gJnRyZWVfbm9kZS0+c3ViX3Jvb3Qu cmJfbm9kZTsKKwlCVUdfT04oISpuZXcpOworCWhhc2hfbWF4ID0gcm1hcF9pdGVtX2hhc2hfbWF4 KHJtYXBfaXRlbSwgaGFzaCk7CisJd2hpbGUgKCpuZXcpIHsKKwkJaW50IGNtcDsKKworCQlzdGFi bGVfbm9kZSA9IHJiX2VudHJ5KCpuZXcsIHN0cnVjdCBzdGFibGVfbm9kZSwgbm9kZSk7CisKKwkJ Y21wID0gaGFzaF9jbXAoaGFzaF9tYXgsIHN0YWJsZV9ub2RlLT5oYXNoX21heCk7CisKKwkJaWYg KGNtcCA8IDApIHsKKwkJCXBhcmVudCA9ICpuZXc7CisJCQluZXcgPSAmcGFyZW50LT5yYl9sZWZ0 OworCQl9IGVsc2UgaWYgKGNtcCA+IDApIHsKKwkJCXBhcmVudCA9ICpuZXc7CisJCQluZXcgPSAm cGFyZW50LT5yYl9yaWdodDsKKwkJfSBlbHNlIHsKKwkJCXRyZWVfcGFnZSA9IGdldF91a3NtX3Bh Z2Uoc3RhYmxlX25vZGUsIDEsIDApOworCQkJaWYgKHRyZWVfcGFnZSkgeworCQkJCWNtcCA9IG1l bWNtcF9wYWdlcygqa3BhZ2UsIHRyZWVfcGFnZSwgMSk7CisJCQkJaWYgKCFjbXApIHsKKwkJCQkJ dHJ5X21lcmdlX3dpdGhfc3RhYmxlKHJtYXBfaXRlbSwKKwkJCQkJCXRyZWVfcm1hcF9pdGVtLCBr cGFnZSwKKwkJCQkJCXRyZWVfcGFnZSwgc3VjY2VzczEsIHN1Y2Nlc3MyKTsKKworCQkJCQlwdXRf cGFnZSh0cmVlX3BhZ2UpOworCQkJCQlpZiAoISpzdWNjZXNzMSAmJiAhKnN1Y2Nlc3MyKQorCQkJ CQkJZ290byBmYWlsZWQ7CisJCQkJCS8qCisJCQkJCSAqIHN1Y2Nlc3NmdWxseSBtZXJnZWQgd2l0 aCBhIHN0YWJsZQorCQkJCQkgKiBub2RlCisJCQkJCSAqLworCQkJCQlyZXR1cm4gc3RhYmxlX25v ZGU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHV0X3BhZ2UodHJlZV9wYWdlKTsKKwkJCQkJZ290byBm YWlsZWQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIHN0YWJsZSBub2RlIG1h eSBiZSBkZWxldGVkLAorCQkJCSAqIGFuZCBzdWJ0cmVlIG1heWJlCisJCQkJICogcmVzdHJ1Y3Rl ZCwgY2Fubm90CisJCQkJICogY29udGludWUsIHJlc2VhcmNoIGl0LgorCQkJCSAqLworCQkJCWlm ICh0cmVlX25vZGUtPmNvdW50KSB7CisJCQkJCWdvdG8gcmVzZWFyY2g7CisJCQkJfSBlbHNlIHsK KwkJCQkJLyogcmV1c2UgdGhlIHRyZWUgbm9kZSovCisJCQkJCXBhcmVudCA9IE5VTEw7CisJCQkJ CW5ldyA9ICZ0cmVlX25vZGUtPnN1Yl9yb290LnJiX25vZGU7CisJCQkJfQorCQkJfQorCQl9CisJ fQorCisJbmV3X3Nub2RlID0gbmV3X3N0YWJsZV9ub2RlKHRyZWVfbm9kZSwgKmtwYWdlLCBoYXNo X21heCk7CisJaWYgKCFuZXdfc25vZGUpCisJCWdvdG8gZmFpbGVkOworCisJcmJfbGlua19ub2Rl KCZuZXdfc25vZGUtPm5vZGUsIHBhcmVudCwgbmV3KTsKKwlyYl9pbnNlcnRfY29sb3IoJm5ld19z bm9kZS0+bm9kZSwgJnRyZWVfbm9kZS0+c3ViX3Jvb3QpOworCXRyZWVfbm9kZS0+Y291bnQrKzsK Kwkqc3VjY2VzczEgPSAqc3VjY2VzczIgPSAxOworCisJcmV0dXJuIG5ld19zbm9kZTsKKworZmFp bGVkOgorCXJldHVybiBOVUxMOworfQorCisKKy8qKgorICogc3RhYmxlX3RyZWVfaW5zZXJ0KCkg LSB0cnkgdG8gaW5zZXJ0IGEgbWVyZ2VkIHBhZ2UgaW4gdW5zdGFibGUgdHJlZSB0bworICogdGhl IHN0YWJsZSB0cmVlCisgKgorICogQGtwYWdlOgkJdGhlIHBhZ2UgbmVlZCB0byBiZSBpbnNlcnRl ZAorICogQGhhc2g6CQl0aGUgY3VycmVudCBoYXNoIG9mIHRoaXMgcGFnZQorICogQHJtYXBfaXRl bToJCXRoZSBybWFwX2l0ZW0gYmVpbmcgc2Nhbm5lZAorICogQHRyZWVfcm1hcF9pdGVtOgl0aGUg cm1hcF9pdGVtIGZvdW5kIG9uIHVuc3RhYmxlIHRyZWUKKyAqIEBzdWNjZXNzMToJCXJldHVybiBp ZiBybWFwX2l0ZW0gaXMgbWVyZ2VkCisgKiBAc3VjY2VzczI6CQlyZXR1cm4gaWYgdHJlZV9ybWFw X2l0ZW0gaXMgbWVyZ2VkCisgKgorICogQHJldHVybiAJCXRoZSBzdGFibGVfbm9kZSBvbiBzdGFi bGUgdHJlZSBpZiBhdCBsZWFzdCBvbmUKKyAqICAgICAgCQlybWFwX2l0ZW0gaXMgaW5zZXJ0ZWQg aW50byBzdGFibGUgdHJlZSwgTlVMTAorICogICAgICAJCW90aGVyd2lzZS4KKyAqLworc3RhdGlj IHN0cnVjdCBzdGFibGVfbm9kZSAqCitzdGFibGVfdHJlZV9pbnNlcnQoc3RydWN0IHBhZ2UgKipr cGFnZSwgdTMyIGhhc2gsCisJCSAgIHN0cnVjdCBybWFwX2l0ZW0gKnJtYXBfaXRlbSwKKwkJICAg c3RydWN0IHJtYXBfaXRlbSAqdHJlZV9ybWFwX2l0ZW0sCisJCSAgIGludCAqc3VjY2VzczEsIGlu dCAqc3VjY2VzczIpCit7CisJc3RydWN0IHJiX25vZGUgKipuZXcgPSAmcm9vdF9zdGFibGVfdHJl ZXAtPnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IHN0 YWJsZV9ub2RlICpzdGFibGVfbm9kZTsKKwlzdHJ1Y3QgdHJlZV9ub2RlICp0cmVlX25vZGU7CisJ dTMyIGhhc2hfbWF4ID0gMDsKKworCSpzdWNjZXNzMSA9ICpzdWNjZXNzMiA9IDA7CisKKwl3aGls ZSAoKm5ldykgeworCQlpbnQgY21wOworCisJCXRyZWVfbm9kZSA9IHJiX2VudHJ5KCpuZXcsIHN0 cnVjdCB0cmVlX25vZGUsIG5vZGUpOworCisJCWNtcCA9IGhhc2hfY21wKGhhc2gsIHRyZWVfbm9k ZS0+aGFzaCk7CisKKwkJaWYgKGNtcCA8IDApIHsKKwkJCXBhcmVudCA9ICpuZXc7CisJCQluZXcg PSAmcGFyZW50LT5yYl9sZWZ0OworCQl9IGVsc2UgaWYgKGNtcCA+IDApIHsKKwkJCXBhcmVudCA9 ICpuZXc7CisJCQluZXcgPSAmcGFyZW50LT5yYl9yaWdodDsKKwkJfSBlbHNlCisJCQlicmVhazsK Kwl9CisKKwlpZiAoKm5ldykgeworCQlpZiAodHJlZV9ub2RlLT5jb3VudCA9PSAxKSB7CisJCQlz dGFibGVfbm9kZSA9IGZpcnN0X2xldmVsX2luc2VydCh0cmVlX25vZGUsIHJtYXBfaXRlbSwKKwkJ CQkJCXRyZWVfcm1hcF9pdGVtLCBrcGFnZSwKKwkJCQkJCWhhc2gsIHN1Y2Nlc3MxLCBzdWNjZXNz Mik7CisJCX0gZWxzZSB7CisJCQlzdGFibGVfbm9kZSA9IHN0YWJsZV9zdWJ0cmVlX2luc2VydCh0 cmVlX25vZGUsCisJCQkJCXJtYXBfaXRlbSwgdHJlZV9ybWFwX2l0ZW0sIGtwYWdlLAorCQkJCQlo YXNoLCBzdWNjZXNzMSwgc3VjY2VzczIpOworCQl9CisJfSBlbHNlIHsKKworCQkvKiBubyB0cmVl IG5vZGUgZm91bmQgKi8KKwkJdHJlZV9ub2RlID0gYWxsb2NfdHJlZV9ub2RlKHN0YWJsZV90cmVl X25vZGVfbGlzdHApOworCQlpZiAoIXRyZWVfbm9kZSkgeworCQkJc3RhYmxlX25vZGUgPSBOVUxM OworCQkJZ290byBvdXQ7CisJCX0KKworCQlzdGFibGVfbm9kZSA9IG5ld19zdGFibGVfbm9kZSh0 cmVlX25vZGUsICprcGFnZSwgaGFzaF9tYXgpOworCQlpZiAoIXN0YWJsZV9ub2RlKSB7CisJCQlm cmVlX3RyZWVfbm9kZSh0cmVlX25vZGUpOworCQkJZ290byBvdXQ7CisJCX0KKworCQl0cmVlX25v ZGUtPmhhc2ggPSBoYXNoOworCQlyYl9saW5rX25vZGUoJnRyZWVfbm9kZS0+bm9kZSwgcGFyZW50 LCBuZXcpOworCQlyYl9pbnNlcnRfY29sb3IoJnRyZWVfbm9kZS0+bm9kZSwgcm9vdF9zdGFibGVf dHJlZXApOworCQlwYXJlbnQgPSBOVUxMOworCQluZXcgPSAmdHJlZV9ub2RlLT5zdWJfcm9vdC5y Yl9ub2RlOworCisJCXJiX2xpbmtfbm9kZSgmc3RhYmxlX25vZGUtPm5vZGUsIHBhcmVudCwgbmV3 KTsKKwkJcmJfaW5zZXJ0X2NvbG9yKCZzdGFibGVfbm9kZS0+bm9kZSwgJnRyZWVfbm9kZS0+c3Vi X3Jvb3QpOworCQl0cmVlX25vZGUtPmNvdW50Kys7CisJCSpzdWNjZXNzMSA9ICpzdWNjZXNzMiA9 IDE7CisJfQorCitvdXQ6CisJcmV0dXJuIHN0YWJsZV9ub2RlOworfQorCisKKy8qKgorICogZ2V0 X3RyZWVfcm1hcF9pdGVtX3BhZ2UoKSAtIHRyeSB0byBnZXQgdGhlIHBhZ2UgYW5kIGxvY2sgdGhl IG1tYXBfc2VtCisgKgorICogQHJldHVybiAJMCBvbiBzdWNjZXNzLCAtRUJVU1kgaWYgdW5hYmxl IHRvIGxvY2sgdGhlIG1tYXBfc2VtLAorICogICAgICAgICAJLUVJTlZBTCBpZiB0aGUgcGFnZSBt YXBwaW5nIGhhcyBiZWVuIGNoYW5nZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF90cmVl X3JtYXBfaXRlbV9wYWdlKHN0cnVjdCBybWFwX2l0ZW0gKnRyZWVfcm1hcF9pdGVtKQoreworCWlu dCBlcnI7CisKKwllcnIgPSBnZXRfbWVyZ2VhYmxlX3BhZ2VfbG9ja19tbWFwKHRyZWVfcm1hcF9p dGVtKTsKKworCWlmIChlcnIgPT0gLUVJTlZBTCkgeworCQkvKiBpdHMgcGFnZSBtYXAgaGFzIGJl ZW4gY2hhbmdlZCwgcmVtb3ZlIGl0ICovCisJCXJlbW92ZV9ybWFwX2l0ZW1fZnJvbV90cmVlKHRy ZWVfcm1hcF9pdGVtKTsKKwl9CisKKwkvKiBUaGUgcGFnZSBpcyBnb3R0ZW4gYW5kIG1tYXBfc2Vt IGlzIGxvY2tlZCBub3cuICovCisJcmV0dXJuIGVycjsKK30KKworCisvKioKKyAqIHVuc3RhYmxl X3RyZWVfc2VhcmNoX2luc2VydCgpIC0gc2VhcmNoIGFuIHVuc3RhYmxlIHRyZWUgcm1hcF9pdGVt IHdpdGggdGhlCisgKiBzYW1lIGhhc2ggdmFsdWUuIEdldCBpdHMgcGFnZSBhbmQgdHJ5bG9jayB0 aGUgbW1hcF9zZW0KKyAqLworc3RhdGljIGlubGluZQorc3RydWN0IHJtYXBfaXRlbSAqdW5zdGFi bGVfdHJlZV9zZWFyY2hfaW5zZXJ0KHN0cnVjdCBybWFwX2l0ZW0gKnJtYXBfaXRlbSwKKwkJCQkJ ICAgICAgdTMyIGhhc2gpCisKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKm5ldyA9ICZyb290X3Vuc3Rh YmxlX3RyZWUucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1 Y3QgdHJlZV9ub2RlICp0cmVlX25vZGU7CisJdTMyIGhhc2hfbWF4OworCXN0cnVjdCBybWFwX2l0 ZW0gKnRyZWVfcm1hcF9pdGVtOworCisJd2hpbGUgKCpuZXcpIHsKKwkJaW50IGNtcDsKKworCQl0 cmVlX25vZGUgPSByYl9lbnRyeSgqbmV3LCBzdHJ1Y3QgdHJlZV9ub2RlLCBub2RlKTsKKworCQlj bXAgPSBoYXNoX2NtcChoYXNoLCB0cmVlX25vZGUtPmhhc2gpOworCisJCWlmIChjbXAgPCAwKSB7 CisJCQlwYXJlbnQgPSAqbmV3OworCQkJbmV3ID0gJnBhcmVudC0+cmJfbGVmdDsKKwkJfSBlbHNl IGlmIChjbXAgPiAwKSB7CisJCQlwYXJlbnQgPSAqbmV3OworCQkJbmV3ID0gJnBhcmVudC0+cmJf cmlnaHQ7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCisJaWYgKCpuZXcpIHsKKwkJLyogZ290 IHRoZSB0cmVlX25vZGUgKi8KKwkJaWYgKHRyZWVfbm9kZS0+Y291bnQgPT0gMSkgeworCQkJdHJl ZV9ybWFwX2l0ZW0gPSByYl9lbnRyeSh0cmVlX25vZGUtPnN1Yl9yb290LnJiX25vZGUsCisJCQkJ CQkgIHN0cnVjdCBybWFwX2l0ZW0sIG5vZGUpOworCQkJQlVHX09OKCF0cmVlX3JtYXBfaXRlbSk7 CisKKwkJCWdvdG8gZ2V0X3BhZ2Vfb3V0OworCQl9CisKKwkJLyogd2VsbCwgc2VhcmNoIHRoZSBj b2xsaXNpb24gc3VidHJlZSAqLworCQluZXcgPSAmdHJlZV9ub2RlLT5zdWJfcm9vdC5yYl9ub2Rl OworCQlCVUdfT04oISpuZXcpOworCQloYXNoX21heCA9IHJtYXBfaXRlbV9oYXNoX21heChybWFw X2l0ZW0sIGhhc2gpOworCisJCXdoaWxlICgqbmV3KSB7CisJCQlpbnQgY21wOworCisJCQl0cmVl X3JtYXBfaXRlbSA9IHJiX2VudHJ5KCpuZXcsIHN0cnVjdCBybWFwX2l0ZW0sCisJCQkJCQkgIG5v ZGUpOworCisJCQljbXAgPSBoYXNoX2NtcChoYXNoX21heCwgdHJlZV9ybWFwX2l0ZW0tPmhhc2hf bWF4KTsKKwkJCXBhcmVudCA9ICpuZXc7CisJCQlpZiAoY21wIDwgMCkKKwkJCQluZXcgPSAmcGFy ZW50LT5yYl9sZWZ0OworCQkJZWxzZSBpZiAoY21wID4gMCkKKwkJCQluZXcgPSAmcGFyZW50LT5y Yl9yaWdodDsKKwkJCWVsc2UKKwkJCQlnb3RvIGdldF9wYWdlX291dDsKKwkJfQorCX0gZWxzZSB7 CisJCS8qIGFsbG9jIGEgbmV3IHRyZWVfbm9kZSAqLworCQl0cmVlX25vZGUgPSBhbGxvY190cmVl X25vZGUoJnVuc3RhYmxlX3RyZWVfbm9kZV9saXN0KTsKKwkJaWYgKCF0cmVlX25vZGUpCisJCQly ZXR1cm4gTlVMTDsKKworCQl0cmVlX25vZGUtPmhhc2ggPSBoYXNoOworCQlyYl9saW5rX25vZGUo JnRyZWVfbm9kZS0+bm9kZSwgcGFyZW50LCBuZXcpOworCQlyYl9pbnNlcnRfY29sb3IoJnRyZWVf bm9kZS0+bm9kZSwgJnJvb3RfdW5zdGFibGVfdHJlZSk7CisJCXBhcmVudCA9IE5VTEw7CisJCW5l dyA9ICZ0cmVlX25vZGUtPnN1Yl9yb290LnJiX25vZGU7CisJfQorCisJLyogZGlkIG5vdCBmb3Vu ZCBldmVuIGluIHN1Yi10cmVlICovCisJcm1hcF9pdGVtLT50cmVlX25vZGUgPSB0cmVlX25vZGU7 CisJcm1hcF9pdGVtLT5hZGRyZXNzIHw9IFVOU1RBQkxFX0ZMQUc7CisJcm1hcF9pdGVtLT5oYXNo X3JvdW5kID0gdWtzbV9oYXNoX3JvdW5kOworCXJiX2xpbmtfbm9kZSgmcm1hcF9pdGVtLT5ub2Rl LCBwYXJlbnQsIG5ldyk7CisJcmJfaW5zZXJ0X2NvbG9yKCZybWFwX2l0ZW0tPm5vZGUsICZ0cmVl X25vZGUtPnN1Yl9yb290KTsKKworCXVrc21fcGFnZXNfdW5zaGFyZWQrKzsKKwlyZXR1cm4gTlVM TDsKKworZ2V0X3BhZ2Vfb3V0OgorCWlmICh0cmVlX3JtYXBfaXRlbS0+cGFnZSA9PSBybWFwX2l0 ZW0tPnBhZ2UpCisJCXJldHVybiBOVUxMOworCisJaWYgKGdldF90cmVlX3JtYXBfaXRlbV9wYWdl KHRyZWVfcm1hcF9pdGVtKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gdHJlZV9ybWFwX2l0 ZW07Cit9CisKK3N0YXRpYyB2b2lkIGhvbGRfYW5vbl92bWEoc3RydWN0IHJtYXBfaXRlbSAqcm1h cF9pdGVtLAorCQkJICBzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hKQoreworCXJtYXBfaXRlbS0+ YW5vbl92bWEgPSBhbm9uX3ZtYTsKKwlnZXRfYW5vbl92bWEoYW5vbl92bWEpOworfQorCitzdGF0 aWMgaW5saW5lIHZvaWQgaGxpc3RfYWRkX2FmdGVyKHN0cnVjdCBobGlzdF9ub2RlICpuLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbmV4dCkK K3sKKwluZXh0LT5uZXh0ID0gbi0+bmV4dDsKKwluLT5uZXh0ID0gbmV4dDsKKwluZXh0LT5wcHJl diA9ICZuLT5uZXh0OworCWlmKG5leHQtPm5leHQpCisJbmV4dC0+bmV4dC0+cHByZXYgID0gJm5l eHQtPm5leHQ7Cit9CisKKy8qKgorICogc3RhYmxlX3RyZWVfYXBwZW5kKCkgLSBhcHBlbmQgYSBy bWFwX2l0ZW0gdG8gYSBzdGFibGUgbm9kZS4gRGVkdXBsaWNhdGlvbgorICogcmF0aW8gc3RhdGlz dGljcyBpcyBkb25lIGluIHRoaXMgZnVuY3Rpb24uCisgKgorICovCitzdGF0aWMgdm9pZCBzdGFi bGVfdHJlZV9hcHBlbmQoc3RydWN0IHJtYXBfaXRlbSAqcm1hcF9pdGVtLAorCQkJICAgICAgIHN0 cnVjdCBzdGFibGVfbm9kZSAqc3RhYmxlX25vZGUsIGludCBsb2dkZWR1cCkKK3sKKwlzdHJ1Y3Qg bm9kZV92bWEgKm5vZGVfdm1hID0gTlVMTCwgKm5ld19ub2RlX3ZtYSwgKm5vZGVfdm1hX2NvbnQg PSBOVUxMOworCXVuc2lnbmVkIGxvbmcga2V5ID0gKHVuc2lnbmVkIGxvbmcpcm1hcF9pdGVtLT5z bG90OworCXVuc2lnbmVkIGxvbmcgZmFjdG9yID0gcm1hcF9pdGVtLT5zbG90LT5ydW5nLT5zdGVw OworCisJQlVHX09OKCFzdGFibGVfbm9kZSk7CisJcm1hcF9pdGVtLT5hZGRyZXNzIHw9IFNUQUJM RV9GTEFHOworCisJaWYgKGhsaXN0X2VtcHR5KCZzdGFibGVfbm9kZS0+aGxpc3QpKSB7CisJCXVr c21fcGFnZXNfc2hhcmVkKys7CisJCWdvdG8gbm9kZV92bWFfbmV3OworCX0gZWxzZSB7CisJCXVr c21fcGFnZXNfc2hhcmluZysrOworCX0KKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGVfdm1h LCAmc3RhYmxlX25vZGUtPmhsaXN0LCBobGlzdCkgeworCQlpZiAobm9kZV92bWEtPmtleSA+PSBr ZXkpCisJCQlicmVhazsKKworCQlpZiAobG9nZGVkdXApIHsKKwkJCW5vZGVfdm1hLT5zbG90LT5w YWdlc19iZW1lcmdlZCArPSBmYWN0b3I7CisJCQlpZiAobGlzdF9lbXB0eSgmbm9kZV92bWEtPnNs b3QtPmRlZHVwX2xpc3QpKQorCQkJCWxpc3RfYWRkKCZub2RlX3ZtYS0+c2xvdC0+ZGVkdXBfbGlz dCwKKwkJCQkJICZ2bWFfc2xvdF9kZWR1cCk7CisJCX0KKwl9CisKKwlpZiAobm9kZV92bWEpIHsK KwkJaWYgKG5vZGVfdm1hLT5rZXkgPT0ga2V5KSB7CisJCQlub2RlX3ZtYV9jb250ID0gaGxpc3Rf ZW50cnlfc2FmZShub2RlX3ZtYS0+aGxpc3QubmV4dCwgc3RydWN0IG5vZGVfdm1hLCBobGlzdCk7 CisJCQlnb3RvIG5vZGVfdm1hX29rOworCQl9IGVsc2UgaWYgKG5vZGVfdm1hLT5rZXkgPiBrZXkp IHsKKwkJCW5vZGVfdm1hX2NvbnQgPSBub2RlX3ZtYTsKKwkJfQorCX0KKworbm9kZV92bWFfbmV3 OgorCS8qIG5vIHNhbWUgdm1hIGFscmVhZHkgaW4gbm9kZSwgYWxsb2MgYSBuZXcgbm9kZV92bWEg Ki8KKwluZXdfbm9kZV92bWEgPSBhbGxvY19ub2RlX3ZtYSgpOworCUJVR19PTighbmV3X25vZGVf dm1hKTsKKwluZXdfbm9kZV92bWEtPmhlYWQgPSBzdGFibGVfbm9kZTsKKwluZXdfbm9kZV92bWEt PnNsb3QgPSBybWFwX2l0ZW0tPnNsb3Q7CisKKwlpZiAoIW5vZGVfdm1hKSB7CisJCWhsaXN0X2Fk ZF9oZWFkKCZuZXdfbm9kZV92bWEtPmhsaXN0LCAmc3RhYmxlX25vZGUtPmhsaXN0KTsKKwl9IGVs c2UgaWYgKG5vZGVfdm1hLT5rZXkgIT0ga2V5KSB7CisJCWlmIChub2RlX3ZtYS0+a2V5IDwga2V5 KQorCQkJaGxpc3RfYWRkX2FmdGVyKCZub2RlX3ZtYS0+aGxpc3QsICZuZXdfbm9kZV92bWEtPmhs aXN0KTsKKwkJZWxzZSB7CisJCQlobGlzdF9hZGRfYmVmb3JlKCZuZXdfbm9kZV92bWEtPmhsaXN0 LAorCQkJCQkgJm5vZGVfdm1hLT5obGlzdCk7CisJCX0KKworCX0KKwlub2RlX3ZtYSA9IG5ld19u b2RlX3ZtYTsKKworbm9kZV92bWFfb2s6IC8qIG9rLCByZWFkeSB0byBhZGQgdG8gdGhlIGxpc3Qg Ki8KKwlybWFwX2l0ZW0tPmhlYWQgPSBub2RlX3ZtYTsKKwlobGlzdF9hZGRfaGVhZCgmcm1hcF9p dGVtLT5obGlzdCwgJm5vZGVfdm1hLT5ybWFwX2hsaXN0KTsKKwlob2xkX2Fub25fdm1hKHJtYXBf aXRlbSwgcm1hcF9pdGVtLT5zbG90LT52bWEtPmFub25fdm1hKTsKKwlpZiAobG9nZGVkdXApIHsK KwkJcm1hcF9pdGVtLT5zbG90LT5wYWdlc19tZXJnZWQrKzsKKwkJaWYgKG5vZGVfdm1hX2NvbnQp IHsKKwkJCW5vZGVfdm1hID0gbm9kZV92bWFfY29udDsKKwkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5 X2NvbnRpbnVlKG5vZGVfdm1hLCBobGlzdCkgeworCQkJCW5vZGVfdm1hLT5zbG90LT5wYWdlc19i ZW1lcmdlZCArPSBmYWN0b3I7CisJCQkJaWYgKGxpc3RfZW1wdHkoJm5vZGVfdm1hLT5zbG90LT5k ZWR1cF9saXN0KSkKKwkJCQkJbGlzdF9hZGQoJm5vZGVfdm1hLT5zbG90LT5kZWR1cF9saXN0LAor CQkJCQkJICZ2bWFfc2xvdF9kZWR1cCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBXZSB1 c2UgYnJlYWtfa3NtIHRvIGJyZWFrIENPVyBvbiBhIGtzbSBwYWdlOiBpdCdzIGEgc3RyaXBwZWQg ZG93bgorICoKKyAqCWlmIChnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBtbSwgYWRkciwgMSwgMSwg MSwgJnBhZ2UsIE5VTEwpID09IDEpCisgKgkJcHV0X3BhZ2UocGFnZSk7CisgKgorICogYnV0IHRh a2luZyBncmVhdCBjYXJlIG9ubHkgdG8gdG91Y2ggYSBrc20gcGFnZSwgaW4gYSBWTV9NRVJHRUFC TEUgdm1hLAorICogaW4gY2FzZSB0aGUgYXBwbGljYXRpb24gaGFzIHVubWFwcGVkIGFuZCByZW1h cHBlZCBtbSxhZGRyIG1lYW53aGlsZS4KKyAqIENvdWxkIGEga3NtIHBhZ2UgYXBwZWFyIGFueXdo ZXJlIGVsc2U/ICBBY3R1YWxseSB5ZXMsIGluIGEgVk1fUEZOTUFQCisgKiBtbWFwIG9mIC9kZXYv bWVtIG9yIC9kZXYva21lbSwgd2hlcmUgd2Ugd291bGQgbm90IHdhbnQgdG8gdG91Y2ggaXQuCisg Ki8KK3N0YXRpYyBpbnQgYnJlYWtfa3NtKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNp Z25lZCBsb25nIGFkZHIpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IHJldCA9IDA7CisK KwlkbyB7CisJCWNvbmRfcmVzY2hlZCgpOworCQlwYWdlID0gZm9sbG93X3BhZ2Uodm1hLCBhZGRy LCBGT0xMX0dFVCk7CisJCWlmIChJU19FUlJfT1JfTlVMTChwYWdlKSkKKwkJCWJyZWFrOworCQlp ZiAoUGFnZUtzbShwYWdlKSkgeworCQkJcmV0ID0gaGFuZGxlX21tX2ZhdWx0KHZtYS0+dm1fbW0s IHZtYSwgYWRkciwKKwkJCQkJICAgICAgRkFVTFRfRkxBR19XUklURSk7CisJCX0gZWxzZQorCQkJ cmV0ID0gVk1fRkFVTFRfV1JJVEU7CisJCXB1dF9wYWdlKHBhZ2UpOworCX0gd2hpbGUgKCEocmV0 ICYgKFZNX0ZBVUxUX1dSSVRFIHwgVk1fRkFVTFRfU0lHQlVTIHwgVk1fRkFVTFRfT09NKSkpOwor CS8qCisJICogV2UgbXVzdCBsb29wIGJlY2F1c2UgaGFuZGxlX21tX2ZhdWx0KCkgbWF5IGJhY2sg b3V0IGlmIHRoZXJlJ3MKKwkgKiBhbnkgZGlmZmljdWx0eSBlLmcuIGlmIHB0ZSBhY2Nlc3NlZCBi aXQgZ2V0cyB1cGRhdGVkIGNvbmN1cnJlbnRseS4KKwkgKgorCSAqIFZNX0ZBVUxUX1dSSVRFIGlz IHdoYXQgd2UgaGF2ZSBiZWVuIGhvcGluZyBmb3I6IGl0IGluZGljYXRlcyB0aGF0CisJICogQ09X IGhhcyBiZWVuIGJyb2tlbiwgZXZlbiBpZiB0aGUgdm1hIGRvZXMgbm90IHBlcm1pdCBWTV9XUklU RTsKKwkgKiBidXQgbm90ZSB0aGF0IGEgY29uY3VycmVudCBmYXVsdCBtaWdodCBicmVhayBQYWdl S3NtIGZvciB1cy4KKwkgKgorCSAqIFZNX0ZBVUxUX1NJR0JVUyBjb3VsZCBvY2N1ciBpZiB3ZSBy YWNlIHdpdGggdHJ1bmNhdGlvbiBvZiB0aGUKKwkgKiBiYWNraW5nIGZpbGUsIHdoaWNoIGFsc28g aW52YWxpZGF0ZXMgYW5vbnltb3VzIHBhZ2VzOiB0aGF0J3MKKwkgKiBva2F5LCB0aGF0IHRydW5j YXRpb24gd2lsbCBoYXZlIHVubWFwcGVkIHRoZSBQYWdlS3NtIGZvciB1cy4KKwkgKgorCSAqIFZN X0ZBVUxUX09PTTogYXQgdGhlIHRpbWUgb2Ygd3JpdGluZyAobGF0ZSBKdWx5IDIwMDkpLCBzZXR0 aW5nCisJICogYXNpZGUgbWVtX2Nncm91cCBsaW1pdHMsIFZNX0ZBVUxUX09PTSB3b3VsZCBvbmx5 IGJlIHNldCBpZiB0aGUKKwkgKiBjdXJyZW50IHRhc2sgaGFzIFRJRl9NRU1ESUUgc2V0LCBhbmQg d2lsbCBiZSBPT00ga2lsbGVkIG9uIHJldHVybgorCSAqIHRvIHVzZXI7IGFuZCBrc21kLCBoYXZp bmcgbm8gbW0sIHdvdWxkIG5ldmVyIGJlIGNob3NlbiBmb3IgdGhhdC4KKwkgKgorCSAqIEJ1dCBp ZiB0aGUgbW0gaXMgaW4gYSBsaW1pdGVkIG1lbV9jZ3JvdXAsIHRoZW4gdGhlIGZhdWx0IG1heSBm YWlsCisJICogd2l0aCBWTV9GQVVMVF9PT00gZXZlbiBpZiB0aGUgY3VycmVudCB0YXNrIGlzIG5v dCBUSUZfTUVNRElFOyBhbmQKKwkgKiBldmVuIGtzbWQgY2FuIGZhaWwgaW4gdGhpcyB3YXkgLSB0 aG91Z2ggaXQncyB1c3VhbGx5IGJyZWFraW5nIGtzbQorCSAqIGp1c3QgdG8gdW5kbyBhIG1lcmdl IGl0IG1hZGUgYSBtb21lbnQgYmVmb3JlLCBzbyB1bmxpa2VseSB0byBvb20uCisJICoKKwkgKiBU aGF0J3MgYSBwaXR5OiB3ZSBtaWdodCB0aGVyZWZvcmUgaGF2ZSBtb3JlIGtlcm5lbCBwYWdlcyBh bGxvY2F0ZWQKKwkgKiB0aGFuIHdlJ3JlIGNvdW50aW5nIGFzIG5vZGVzIGluIHRoZSBzdGFibGUg dHJlZTsgYnV0IHVrc21fZG9fc2NhbgorCSAqIHdpbGwgcmV0cnkgdG8gYnJlYWtfY293IG9uIGVh Y2ggcGFzcywgc28gc2hvdWxkIHJlY292ZXIgdGhlIHBhZ2UKKwkgKiBpbiBkdWUgY291cnNlLiAg VGhlIGltcG9ydGFudCB0aGluZyBpcyB0byBub3QgbGV0IFZNX01FUkdFQUJMRQorCSAqIGJlIGNs ZWFyZWQgd2hpbGUgYW55IHN1Y2ggcGFnZXMgbWlnaHQgcmVtYWluIGluIHRoZSBhcmVhLgorCSAq LworCXJldHVybiAocmV0ICYgVk1fRkFVTFRfT09NKSA/IC1FTk9NRU0gOiAwOworfQorCitzdGF0 aWMgdm9pZCBicmVha19jb3coc3RydWN0IHJtYXBfaXRlbSAqcm1hcF9pdGVtKQoreworCXN0cnVj dCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gcm1hcF9pdGVtLT5zbG90LT52bWE7CisJc3RydWN0IG1t X3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF9ybWFw X2FkZHIocm1hcF9pdGVtKTsKKworCWlmICh1a3NtX3Rlc3RfZXhpdChtbSkpCisJCWdvdG8gb3V0 OworCisJYnJlYWtfa3NtKHZtYSwgYWRkcik7CitvdXQ6CisJcmV0dXJuOworfQorCisvKgorICog VGhvdWdoIGl0J3MgdmVyeSB0ZW1wdGluZyB0byB1bm1lcmdlIGluX3N0YWJsZV90cmVlKHJtYXBf aXRlbSlzIHJhdGhlcgorICogdGhhbiBjaGVjayBldmVyeSBwdGUgb2YgYSBnaXZlbiB2bWEsIHRo ZSBsb2NraW5nIGRvZXNuJ3QgcXVpdGUgd29yayBmb3IKKyAqIHRoYXQgLSBhbiBybWFwX2l0ZW0g aXMgYXNzaWduZWQgdG8gdGhlIHN0YWJsZSB0cmVlIGFmdGVyIGluc2VydGluZyBrc20KKyAqIHBh Z2UgYW5kIHVwcGluZyBtbWFwX3NlbS4gIE5vciBkb2VzIGl0IGZpdCB3aXRoIHRoZSB3YXkgd2Ug c2tpcCBkdXAnaW5nCisgKiBybWFwX2l0ZW1zIGZyb20gcGFyZW50IHRvIGNoaWxkIGF0IGZvcmsg dGltZSAoc28gYXMgbm90IHRvIHdhc3RlIHRpbWUKKyAqIGlmIGV4aXQgY29tZXMgYmVmb3JlIHRo ZSBuZXh0IHNjYW4gcmVhY2hlcyBpdCkuCisgKgorICogU2ltaWxhcmx5LCBhbHRob3VnaCB3ZSdk IGxpa2UgdG8gcmVtb3ZlIHJtYXBfaXRlbXMgKHNvIHVwZGF0aW5nIGNvdW50cworICogYW5kIGZy ZWVpbmcgbWVtb3J5KSB3aGVuIHVubWVyZ2luZyBhbiBhcmVhLCBpdCdzIGVhc2llciB0byBsZWF2 ZSB0aGF0CisgKiB0byB0aGUgbmV4dCBwYXNzIG9mIGtzbWQgLSBjb25zaWRlciwgZm9yIGV4YW1w bGUsIGhvdyBrc21kIG1pZ2h0IGJlCisgKiBpbiBjbXBfYW5kX21lcmdlX3BhZ2Ugb24gb25lIG9m IHRoZSBybWFwX2l0ZW1zIHdlIHdvdWxkIGJlIHJlbW92aW5nLgorICovCitpbmxpbmUgaW50IHVu bWVyZ2VfdWtzbV9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJICAgICAgdW5z aWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBh ZGRyOworCWludCBlcnIgPSAwOworCisJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQgJiYg IWVycjsgYWRkciArPSBQQUdFX1NJWkUpIHsKKwkJaWYgKHVrc21fdGVzdF9leGl0KHZtYS0+dm1f bW0pKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWVyciA9 IC1FUkVTVEFSVFNZUzsKKwkJZWxzZQorCQkJZXJyID0gYnJlYWtfa3NtKHZtYSwgYWRkcik7CisJ fQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmNfdWtzbV9wYWdlc19z Y2FubmVkKHZvaWQpCit7CisJdTY0IGRlbHRhOworCisKKwlpZiAodWtzbV9wYWdlc19zY2FubmVk ID09IFU2NF9NQVgpIHsKKwkJZW5jb2RlX2JlbmVmaXQoKTsKKworCQlkZWx0YSA9IHVrc21fcGFn ZXNfc2Nhbm5lZCA+PiBwYWdlc19zY2FubmVkX2Jhc2U7CisKKwkJaWYgKENBTl9PVkVSRkxPV19V NjQocGFnZXNfc2Nhbm5lZF9zdG9yZWQsIGRlbHRhKSkgeworCQkJcGFnZXNfc2Nhbm5lZF9zdG9y ZWQgPj49IDE7CisJCQlkZWx0YSA+Pj0gMTsKKwkJCXBhZ2VzX3NjYW5uZWRfYmFzZSsrOworCQl9 CisKKwkJcGFnZXNfc2Nhbm5lZF9zdG9yZWQgKz0gZGVsdGE7CisKKwkJdWtzbV9wYWdlc19zY2Fu bmVkID0gdWtzbV9wYWdlc19zY2FubmVkX2xhc3QgPSAwOworCX0KKworCXVrc21fcGFnZXNfc2Nh bm5lZCsrOworfQorCitzdGF0aWMgaW5saW5lIGludCBmaW5kX3plcm9fcGFnZV9oYXNoKGludCBz dHJlbmd0aCwgdTMyIGhhc2gpCit7CisJcmV0dXJuICh6ZXJvX2hhc2hfdGFibGVbc3RyZW5ndGhd ID09IGhhc2gpOworfQorCitzdGF0aWMKK2ludCBjbXBfYW5kX21lcmdlX3plcm9fcGFnZShzdHJ1 Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IHBh Z2UgKnplcm9fcGFnZSA9IGVtcHR5X3Vrc21femVyb19wYWdlOworCXN0cnVjdCBtbV9zdHJ1Y3Qg Km1tID0gdm1hLT52bV9tbTsKKwlwdGVfdCBvcmlnX3B0ZSA9IF9fcHRlKDApOworCWludCBlcnIg PSAtRUZBVUxUOworCisJaWYgKHVrc21fdGVzdF9leGl0KG1tKSkKKwkJZ290byBvdXQ7CisKKwlp ZiAoUGFnZVRyYW5zQ29tcG91bmQocGFnZSkgJiYgcGFnZV90cmFuc19jb21wb3VuZF9hbm9uX3Nw bGl0KHBhZ2UpKQorCQlnb3RvIG91dDsKKwlCVUdfT04oUGFnZVRyYW5zQ29tcG91bmQocGFnZSkp OworCisJaWYgKCFQYWdlQW5vbihwYWdlKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIXRyeWxvY2tf cGFnZShwYWdlKSkKKwkJZ290byBvdXQ7CisKKwlpZiAod3JpdGVfcHJvdGVjdF9wYWdlKHZtYSwg cGFnZSwgJm9yaWdfcHRlLCAwKSA9PSAwKSB7CisJCWlmIChpc19wYWdlX2Z1bGxfemVybyhwYWdl KSkKKwkJCWVyciA9IHJlcGxhY2VfcGFnZSh2bWEsIHBhZ2UsIHplcm9fcGFnZSwgb3JpZ19wdGUp OworCX0KKworCXVubG9ja19wYWdlKHBhZ2UpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8q CisgKiBjbXBfYW5kX21lcmdlX3BhZ2UoKSAtIGZpcnN0IHNlZSBpZiBwYWdlIGNhbiBiZSBtZXJn ZWQgaW50byB0aGUgc3RhYmxlCisgKiB0cmVlOyBpZiBub3QsIGNvbXBhcmUgaGFzaCB0byBwcmV2 aW91cyBhbmQgaWYgaXQncyB0aGUgc2FtZSwgc2VlIGlmIHBhZ2UKKyAqIGNhbiBiZSBpbnNlcnRl ZCBpbnRvIHRoZSB1bnN0YWJsZSB0cmVlLCBvciBtZXJnZWQgd2l0aCBhIHBhZ2UgYWxyZWFkeSB0 aGVyZQorICogYW5kIGJvdGggdHJhbnNmZXJyZWQgdG8gdGhlIHN0YWJsZSB0cmVlLgorICoKKyAq IEBwYWdlOiB0aGUgcGFnZSB0aGF0IHdlIGFyZSBzZWFyY2hpbmcgaWRlbnRpY2FsIHBhZ2UgdG8u CisgKiBAcm1hcF9pdGVtOiB0aGUgcmV2ZXJzZSBtYXBwaW5nIGludG8gdGhlIHZpcnR1YWwgYWRk cmVzcyBvZiB0aGlzIHBhZ2UKKyAqLworc3RhdGljIHZvaWQgY21wX2FuZF9tZXJnZV9wYWdlKHN0 cnVjdCBybWFwX2l0ZW0gKnJtYXBfaXRlbSwgdTMyIGhhc2gpCit7CisJc3RydWN0IHJtYXBfaXRl bSAqdHJlZV9ybWFwX2l0ZW07CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IHBhZ2UgKmtw YWdlID0gTlVMTDsKKwl1MzIgaGFzaF9tYXg7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgc3Vj Y2VzczEsIHN1Y2Nlc3MyOworCXN0cnVjdCBzdGFibGVfbm9kZSAqc25vZGU7CisJaW50IGNtcDsK KwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTCwgKipuZXc7CisKKwlyZW1vdmVfcm1hcF9p dGVtX2Zyb21fdHJlZShybWFwX2l0ZW0pOworCXBhZ2UgPSBybWFwX2l0ZW0tPnBhZ2U7CisKKwkv KiBXZSBmaXJzdCBzdGFydCB3aXRoIHNlYXJjaGluZyB0aGUgcGFnZSBpbnNpZGUgdGhlIHN0YWJs ZSB0cmVlICovCisJa3BhZ2UgPSBzdGFibGVfdHJlZV9zZWFyY2gocm1hcF9pdGVtLCBoYXNoKTsK KwlpZiAoa3BhZ2UpIHsKKwkJZXJyID0gdHJ5X3RvX21lcmdlX3dpdGhfdWtzbV9wYWdlKHJtYXBf aXRlbSwga3BhZ2UsCisJCQkJCQkgaGFzaCk7CisJCWlmICghZXJyKSB7CisJCQkvKgorCQkJICog VGhlIHBhZ2Ugd2FzIHN1Y2Nlc3NmdWxseSBtZXJnZWQsIGFkZAorCQkJICogaXRzIHJtYXBfaXRl bSB0byB0aGUgc3RhYmxlIHRyZWUuCisJCQkgKiBwYWdlIGxvY2sgaXMgbmVlZGVkIGJlY2F1c2Ug aXQncworCQkJICogcmFjaW5nIHdpdGggdHJ5X3RvX3VubWFwX2tzbSgpLCBldGMuCisJCQkgKi8K KwkJCWxvY2tfcGFnZShrcGFnZSk7CisJCQlzbm9kZSA9IHBhZ2Vfc3RhYmxlX25vZGUoa3BhZ2Up OworCQkJc3RhYmxlX3RyZWVfYXBwZW5kKHJtYXBfaXRlbSwgc25vZGUsIDEpOworCQkJdW5sb2Nr X3BhZ2Uoa3BhZ2UpOworCQkJcHV0X3BhZ2Uoa3BhZ2UpOworCQkJcmV0dXJuOyAvKiBzdWNjZXNz ICovCisJCX0KKwkJcHV0X3BhZ2Uoa3BhZ2UpOworCisJCS8qCisJCSAqIGlmIGl0J3MgYSBjb2xs aXNpb24gYW5kIGl0IGhhcyBiZWVuIHNlYXJjaCBpbiBzdWItcmJ0cmVlCisJCSAqIChoYXNoX21h eCAhPSAwKSwgd2Ugd2FudCB0byBhYm9ydCwgYmVjYXVzZSBpZiBpdCBpcworCQkgKiBzdWNjZXNz ZnVsbHkgbWVyZ2VkIGluIHVuc3RhYmxlIHRyZWUsIHRoZSBjb2xsaXNpb24gdHJlbmRzIHRvCisJ CSAqIGhhcHBlbiBhZ2Fpbi4KKwkJICovCisJCWlmIChlcnIgPT0gTUVSR0VfRVJSX0NPTExJICYm IHJtYXBfaXRlbS0+aGFzaF9tYXgpCisJCQlyZXR1cm47CisJfQorCisJdHJlZV9ybWFwX2l0ZW0g PQorCQl1bnN0YWJsZV90cmVlX3NlYXJjaF9pbnNlcnQocm1hcF9pdGVtLCBoYXNoKTsKKwlpZiAo dHJlZV9ybWFwX2l0ZW0pIHsKKwkJZXJyID0gdHJ5X3RvX21lcmdlX3R3b19wYWdlcyhybWFwX2l0 ZW0sIHRyZWVfcm1hcF9pdGVtLCBoYXNoKTsKKwkJLyoKKwkJICogQXMgc29vbiBhcyB3ZSBtZXJn ZSB0aGlzIHBhZ2UsIHdlIHdhbnQgdG8gcmVtb3ZlIHRoZQorCQkgKiBybWFwX2l0ZW0gb2YgdGhl IHBhZ2Ugd2UgaGF2ZSBtZXJnZWQgd2l0aCBmcm9tIHRoZSB1bnN0YWJsZQorCQkgKiB0cmVlLCBh bmQgaW5zZXJ0IGl0IGluc3RlYWQgYXMgbmV3IG5vZGUgaW4gdGhlIHN0YWJsZSB0cmVlLgorCQkg Ki8KKwkJaWYgKCFlcnIpIHsKKwkJCWtwYWdlID0gcGFnZTsKKwkJCXJlbW92ZV9ybWFwX2l0ZW1f ZnJvbV90cmVlKHRyZWVfcm1hcF9pdGVtKTsKKwkJCWxvY2tfcGFnZShrcGFnZSk7CisJCQlzbm9k ZSA9IHN0YWJsZV90cmVlX2luc2VydCgma3BhZ2UsIGhhc2gsCisJCQkJCQkgICBybWFwX2l0ZW0s IHRyZWVfcm1hcF9pdGVtLAorCQkJCQkJICAgJnN1Y2Nlc3MxLCAmc3VjY2VzczIpOworCisJCQkv KgorCQkJICogRG8gbm90IGxvZyBkZWR1cCBmb3IgdHJlZSBpdGVtLCBpdCdzIG5vdCBjb3VudGVk IGFzCisJCQkgKiBzY2FubmVkIGluIHRoaXMgcm91bmQuCisJCQkgKi8KKwkJCWlmIChzdWNjZXNz MikKKwkJCQlzdGFibGVfdHJlZV9hcHBlbmQodHJlZV9ybWFwX2l0ZW0sIHNub2RlLCAwKTsKKwor CQkJLyoKKwkJCSAqIFRoZSBvcmRlciBvZiB0aGVzZSB0d28gc3RhYmxlIGFwcGVuZCBpcyBpbXBv cnRhbnQ6CisJCQkgKiB3ZSBhcmUgc2Nhbm5pbmcgcm1hcF9pdGVtLgorCQkJICovCisJCQlpZiAo c3VjY2VzczEpCisJCQkJc3RhYmxlX3RyZWVfYXBwZW5kKHJtYXBfaXRlbSwgc25vZGUsIDEpOwor CisJCQkvKgorCQkJICogVGhlIG9yaWdpbmFsIGtwYWdlIG1heSBiZSB1bmxvY2tlZCBpbnNpZGUK KwkJCSAqIHN0YWJsZV90cmVlX2luc2VydCgpIGFscmVhZHkuIFRoaXMgcGFnZQorCQkJICogc2hv dWxkIGJlIHVubG9ja2VkIGJlZm9yZSBkb2luZworCQkJICogYnJlYWtfY293KCkuCisJCQkgKi8K KwkJCXVubG9ja19wYWdlKGtwYWdlKTsKKworCQkJaWYgKCFzdWNjZXNzMSkKKwkJCQlicmVha19j b3cocm1hcF9pdGVtKTsKKworCQkJaWYgKCFzdWNjZXNzMikKKwkJCQlicmVha19jb3codHJlZV9y bWFwX2l0ZW0pOworCisJCX0gZWxzZSBpZiAoZXJyID09IE1FUkdFX0VSUl9DT0xMSSkgeworCQkJ QlVHX09OKHRyZWVfcm1hcF9pdGVtLT50cmVlX25vZGUtPmNvdW50ID4gMSk7CisKKwkJCXJtYXBf aXRlbV9oYXNoX21heCh0cmVlX3JtYXBfaXRlbSwKKwkJCQkJICAgdHJlZV9ybWFwX2l0ZW0tPnRy ZWVfbm9kZS0+aGFzaCk7CisKKwkJCWhhc2hfbWF4ID0gcm1hcF9pdGVtX2hhc2hfbWF4KHJtYXBf aXRlbSwgaGFzaCk7CisJCQljbXAgPSBoYXNoX2NtcChoYXNoX21heCwgdHJlZV9ybWFwX2l0ZW0t Pmhhc2hfbWF4KTsKKwkJCXBhcmVudCA9ICZ0cmVlX3JtYXBfaXRlbS0+bm9kZTsKKwkJCWlmIChj bXAgPCAwKQorCQkJCW5ldyA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCQllbHNlIGlmIChjbXAgPiAw KQorCQkJCW5ldyA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQkJZWxzZQorCQkJCWdvdG8gcHV0X3Vw X291dDsKKworCQkJcm1hcF9pdGVtLT50cmVlX25vZGUgPSB0cmVlX3JtYXBfaXRlbS0+dHJlZV9u b2RlOworCQkJcm1hcF9pdGVtLT5hZGRyZXNzIHw9IFVOU1RBQkxFX0ZMQUc7CisJCQlybWFwX2l0 ZW0tPmhhc2hfcm91bmQgPSB1a3NtX2hhc2hfcm91bmQ7CisJCQlyYl9saW5rX25vZGUoJnJtYXBf aXRlbS0+bm9kZSwgcGFyZW50LCBuZXcpOworCQkJcmJfaW5zZXJ0X2NvbG9yKCZybWFwX2l0ZW0t Pm5vZGUsCisJCQkJCSZ0cmVlX3JtYXBfaXRlbS0+dHJlZV9ub2RlLT5zdWJfcm9vdCk7CisJCQly bWFwX2l0ZW0tPnRyZWVfbm9kZS0+Y291bnQrKzsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBl aXRoZXIgb25lIG9mIHRoZSBwYWdlIGhhcyBjaGFuZ2VkIG9yIHRoZXkgY29sbGlkZQorCQkJICog YXQgdGhlIG1heCBoYXNoLCB3ZSBjb25zaWRlciB0aGVtIGFzIGlsbCBpdGVtcy4KKwkJCSAqLwor CQkJcmVtb3ZlX3JtYXBfaXRlbV9mcm9tX3RyZWUodHJlZV9ybWFwX2l0ZW0pOworCQl9CitwdXRf dXBfb3V0OgorCQlwdXRfcGFnZSh0cmVlX3JtYXBfaXRlbS0+cGFnZSk7CisJCXVwX3JlYWQoJnRy ZWVfcm1hcF9pdGVtLT5zbG90LT52bWEtPnZtX21tLT5tbWFwX3NlbSk7CisJfQorfQorCisKKwor CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3Bvb2xfaW5kZXgoc3RydWN0IHZtYV9z bG90ICpzbG90LAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXVuc2lnbmVkIGxv bmcgcG9vbF9pbmRleDsKKworCXBvb2xfaW5kZXggPSAoc2l6ZW9mKHN0cnVjdCBybWFwX2xpc3Rf ZW50cnkgKikgKiBpbmRleCkgPj4gUEFHRV9TSElGVDsKKwlpZiAocG9vbF9pbmRleCA+PSBzbG90 LT5wb29sX3NpemUpCisJCUJVRygpOworCXJldHVybiBwb29sX2luZGV4OworfQorCitzdGF0aWMg aW5saW5lIHVuc2lnbmVkIGxvbmcgaW5kZXhfcGFnZV9vZmZzZXQodW5zaWduZWQgbG9uZyBpbmRl eCkKK3sKKwlyZXR1cm4gb2Zmc2V0X2luX3BhZ2Uoc2l6ZW9mKHN0cnVjdCBybWFwX2xpc3RfZW50 cnkgKikgKiBpbmRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBybWFwX2xpc3RfZW50 cnkgKmdldF9ybWFwX2xpc3RfZW50cnkoc3RydWN0IHZtYV9zbG90ICpzbG90LAorCQkJCQkgICAg dW5zaWduZWQgbG9uZyBpbmRleCwgaW50IG5lZWRfYWxsb2MpCit7CisJdW5zaWduZWQgbG9uZyBw b29sX2luZGV4OworCXN0cnVjdCBwYWdlICpwYWdlOworCXZvaWQgKmFkZHI7CisKKworCXBvb2xf aW5kZXggPSBnZXRfcG9vbF9pbmRleChzbG90LCBpbmRleCk7CisJaWYgKCFzbG90LT5ybWFwX2xp c3RfcG9vbFtwb29sX2luZGV4XSkgeworCQlpZiAoIW5lZWRfYWxsb2MpCisJCQlyZXR1cm4gTlVM TDsKKworCQlwYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyB8IF9fR0ZQ X05PV0FSTik7CisJCWlmICghcGFnZSkKKwkJCXJldHVybiBOVUxMOworCisJCXNsb3QtPnJtYXBf bGlzdF9wb29sW3Bvb2xfaW5kZXhdID0gcGFnZTsKKwl9CisKKwlhZGRyID0ga21hcChzbG90LT5y bWFwX2xpc3RfcG9vbFtwb29sX2luZGV4XSk7CisJYWRkciArPSBpbmRleF9wYWdlX29mZnNldChp bmRleCk7CisKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9ybWFw X2xpc3RfZW50cnkoc3RydWN0IHZtYV9zbG90ICpzbG90LAorCQkJCSAgICAgICB1bnNpZ25lZCBs b25nIGluZGV4KQoreworCXVuc2lnbmVkIGxvbmcgcG9vbF9pbmRleDsKKworCXBvb2xfaW5kZXgg PSBnZXRfcG9vbF9pbmRleChzbG90LCBpbmRleCk7CisJQlVHX09OKCFzbG90LT5ybWFwX2xpc3Rf cG9vbFtwb29sX2luZGV4XSk7CisJa3VubWFwKHNsb3QtPnJtYXBfbGlzdF9wb29sW3Bvb2xfaW5k ZXhdKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZW50cnlfaXNfbmV3KHN0cnVjdCBybWFwX2xp c3RfZW50cnkgKmVudHJ5KQoreworCXJldHVybiAhZW50cnktPml0ZW07Cit9CisKK3N0YXRpYyBp bmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfaW5kZXhfb3JpZ19hZGRyKHN0cnVjdCB2bWFfc2xvdCAq c2xvdCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgaW5kZXgpCit7CisJcmV0dXJuIHNsb3QtPnZtYS0+ dm1fc3RhcnQgKyAoaW5kZXggPDwgUEFHRV9TSElGVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5z aWduZWQgbG9uZyBnZXRfZW50cnlfYWRkcmVzcyhzdHJ1Y3Qgcm1hcF9saXN0X2VudHJ5ICplbnRy eSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlpZiAoaXNfYWRkcihlbnRyeS0+YWRkcikp CisJCWFkZHIgPSBnZXRfY2xlYW5fYWRkcihlbnRyeS0+YWRkcik7CisJZWxzZSBpZiAoZW50cnkt Pml0ZW0pCisJCWFkZHIgPSBnZXRfcm1hcF9hZGRyKGVudHJ5LT5pdGVtKTsKKwllbHNlCisJCUJV RygpOworCisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJtYXBfaXRl bSAqZ2V0X2VudHJ5X2l0ZW0oc3RydWN0IHJtYXBfbGlzdF9lbnRyeSAqZW50cnkpCit7CisJaWYg KGlzX2FkZHIoZW50cnktPmFkZHIpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBlbnRyeS0+ aXRlbTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluY19ybWFwX2xpc3RfcG9vbF9jb3VudChz dHJ1Y3Qgdm1hX3Nsb3QgKnNsb3QsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGluZGV4KQorewor CXVuc2lnbmVkIGxvbmcgcG9vbF9pbmRleDsKKworCXBvb2xfaW5kZXggPSBnZXRfcG9vbF9pbmRl eChzbG90LCBpbmRleCk7CisJQlVHX09OKCFzbG90LT5ybWFwX2xpc3RfcG9vbFtwb29sX2luZGV4 XSk7CisJc2xvdC0+cG9vbF9jb3VudHNbcG9vbF9pbmRleF0rKzsKK30KKworc3RhdGljIGlubGlu ZSB2b2lkIGRlY19ybWFwX2xpc3RfcG9vbF9jb3VudChzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3QsCisJ CQkJCSAgICB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXVuc2lnbmVkIGxvbmcgcG9vbF9pbmRl eDsKKworCXBvb2xfaW5kZXggPSBnZXRfcG9vbF9pbmRleChzbG90LCBpbmRleCk7CisJQlVHX09O KCFzbG90LT5ybWFwX2xpc3RfcG9vbFtwb29sX2luZGV4XSk7CisJQlVHX09OKCFzbG90LT5wb29s X2NvdW50c1twb29sX2luZGV4XSk7CisJc2xvdC0+cG9vbF9jb3VudHNbcG9vbF9pbmRleF0tLTsK K30KKworc3RhdGljIGlubGluZSBpbnQgZW50cnlfaGFzX3JtYXAoc3RydWN0IHJtYXBfbGlzdF9l bnRyeSAqZW50cnkpCit7CisJcmV0dXJuICFpc19hZGRyKGVudHJ5LT5hZGRyKSAmJiBlbnRyeS0+ aXRlbTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN3YXBfZW50cmllcyhzdHJ1Y3Qgcm1hcF9s aXN0X2VudHJ5ICplbnRyeTEsCisJCQkJdW5zaWduZWQgbG9uZyBpbmRleDEsCisJCQkJc3RydWN0 IHJtYXBfbGlzdF9lbnRyeSAqZW50cnkyLAorCQkJCXVuc2lnbmVkIGxvbmcgaW5kZXgyKQorewor CXN0cnVjdCBybWFwX2xpc3RfZW50cnkgdG1wOworCisJLyogc3dhcHBpbmcgdHdvIG5ldyBlbnRy aWVzIGlzIG1lYW5pbmdsZXNzICovCisJQlVHX09OKGVudHJ5X2lzX25ldyhlbnRyeTEpICYmIGVu dHJ5X2lzX25ldyhlbnRyeTIpKTsKKworCXRtcCA9ICplbnRyeTE7CisJKmVudHJ5MSA9ICplbnRy eTI7CisJKmVudHJ5MiA9IHRtcDsKKworCWlmIChlbnRyeV9oYXNfcm1hcChlbnRyeTEpKQorCQll bnRyeTEtPml0ZW0tPmVudHJ5X2luZGV4ID0gaW5kZXgxOworCisJaWYgKGVudHJ5X2hhc19ybWFw KGVudHJ5MikpCisJCWVudHJ5Mi0+aXRlbS0+ZW50cnlfaW5kZXggPSBpbmRleDI7CisKKwlpZiAo ZW50cnlfaGFzX3JtYXAoZW50cnkxKSAmJiAhZW50cnlfaGFzX3JtYXAoZW50cnkyKSkgeworCQlp bmNfcm1hcF9saXN0X3Bvb2xfY291bnQoZW50cnkxLT5pdGVtLT5zbG90LCBpbmRleDEpOworCQlk ZWNfcm1hcF9saXN0X3Bvb2xfY291bnQoZW50cnkxLT5pdGVtLT5zbG90LCBpbmRleDIpOworCX0g ZWxzZSBpZiAoIWVudHJ5X2hhc19ybWFwKGVudHJ5MSkgJiYgZW50cnlfaGFzX3JtYXAoZW50cnky KSkgeworCQlpbmNfcm1hcF9saXN0X3Bvb2xfY291bnQoZW50cnkyLT5pdGVtLT5zbG90LCBpbmRl eDIpOworCQlkZWNfcm1hcF9saXN0X3Bvb2xfY291bnQoZW50cnkyLT5pdGVtLT5zbG90LCBpbmRl eDEpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfZW50cnlfaXRlbShzdHJ1Y3Qg cm1hcF9saXN0X2VudHJ5ICplbnRyeSkKK3sKKwl1bnNpZ25lZCBsb25nIGluZGV4OworCXN0cnVj dCBybWFwX2l0ZW0gKml0ZW07CisKKwlpZiAoIWlzX2FkZHIoZW50cnktPmFkZHIpKSB7CisJCUJV R19PTighZW50cnktPml0ZW0pOworCQlpdGVtID0gZW50cnktPml0ZW07CisJCWVudHJ5LT5hZGRy ID0gZ2V0X3JtYXBfYWRkcihpdGVtKTsKKwkJc2V0X2lzX2FkZHIoZW50cnktPmFkZHIpOworCQlp bmRleCA9IGl0ZW0tPmVudHJ5X2luZGV4OworCQlyZW1vdmVfcm1hcF9pdGVtX2Zyb21fdHJlZShp dGVtKTsKKwkJZGVjX3JtYXBfbGlzdF9wb29sX2NvdW50KGl0ZW0tPnNsb3QsIGluZGV4KTsKKwkJ ZnJlZV9ybWFwX2l0ZW0oaXRlbSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBwb29sX2Vu dHJ5X2JvdW5kYXJ5KHVuc2lnbmVkIGxvbmcgaW5kZXgpCit7CisJdW5zaWduZWQgbG9uZyBsaW5l YXJfYWRkcjsKKworCWxpbmVhcl9hZGRyID0gc2l6ZW9mKHN0cnVjdCBybWFwX2xpc3RfZW50cnkg KikgKiBpbmRleDsKKwlyZXR1cm4gaW5kZXggJiYgIW9mZnNldF9pbl9wYWdlKGxpbmVhcl9hZGRy KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyeV9mcmVlX2xhc3RfcG9vbChzdHJ1Y3Qgdm1h X3Nsb3QgKnNsb3QsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBpbmRleCkKK3sKKwl1bnNpZ25l ZCBsb25nIHBvb2xfaW5kZXg7CisKKwlwb29sX2luZGV4ID0gZ2V0X3Bvb2xfaW5kZXgoc2xvdCwg aW5kZXgpOworCWlmIChzbG90LT5ybWFwX2xpc3RfcG9vbFtwb29sX2luZGV4XSAmJgorCSAgICAh c2xvdC0+cG9vbF9jb3VudHNbcG9vbF9pbmRleF0pIHsKKwkJX19mcmVlX3BhZ2Uoc2xvdC0+cm1h cF9saXN0X3Bvb2xbcG9vbF9pbmRleF0pOworCQlzbG90LT5ybWFwX2xpc3RfcG9vbFtwb29sX2lu ZGV4XSA9IE5VTEw7CisJCXNsb3QtPmZsYWdzIHw9IFVLU01fU0xPVF9ORUVEX1NPUlQ7CisJfQor Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2bWFfaXRlbV9pbmRleChzdHJ1Y3Qg dm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkJICAgc3RydWN0IHJtYXBfaXRlbSAqaXRlbSkKK3sK KwlyZXR1cm4gKGdldF9ybWFwX2FkZHIoaXRlbSkgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NI SUZUOworfQorCitzdGF0aWMgaW50IHdpdGhpbl9zYW1lX3Bvb2woc3RydWN0IHZtYV9zbG90ICpz bG90LAorCQkJICAgIHVuc2lnbmVkIGxvbmcgaSwgdW5zaWduZWQgbG9uZyBqKQoreworCXVuc2ln bmVkIGxvbmcgcG9vbF9pLCBwb29sX2o7CisKKwlwb29sX2kgPSBnZXRfcG9vbF9pbmRleChzbG90 LCBpKTsKKwlwb29sX2ogPSBnZXRfcG9vbF9pbmRleChzbG90LCBqKTsKKworCXJldHVybiAocG9v bF9pID09IHBvb2xfaik7Cit9CisKK3N0YXRpYyB2b2lkIHNvcnRfcm1hcF9lbnRyeV9saXN0KHN0 cnVjdCB2bWFfc2xvdCAqc2xvdCkKK3sKKwl1bnNpZ25lZCBsb25nIGksIGo7CisJc3RydWN0IHJt YXBfbGlzdF9lbnRyeSAqZW50cnksICpzd2FwX2VudHJ5OworCisJZW50cnkgPSBnZXRfcm1hcF9s aXN0X2VudHJ5KHNsb3QsIDAsIDApOworCWZvciAoaSA9IDA7IGkgPCBzbG90LT5wYWdlczsgKSB7 CisKKwkJaWYgKCFlbnRyeSkKKwkJCWdvdG8gc2tpcF93aG9sZV9wb29sOworCisJCWlmIChlbnRy eV9pc19uZXcoZW50cnkpKQorCQkJZ290byBuZXh0X2VudHJ5OworCisJCWlmIChpc19hZGRyKGVu dHJ5LT5hZGRyKSkgeworCQkJZW50cnktPmFkZHIgPSAwOworCQkJZ290byBuZXh0X2VudHJ5Owor CQl9CisKKwkJaiA9IHZtYV9pdGVtX2luZGV4KHNsb3QtPnZtYSwgZW50cnktPml0ZW0pOworCQlp ZiAoaiA9PSBpKQorCQkJZ290byBuZXh0X2VudHJ5OworCisJCWlmICh3aXRoaW5fc2FtZV9wb29s KHNsb3QsIGksIGopKQorCQkJc3dhcF9lbnRyeSA9IGVudHJ5ICsgaiAtIGk7CisJCWVsc2UKKwkJ CXN3YXBfZW50cnkgPSBnZXRfcm1hcF9saXN0X2VudHJ5KHNsb3QsIGosIDEpOworCisJCXN3YXBf ZW50cmllcyhlbnRyeSwgaSwgc3dhcF9lbnRyeSwgaik7CisJCWlmICghd2l0aGluX3NhbWVfcG9v bChzbG90LCBpLCBqKSkKKwkJCXB1dF9ybWFwX2xpc3RfZW50cnkoc2xvdCwgaik7CisJCWNvbnRp bnVlOworCitza2lwX3dob2xlX3Bvb2w6CisJCWkgKz0gUEFHRV9TSVpFIC8gc2l6ZW9mKCplbnRy eSk7CisJCWlmIChpIDwgc2xvdC0+cGFnZXMpCisJCQllbnRyeSA9IGdldF9ybWFwX2xpc3RfZW50 cnkoc2xvdCwgaSwgMCk7CisJCWNvbnRpbnVlOworCituZXh0X2VudHJ5OgorCQlpZiAoaSA+PSBz bG90LT5wYWdlcyAtIDEgfHwKKwkJICAgICF3aXRoaW5fc2FtZV9wb29sKHNsb3QsIGksIGkgKyAx KSkgeworCQkJcHV0X3JtYXBfbGlzdF9lbnRyeShzbG90LCBpKTsKKwkJCWlmIChpICsgMSA8IHNs b3QtPnBhZ2VzKQorCQkJCWVudHJ5ID0gZ2V0X3JtYXBfbGlzdF9lbnRyeShzbG90LCBpICsgMSwg MCk7CisJCX0gZWxzZQorCQkJZW50cnkrKzsKKwkJaSsrOworCQljb250aW51ZTsKKwl9CisKKwkv KiBmcmVlIGVtcHR5IHBvb2wgZW50cmllcyB3aGljaCBjb250YWluIG5vIHJtYXBfaXRlbSAqLwor CS8qIENBTiBiZSBzaW1wbGllZCB0byBiYXNlZCBvbiBvbmx5IHBvb2xfY291bnRzIHdoZW4gYnVn IGZyZWVkICEhISEhICovCisJZm9yIChpID0gMDsgaSA8IHNsb3QtPnBvb2xfc2l6ZTsgaSsrKSB7 CisJCXVuc2lnbmVkIGNoYXIgaGFzX3JtYXA7CisJCXZvaWQgKmFkZHI7CisKKwkJaWYgKCFzbG90 LT5ybWFwX2xpc3RfcG9vbFtpXSkKKwkJCWNvbnRpbnVlOworCisJCWhhc19ybWFwID0gMDsKKwkJ YWRkciA9IGttYXAoc2xvdC0+cm1hcF9saXN0X3Bvb2xbaV0pOworCQlCVUdfT04oIWFkZHIpOwor CQlmb3IgKGogPSAwOyBqIDwgUEFHRV9TSVpFIC8gc2l6ZW9mKCplbnRyeSk7IGorKykgeworCQkJ ZW50cnkgPSAoc3RydWN0IHJtYXBfbGlzdF9lbnRyeSAqKWFkZHIgKyBqOworCQkJaWYgKGlzX2Fk ZHIoZW50cnktPmFkZHIpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFlbnRyeS0+aXRlbSkKKwkJ CQljb250aW51ZTsKKwkJCWhhc19ybWFwID0gMTsKKwkJfQorCQlrdW5tYXAoc2xvdC0+cm1hcF9s aXN0X3Bvb2xbaV0pOworCQlpZiAoIWhhc19ybWFwKSB7CisJCQlCVUdfT04oc2xvdC0+cG9vbF9j b3VudHNbaV0pOworCQkJX19mcmVlX3BhZ2Uoc2xvdC0+cm1hcF9saXN0X3Bvb2xbaV0pOworCQkJ c2xvdC0+cm1hcF9saXN0X3Bvb2xbaV0gPSBOVUxMOworCQl9CisJfQorCisJc2xvdC0+ZmxhZ3Mg Jj0gflVLU01fU0xPVF9ORUVEX1NPUlQ7Cit9CisKKy8qCisgKiB2bWFfZnVsbHlfc2Nhbm5lZCgp IC0gaWYgYWxsIHRoZSBwYWdlcyBpbiB0aGlzIHNsb3QgaGF2ZSBiZWVuIHNjYW5uZWQuCisgKi8K K3N0YXRpYyBpbmxpbmUgaW50IHZtYV9mdWxseV9zY2FubmVkKHN0cnVjdCB2bWFfc2xvdCAqc2xv dCkKK3sKKwlyZXR1cm4gc2xvdC0+cGFnZXNfc2Nhbm5lZCA9PSBzbG90LT5wYWdlczsKK30KKwor LyoqCisgKiBnZXRfbmV4dF9ybWFwX2l0ZW0oKSAtIEdldCB0aGUgbmV4dCBybWFwX2l0ZW0gaW4g YSB2bWFfc2xvdCBhY2NvcmRpbmcgdG8KKyAqIGl0cyByYW5kb20gcGVybXV0YXRpb24uIFRoaXMg ZnVuY3Rpb24gaXMgZW1iZWRkZWQgd2l0aCB0aGUgcmFuZG9tCisgKiBwZXJtdXRhdGlvbiBpbmRl eCBtYW5hZ2VtZW50IGNvZGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgcm1hcF9pdGVtICpnZXRfbmV4 dF9ybWFwX2l0ZW0oc3RydWN0IHZtYV9zbG90ICpzbG90LCB1MzIgKmhhc2gpCit7CisJdW5zaWdu ZWQgbG9uZyByYW5kX3JhbmdlLCBhZGRyLCBzd2FwX2luZGV4LCBzY2FuX2luZGV4OworCXN0cnVj dCBybWFwX2l0ZW0gKml0ZW0gPSBOVUxMOworCXN0cnVjdCBybWFwX2xpc3RfZW50cnkgKnNjYW5f ZW50cnksICpzd2FwX2VudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCXNjYW5f aW5kZXggPSBzd2FwX2luZGV4ID0gc2xvdC0+cGFnZXNfc2Nhbm5lZCAlIHNsb3QtPnBhZ2VzOwor CisJaWYgKHBvb2xfZW50cnlfYm91bmRhcnkoc2Nhbl9pbmRleCkpCisJCXRyeV9mcmVlX2xhc3Rf cG9vbChzbG90LCBzY2FuX2luZGV4IC0gMSk7CisKKwlpZiAodm1hX2Z1bGx5X3NjYW5uZWQoc2xv dCkpIHsKKwkJaWYgKHNsb3QtPmZsYWdzICYgVUtTTV9TTE9UX05FRURfU09SVCkKKwkJCXNsb3Qt PmZsYWdzIHw9IFVLU01fU0xPVF9ORUVEX1JFUkFORDsKKwkJZWxzZQorCQkJc2xvdC0+ZmxhZ3Mg Jj0gflVLU01fU0xPVF9ORUVEX1JFUkFORDsKKwkJaWYgKHNsb3QtPmZsYWdzICYgVUtTTV9TTE9U X05FRURfU09SVCkKKwkJCXNvcnRfcm1hcF9lbnRyeV9saXN0KHNsb3QpOworCX0KKworCXNjYW5f ZW50cnkgPSBnZXRfcm1hcF9saXN0X2VudHJ5KHNsb3QsIHNjYW5faW5kZXgsIDEpOworCWlmICgh c2Nhbl9lbnRyeSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZW50cnlfaXNfbmV3KHNjYW5fZW50 cnkpKSB7CisJCXNjYW5fZW50cnktPmFkZHIgPSBnZXRfaW5kZXhfb3JpZ19hZGRyKHNsb3QsIHNj YW5faW5kZXgpOworCQlzZXRfaXNfYWRkcihzY2FuX2VudHJ5LT5hZGRyKTsKKwl9CisKKwlpZiAo c2xvdC0+ZmxhZ3MgJiBVS1NNX1NMT1RfTkVFRF9SRVJBTkQpIHsKKwkJcmFuZF9yYW5nZSA9IHNs b3QtPnBhZ2VzIC0gc2Nhbl9pbmRleDsKKwkJQlVHX09OKCFyYW5kX3JhbmdlKTsKKwkJc3dhcF9p bmRleCA9IHNjYW5faW5kZXggKyAocHJhbmRvbV91MzIoKSAlIHJhbmRfcmFuZ2UpOworCX0KKwor CWlmIChzd2FwX2luZGV4ICE9IHNjYW5faW5kZXgpIHsKKwkJc3dhcF9lbnRyeSA9IGdldF9ybWFw X2xpc3RfZW50cnkoc2xvdCwgc3dhcF9pbmRleCwgMSk7CisJCWlmIChlbnRyeV9pc19uZXcoc3dh cF9lbnRyeSkpIHsKKwkJCXN3YXBfZW50cnktPmFkZHIgPSBnZXRfaW5kZXhfb3JpZ19hZGRyKHNs b3QsCisJCQkJCQkJICAgICAgIHN3YXBfaW5kZXgpOworCQkJc2V0X2lzX2FkZHIoc3dhcF9lbnRy eS0+YWRkcik7CisJCX0KKwkJc3dhcF9lbnRyaWVzKHNjYW5fZW50cnksIHNjYW5faW5kZXgsIHN3 YXBfZW50cnksIHN3YXBfaW5kZXgpOworCX0KKworCWFkZHIgPSBnZXRfZW50cnlfYWRkcmVzcyhz Y2FuX2VudHJ5KTsKKwlpdGVtID0gZ2V0X2VudHJ5X2l0ZW0oc2Nhbl9lbnRyeSk7CisJQlVHX09O KGFkZHIgPiBzbG90LT52bWEtPnZtX2VuZCB8fCBhZGRyIDwgc2xvdC0+dm1hLT52bV9zdGFydCk7 CisKKwlwYWdlID0gZm9sbG93X3BhZ2Uoc2xvdC0+dm1hLCBhZGRyLCBGT0xMX0dFVCk7CisJaWYg KElTX0VSUl9PUl9OVUxMKHBhZ2UpKQorCQlnb3RvIG5vcGFnZTsKKworCWlmICghUGFnZUFub24o cGFnZSkgJiYgIXBhZ2VfdHJhbnNfY29tcG91bmRfYW5vbihwYWdlKSkKKwkJZ290byBwdXRwYWdl OworCisJLypjaGVjayBpcyB6ZXJvX3BhZ2UgcGZuIG9yIHVrc21femVyb19wYWdlKi8KKwlpZiAo KHBhZ2VfdG9fcGZuKHBhZ2UpID09IHplcm9fcGZuKQorCQkJfHwgKHBhZ2VfdG9fcGZuKHBhZ2Up ID09IHVrc21femVyb19wZm4pKQorCQlnb3RvIHB1dHBhZ2U7CisKKwlmbHVzaF9hbm9uX3BhZ2Uo c2xvdC0+dm1hLCBwYWdlLCBhZGRyKTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKworCisJ Kmhhc2ggPSBwYWdlX2hhc2gocGFnZSwgaGFzaF9zdHJlbmd0aCwgMSk7CisJaW5jX3Vrc21fcGFn ZXNfc2Nhbm5lZCgpOworCS8qaWYgdGhlIHBhZ2UgY29udGVudCBhbGwgemVybywgcmUtbWFwIHRv IHplcm8tcGFnZSovCisJaWYgKGZpbmRfemVyb19wYWdlX2hhc2goaGFzaF9zdHJlbmd0aCwgKmhh c2gpKSB7CisJCWlmICghY21wX2FuZF9tZXJnZV96ZXJvX3BhZ2Uoc2xvdC0+dm1hLCBwYWdlKSkg eworCQkJc2xvdC0+cGFnZXNfbWVyZ2VkKys7CisJCQlpbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2Us IE5SX1VLU01fWkVST19QQUdFUyk7CisJCQlkZWNfbW1fY291bnRlcihzbG90LT5tbSwgTU1fQU5P TlBBR0VTKTsKKworCQkJLyogRm9yIGZ1bGwtemVybyBwYWdlcywgbm8gbmVlZCB0byBjcmVhdGUg cm1hcCBpdGVtICovCisJCQlnb3RvIHB1dHBhZ2U7CisJCX0gZWxzZSB7CisJCQlpbmNfcnNoYXNo X25lZyhtZW1jbXBfY29zdCAvIDIpOworCQl9CisJfQorCisJaWYgKCFpdGVtKSB7CisJCWl0ZW0g PSBhbGxvY19ybWFwX2l0ZW0oKTsKKwkJaWYgKGl0ZW0pIHsKKwkJCS8qIEl0IGhhcyBhbHJlYWR5 IGJlZW4gemVyb2VkICovCisJCQlpdGVtLT5zbG90ID0gc2xvdDsKKwkJCWl0ZW0tPmFkZHJlc3Mg PSBhZGRyOworCQkJaXRlbS0+ZW50cnlfaW5kZXggPSBzY2FuX2luZGV4OworCQkJc2Nhbl9lbnRy eS0+aXRlbSA9IGl0ZW07CisJCQlpbmNfcm1hcF9saXN0X3Bvb2xfY291bnQoc2xvdCwgc2Nhbl9p bmRleCk7CisJCX0gZWxzZQorCQkJZ290byBwdXRwYWdlOworCX0KKworCUJVR19PTihpdGVtLT5z bG90ICE9IHNsb3QpOworCS8qIHRoZSBwYWdlIG1heSBoYXZlIGNoYW5nZWQgKi8KKwlpdGVtLT5w YWdlID0gcGFnZTsKKwlwdXRfcm1hcF9saXN0X2VudHJ5KHNsb3QsIHNjYW5faW5kZXgpOworCWlm IChzd2FwX2VudHJ5KQorCQlwdXRfcm1hcF9saXN0X2VudHJ5KHNsb3QsIHN3YXBfaW5kZXgpOwor CXJldHVybiBpdGVtOworCitwdXRwYWdlOgorCXB1dF9wYWdlKHBhZ2UpOworCXBhZ2UgPSBOVUxM Oworbm9wYWdlOgorCS8qIG5vIHBhZ2UsIHN0b3JlIGFkZHIgYmFjayBhbmQgZnJlZSBybWFwX2l0 ZW0gaWYgcG9zc2libGUgKi8KKwlmcmVlX2VudHJ5X2l0ZW0oc2Nhbl9lbnRyeSk7CisJcHV0X3Jt YXBfbGlzdF9lbnRyeShzbG90LCBzY2FuX2luZGV4KTsKKwlpZiAoc3dhcF9lbnRyeSkKKwkJcHV0 X3JtYXBfbGlzdF9lbnRyeShzbG90LCBzd2FwX2luZGV4KTsKKwlyZXR1cm4gTlVMTDsKK30KKwor c3RhdGljIGlubGluZSBpbnQgaW5fc3RhYmxlX3RyZWUoc3RydWN0IHJtYXBfaXRlbSAqcm1hcF9p dGVtKQoreworCXJldHVybiBybWFwX2l0ZW0tPmFkZHJlc3MgJiBTVEFCTEVfRkxBRzsKK30KKwor LyoqCisgKiBzY2FuX3ZtYV9vbmVfcGFnZSgpIC0gc2NhbiB0aGUgbmV4dCBwYWdlIGluIGEgdm1h X3Nsb3QuIENhbGxlZCB3aXRoCisgKiBtbWFwX3NlbSBsb2NrZWQuCisgKi8KK3N0YXRpYyBub2lu bGluZSB2b2lkIHNjYW5fdm1hX29uZV9wYWdlKHN0cnVjdCB2bWFfc2xvdCAqc2xvdCkKK3sKKwl1 MzIgaGFzaDsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3Qgcm1hcF9pdGVtICpybWFw X2l0ZW0gPSBOVUxMOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gc2xvdC0+dm1hOwor CisJbW0gPSB2bWEtPnZtX21tOworCUJVR19PTighbW0pOworCUJVR19PTighc2xvdCk7CisKKwly bWFwX2l0ZW0gPSBnZXRfbmV4dF9ybWFwX2l0ZW0oc2xvdCwgJmhhc2gpOworCWlmICghcm1hcF9p dGVtKQorCQlnb3RvIG91dDE7CisKKwlpZiAoUGFnZUtzbShybWFwX2l0ZW0tPnBhZ2UpICYmIGlu X3N0YWJsZV90cmVlKHJtYXBfaXRlbSkpCisJCWdvdG8gb3V0MjsKKworCWNtcF9hbmRfbWVyZ2Vf cGFnZShybWFwX2l0ZW0sIGhhc2gpOworb3V0MjoKKwlwdXRfcGFnZShybWFwX2l0ZW0tPnBhZ2Up Oworb3V0MToKKwlzbG90LT5wYWdlc19zY2FubmVkKys7CisJaWYgKHNsb3QtPmZ1bGx5X3NjYW5u ZWRfcm91bmQgIT0gZnVsbHlfc2Nhbm5lZF9yb3VuZCkKKwkJc2Nhbm5lZF92aXJ0dWFsX3BhZ2Vz Kys7CisKKwlpZiAodm1hX2Z1bGx5X3NjYW5uZWQoc2xvdCkpCisJCXNsb3QtPmZ1bGx5X3NjYW5u ZWRfcm91bmQgPSBmdWxseV9zY2FubmVkX3JvdW5kOworfQorCitzdGF0aWMgaW5saW5lIHVuc2ln bmVkIGxvbmcgcnVuZ19nZXRfcGFnZXMoc3RydWN0IHNjYW5fcnVuZyAqcnVuZykKK3sKKwlzdHJ1 Y3Qgc2xvdF90cmVlX25vZGUgKm5vZGU7CisKKwlpZiAoIXJ1bmctPnZtYV9yb290LnJub2RlKQor CQlyZXR1cm4gMDsKKworCW5vZGUgPSBjb250YWluZXJfb2YocnVuZy0+dm1hX3Jvb3Qucm5vZGUs IHN0cnVjdCBzbG90X3RyZWVfbm9kZSwgc25vZGUpOworCisJcmV0dXJuIG5vZGUtPnNpemU7Cit9 CisKKyNkZWZpbmUgUlVOR19TQU1QTEVEX01JTgkzCisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgdWtz bV9jYWxjX3J1bmdfc3RlcChzdHJ1Y3Qgc2Nhbl9ydW5nICpydW5nLAorCQkJIHVuc2lnbmVkIGxv bmcgcGFnZV90aW1lLCB1bnNpZ25lZCBsb25nIHJhdGlvKQoreworCXVuc2lnbmVkIGxvbmcgc2Ft cGxlZCwgcGFnZXM7CisKKwkvKiB3aWxsIGJlIGZ1bGx5IHNjYW5uZWQgPyAqLworCWlmICghcnVu Zy0+Y292ZXJfbXNlY3MpIHsKKwkJcnVuZy0+c3RlcCA9IDE7CisJCXJldHVybjsKKwl9CisKKwlz YW1wbGVkID0gcnVuZy0+Y292ZXJfbXNlY3MgKiAoTlNFQ19QRVJfTVNFQyAvIFRJTUVfUkFUSU9f U0NBTEUpCisJCSAgKiByYXRpbyAvIHBhZ2VfdGltZTsKKworCS8qCisJICogIEJlZm9yZSB3ZSBm aW5zaXNoIGEgc2NhbiByb3VuZCBhbmQgZXhwZW5zaXZlIHBlci1yb3VuZCBqb2JzLAorCSAqICB3 ZSBuZWVkIHRvIGhhdmUgYSBjaGFuY2UgdG8gZXN0aW1hdGUgdGhlIHBlciBwYWdlIHRpbWUuIFNv CisJICogIHRoZSBzYW1wbGVkIG51bWJlciBjYW4gbm90IGJlIHRvbyBzbWFsbC4KKwkgKi8KKwlp ZiAoc2FtcGxlZCA8IFJVTkdfU0FNUExFRF9NSU4pCisJCXNhbXBsZWQgPSBSVU5HX1NBTVBMRURf TUlOOworCisJcGFnZXMgPSBydW5nX2dldF9wYWdlcyhydW5nKTsKKwlpZiAobGlrZWx5KHBhZ2Vz ID4gc2FtcGxlZCkpCisJCXJ1bmctPnN0ZXAgPSBwYWdlcyAvIHNhbXBsZWQ7CisJZWxzZQorCQly dW5nLT5zdGVwID0gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3RlcF9uZWVkX3JlY2FsYyhz dHJ1Y3Qgc2Nhbl9ydW5nICpydW5nKQoreworCXVuc2lnbmVkIGxvbmcgcGFnZXMsIHN0ZXBtYXg7 CisKKwlwYWdlcyA9IHJ1bmdfZ2V0X3BhZ2VzKHJ1bmcpOworCXN0ZXBtYXggPSBwYWdlcyAvIFJV TkdfU0FNUExFRF9NSU47CisKKwlyZXR1cm4gcGFnZXMgJiYgKHJ1bmctPnN0ZXAgPiBwYWdlcyB8 fAorCQkJIChzdGVwbWF4ICYmIHJ1bmctPnN0ZXAgPiBzdGVwbWF4KSk7Cit9CisKK3N0YXRpYyBp bmxpbmUKK3ZvaWQgcmVzZXRfY3VycmVudF9zY2FuKHN0cnVjdCBzY2FuX3J1bmcgKnJ1bmcsIGlu dCBmaW5pc2hlZCwgaW50IHN0ZXBfcmVjYWxjKQoreworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdDsK KworCWlmIChmaW5pc2hlZCkKKwkJcnVuZy0+ZmxhZ3MgfD0gVUtTTV9SVU5HX1JPVU5EX0ZJTklT SEVEOworCisJaWYgKHN0ZXBfcmVjYWxjIHx8IHN0ZXBfbmVlZF9yZWNhbGMocnVuZykpIHsKKwkJ dWtzbV9jYWxjX3J1bmdfc3RlcChydW5nLCB1a3NtX2VtYV9wYWdlX3RpbWUsIHJ1bmctPmNwdV9y YXRpbyk7CisJCUJVR19PTihzdGVwX25lZWRfcmVjYWxjKHJ1bmcpKTsKKwl9CisKKwlzbG90X2l0 ZXJfaW5kZXggPSBwcmFuZG9tX3UzMigpICUgcnVuZy0+c3RlcDsKKwlCVUdfT04oIXJ1bmctPnZt YV9yb290LnJub2RlKTsKKwlzbG90ID0gc3JhZGl4X3RyZWVfbmV4dCgmcnVuZy0+dm1hX3Jvb3Qs IE5VTEwsIDAsIHNsb3RfaXRlcik7CisJQlVHX09OKCFzbG90KTsKKworCXJ1bmctPmN1cnJlbnRf c2NhbiA9IHNsb3Q7CisJcnVuZy0+Y3VycmVudF9vZmZzZXQgPSBzbG90X2l0ZXJfaW5kZXg7Cit9 CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNyYWRpeF90cmVlX3Jvb3QgKnNsb3RfZ2V0X3Jvb3Qo c3RydWN0IHZtYV9zbG90ICpzbG90KQoreworCXJldHVybiAmc2xvdC0+cnVuZy0+dm1hX3Jvb3Q7 Cit9CisKKy8qCisgKiByZXR1cm4gaWYgcmVzZXR0ZWQuCisgKi8KK3N0YXRpYyBpbnQgYWR2YW5j ZV9jdXJyZW50X3NjYW4oc3RydWN0IHNjYW5fcnVuZyAqcnVuZykKK3sKKwl1bnNpZ25lZCBzaG9y dCBuOworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdCwgKm5leHQgPSBOVUxMOworCisJQlVHX09OKCFy dW5nLT52bWFfcm9vdC5udW0pOworCisJc2xvdCA9IHJ1bmctPmN1cnJlbnRfc2NhbjsKKwluID0g KHNsb3QtPnBhZ2VzIC0gcnVuZy0+Y3VycmVudF9vZmZzZXQpICUgcnVuZy0+c3RlcDsKKwlzbG90 X2l0ZXJfaW5kZXggPSBydW5nLT5zdGVwIC0gbjsKKwluZXh0ID0gc3JhZGl4X3RyZWVfbmV4dCgm cnVuZy0+dm1hX3Jvb3QsIHNsb3QtPnNub2RlLAorCQkJCXNsb3QtPnNpbmRleCwgc2xvdF9pdGVy KTsKKworCWlmIChuZXh0KSB7CisJCXJ1bmctPmN1cnJlbnRfb2Zmc2V0ID0gc2xvdF9pdGVyX2lu ZGV4OworCQlydW5nLT5jdXJyZW50X3NjYW4gPSBuZXh0OworCQlyZXR1cm4gMDsKKwl9IGVsc2Ug eworCQlyZXNldF9jdXJyZW50X3NjYW4ocnVuZywgMSwgMCk7CisJCXJldHVybiAxOworCX0KK30K Kworc3RhdGljIGlubGluZSB2b2lkIHJ1bmdfcm1fc2xvdChzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3Qp Cit7CisJc3RydWN0IHNjYW5fcnVuZyAqcnVuZyA9IHNsb3QtPnJ1bmc7CisJc3RydWN0IHNyYWRp eF90cmVlX3Jvb3QgKnJvb3Q7CisKKwlpZiAocnVuZy0+Y3VycmVudF9zY2FuID09IHNsb3QpCisJ CWFkdmFuY2VfY3VycmVudF9zY2FuKHJ1bmcpOworCisJcm9vdCA9IHNsb3RfZ2V0X3Jvb3Qoc2xv dCk7CisJc3JhZGl4X3RyZWVfZGVsZXRlX2Zyb21fbGVhZihyb290LCBzbG90LT5zbm9kZSwgc2xv dC0+c2luZGV4KTsKKwlzbG90LT5zbm9kZSA9IE5VTEw7CisJaWYgKHN0ZXBfbmVlZF9yZWNhbGMo cnVuZykpIHsKKwkJdWtzbV9jYWxjX3J1bmdfc3RlcChydW5nLCB1a3NtX2VtYV9wYWdlX3RpbWUs IHJ1bmctPmNwdV9yYXRpbyk7CisJCUJVR19PTihzdGVwX25lZWRfcmVjYWxjKHJ1bmcpKTsKKwl9 CisKKwkvKiBJbiBjYXNlIGFkdmFuY2VfY3VycmVudF9zY2FuIGxvb3AgYmFjayB0byB0aGlzIHNs b3QgYWdhaW4gKi8KKwlpZiAocnVuZy0+dm1hX3Jvb3QubnVtICYmIHJ1bmctPmN1cnJlbnRfc2Nh biA9PSBzbG90KQorCQlyZXNldF9jdXJyZW50X3NjYW4oc2xvdC0+cnVuZywgMSwgMCk7Cit9CisK K3N0YXRpYyBpbmxpbmUgdm9pZCBydW5nX2FkZF9uZXdfc2xvdHMoc3RydWN0IHNjYW5fcnVuZyAq cnVuZywKKwkJCXN0cnVjdCB2bWFfc2xvdCAqKnNsb3RzLCB1bnNpZ25lZCBsb25nIG51bSkKK3sK KwlpbnQgZXJyOworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdDsKKwl1bnNpZ25lZCBsb25nIGk7CisJ c3RydWN0IHNyYWRpeF90cmVlX3Jvb3QgKnJvb3QgPSAmcnVuZy0+dm1hX3Jvb3Q7CisKKwllcnIg PSBzcmFkaXhfdHJlZV9lbnRlcihyb290LCAodm9pZCAqKilzbG90cywgbnVtKTsKKwlCVUdfT04o ZXJyKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlzbG90ID0gc2xvdHNbaV07 CisJCXNsb3QtPnJ1bmcgPSBydW5nOworCQlCVUdfT04odm1hX2Z1bGx5X3NjYW5uZWQoc2xvdCkp OworCX0KKworCWlmIChydW5nLT52bWFfcm9vdC5udW0gPT0gbnVtKQorCQlyZXNldF9jdXJyZW50 X3NjYW4ocnVuZywgMCwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJ1bmdfYWRkX29uZV9z bG90KHN0cnVjdCBzY2FuX3J1bmcgKnJ1bmcsCisJCQkJICAgICBzdHJ1Y3Qgdm1hX3Nsb3QgKnNs b3QpCit7CisJaW50IGVycjsKKworCWVyciA9IHNyYWRpeF90cmVlX2VudGVyKCZydW5nLT52bWFf cm9vdCwgKHZvaWQgKiopJnNsb3QsIDEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlz bG90LT5ydW5nID0gcnVuZzsKKwlpZiAocnVuZy0+dm1hX3Jvb3QubnVtID09IDEpCisJCXJlc2V0 X2N1cnJlbnRfc2NhbihydW5nLCAwLCAxKTsKKworCXJldHVybiAwOworfQorCisvKgorICogUmV0 dXJuIHRydWUgaWYgdGhlIHNsb3QgaXMgZGVsZXRlZCBmcm9tIGl0cyBydW5nLgorICovCitzdGF0 aWMgaW5saW5lIGludCB2bWFfcnVuZ19lbnRlcihzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3QsIHN0cnVj dCBzY2FuX3J1bmcgKnJ1bmcpCit7CisJc3RydWN0IHNjYW5fcnVuZyAqb2xkX3J1bmcgPSBzbG90 LT5ydW5nOworCWludCBlcnI7CisKKwlpZiAob2xkX3J1bmcgPT0gcnVuZykKKwkJcmV0dXJuIDA7 CisKKwlydW5nX3JtX3Nsb3Qoc2xvdCk7CisJZXJyID0gcnVuZ19hZGRfb25lX3Nsb3QocnVuZywg c2xvdCk7CisJaWYgKGVycikgeworCQllcnIgPSBydW5nX2FkZF9vbmVfc2xvdChvbGRfcnVuZywg c2xvdCk7CisJCVdBUk5fT04oZXJyKTsgLyogT09QUywgYmFkbHkgT09NLCB3ZSBsb3N0IHRoaXMg c2xvdCAqLworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCB2bWFfcnVu Z191cChzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3QpCit7CisJc3RydWN0IHNjYW5fcnVuZyAqcnVuZzsK KworCXJ1bmcgPSBzbG90LT5ydW5nOworCWlmIChzbG90LT5ydW5nICE9ICZ1a3NtX3NjYW5fbGFk ZGVyW1NDQU5fTEFEREVSX1NJWkUtMV0pCisJCXJ1bmcrKzsKKworCXJldHVybiB2bWFfcnVuZ19l bnRlcihzbG90LCBydW5nKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdm1hX3J1bmdfZG93bihz dHJ1Y3Qgdm1hX3Nsb3QgKnNsb3QpCit7CisJc3RydWN0IHNjYW5fcnVuZyAqcnVuZzsKKworCXJ1 bmcgPSBzbG90LT5ydW5nOworCWlmIChzbG90LT5ydW5nICE9ICZ1a3NtX3NjYW5fbGFkZGVyWzBd KQorCQlydW5nLS07CisKKwlyZXR1cm4gdm1hX3J1bmdfZW50ZXIoc2xvdCwgcnVuZyk7Cit9CisK Ky8qKgorICogY2FsX2RlZHVwX3JhdGlvKCkgLSBDYWxjdWxhdGUgdGhlIGRlZHVwbGljYXRpb24g cmF0aW8gZm9yIHRoaXMgc2xvdC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsX2RlZHVw X3JhdGlvKHN0cnVjdCB2bWFfc2xvdCAqc2xvdCkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKwor CUJVR19PTihzbG90LT5wYWdlc19zY2FubmVkID09IHNsb3QtPmxhc3Rfc2Nhbm5lZCk7CisKKwly ZXQgPSBzbG90LT5wYWdlc19tZXJnZWQ7CisKKwkvKiBUaHJhc2hpbmcgYXJlYSBmaWx0ZXJpbmcg Ki8KKwlpZiAocmV0ICYmIHVrc21fdGhyYXNoX3RocmVzaG9sZCkgeworCQlpZiAoc2xvdC0+cGFn ZXNfY293ZWQgKiAxMDAgLyBzbG90LT5wYWdlc19tZXJnZWQKKwkJICAgID4gdWtzbV90aHJhc2hf dGhyZXNob2xkKSB7CisJCQlyZXQgPSAwOworCQl9IGVsc2UgeworCQkJcmV0ID0gc2xvdC0+cGFn ZXNfbWVyZ2VkIC0gc2xvdC0+cGFnZXNfY293ZWQ7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0Owor fQorCisvKioKKyAqIGNhbF9kZWR1cF9yYXRpbygpIC0gQ2FsY3VsYXRlIHRoZSBkZWR1cGxpY2F0 aW9uIHJhdGlvIGZvciB0aGlzIHNsb3QuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNhbF9k ZWR1cF9yYXRpb19vbGQoc3RydWN0IHZtYV9zbG90ICpzbG90KQoreworCXVuc2lnbmVkIGxvbmcg cmV0OworCXVuc2lnbmVkIGxvbmcgcGFnZXNfc2Nhbm5lZDsKKworCXBhZ2VzX3NjYW5uZWQgPSBz bG90LT5wYWdlc19zY2FubmVkOworCWlmICghcGFnZXNfc2Nhbm5lZCkgeworCQlpZiAodWtzbV90 aHJhc2hfdGhyZXNob2xkKQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXBhZ2VzX3NjYW5uZWQg PSBzbG90LT5wYWdlc19zY2FubmVkOworCX0KKworCXJldCA9IHNsb3QtPnBhZ2VzX2JlbWVyZ2Vk ICogMTAwIC8gcGFnZXNfc2Nhbm5lZDsKKworCS8qIFRocmFzaGluZyBhcmVhIGZpbHRlcmluZyAq LworCWlmIChyZXQgJiYgdWtzbV90aHJhc2hfdGhyZXNob2xkKSB7CisJCWlmIChzbG90LT5wYWdl c19jb3dlZCAqIDEwMCAvIHNsb3QtPnBhZ2VzX2JlbWVyZ2VkCisJCSAgICA+IHVrc21fdGhyYXNo X3RocmVzaG9sZCkgeworCQkJcmV0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHNsb3QtPnBh Z2VzX2JlbWVyZ2VkIC0gc2xvdC0+cGFnZXNfY293ZWQ7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0 OworfQorCisvKioKKyAqIHN0YWJsZV9ub2RlX3JlaW5zZXJ0KCkgLSBXaGVuIHRoZSBoYXNoX3N0 cmVuZ3RoIGhhcyBiZWVuIGFkanVzdGVkLCB0aGUKKyAqIHN0YWJsZSB0cmVlIG5lZWQgdG8gYmUg cmVzdHJ1Y3R1cmVkLCB0aGlzIGlzIHRoZSBmdW5jdGlvbiByZS1pbnNlcnRpbmcgdGhlCisgKiBz dGFibGUgbm9kZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHN0YWJsZV9ub2RlX3JlaW5zZXJ0 KHN0cnVjdCBzdGFibGVfbm9kZSAqbmV3X25vZGUsCisJCQkJCXN0cnVjdCBwYWdlICpwYWdlLAor CQkJCQlzdHJ1Y3QgcmJfcm9vdCAqcm9vdF90cmVlcCwKKwkJCQkJc3RydWN0IGxpc3RfaGVhZCAq dHJlZV9ub2RlX2xpc3RwLAorCQkJCQl1MzIgaGFzaCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKm5l dyA9ICZyb290X3RyZWVwLT5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxM OworCXN0cnVjdCBzdGFibGVfbm9kZSAqc3RhYmxlX25vZGU7CisJc3RydWN0IHRyZWVfbm9kZSAq dHJlZV9ub2RlOworCXN0cnVjdCBwYWdlICp0cmVlX3BhZ2U7CisJaW50IGNtcDsKKworCXdoaWxl ICgqbmV3KSB7CisJCWludCBjbXA7CisKKwkJdHJlZV9ub2RlID0gcmJfZW50cnkoKm5ldywgc3Ry dWN0IHRyZWVfbm9kZSwgbm9kZSk7CisKKwkJY21wID0gaGFzaF9jbXAoaGFzaCwgdHJlZV9ub2Rl LT5oYXNoKTsKKworCQlpZiAoY21wIDwgMCkgeworCQkJcGFyZW50ID0gKm5ldzsKKwkJCW5ldyA9 ICZwYXJlbnQtPnJiX2xlZnQ7CisJCX0gZWxzZSBpZiAoY21wID4gMCkgeworCQkJcGFyZW50ID0g Km5ldzsKKwkJCW5ldyA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQl9IGVsc2UKKwkJCWJyZWFrOwor CX0KKworCWlmICgqbmV3KSB7CisJCS8qIGZpbmQgYSBzdGFibGUgdHJlZSBub2RlIHdpdGggc2Ft ZSBmaXJzdCBsZXZlbCBoYXNoIHZhbHVlICovCisJCXN0YWJsZV9ub2RlX2hhc2hfbWF4KG5ld19u b2RlLCBwYWdlLCBoYXNoKTsKKwkJaWYgKHRyZWVfbm9kZS0+Y291bnQgPT0gMSkgeworCQkJc3Rh YmxlX25vZGUgPSByYl9lbnRyeSh0cmVlX25vZGUtPnN1Yl9yb290LnJiX25vZGUsCisJCQkJCSAg ICAgICBzdHJ1Y3Qgc3RhYmxlX25vZGUsIG5vZGUpOworCQkJdHJlZV9wYWdlID0gZ2V0X3Vrc21f cGFnZShzdGFibGVfbm9kZSwgMSwgMCk7CisJCQlpZiAodHJlZV9wYWdlKSB7CisJCQkJc3RhYmxl X25vZGVfaGFzaF9tYXgoc3RhYmxlX25vZGUsCisJCQkJCQkgICAgICB0cmVlX3BhZ2UsIGhhc2gp OworCQkJCXB1dF9wYWdlKHRyZWVfcGFnZSk7CisKKwkJCQkvKiBwcmVwYXJlIGZvciBzdGFibGUg bm9kZSBpbnNlcnRpb24gKi8KKworCQkJCWNtcCA9IGhhc2hfY21wKG5ld19ub2RlLT5oYXNoX21h eCwKKwkJCQkJCSAgIHN0YWJsZV9ub2RlLT5oYXNoX21heCk7CisJCQkJcGFyZW50ID0gJnN0YWJs ZV9ub2RlLT5ub2RlOworCQkJCWlmIChjbXAgPCAwKQorCQkJCQluZXcgPSAmcGFyZW50LT5yYl9s ZWZ0OworCQkJCWVsc2UgaWYgKGNtcCA+IDApCisJCQkJCW5ldyA9ICZwYXJlbnQtPnJiX3JpZ2h0 OworCQkJCWVsc2UKKwkJCQkJZ290byBmYWlsZWQ7CisKKwkJCQlnb3RvIGFkZF9ub2RlOworCQkJ fSBlbHNlIHsKKwkJCQkvKiB0aGUgb25seSBzdGFibGVfbm9kZSBkZWxldGVkLCB0aGUgdHJlZSBu b2RlCisJCQkJICogd2FzIG5vdCBkZWxldGVkLgorCQkJCSAqLworCQkJCWdvdG8gdHJlZV9ub2Rl X3JldXNlOworCQkJfQorCQl9CisKKwkJLyogd2VsbCwgc2VhcmNoIHRoZSBjb2xsaXNpb24gc3Vi dHJlZSAqLworCQluZXcgPSAmdHJlZV9ub2RlLT5zdWJfcm9vdC5yYl9ub2RlOworCQlwYXJlbnQg PSBOVUxMOworCQlCVUdfT04oISpuZXcpOworCQl3aGlsZSAoKm5ldykgeworCQkJaW50IGNtcDsK KworCQkJc3RhYmxlX25vZGUgPSByYl9lbnRyeSgqbmV3LCBzdHJ1Y3Qgc3RhYmxlX25vZGUsIG5v ZGUpOworCisJCQljbXAgPSBoYXNoX2NtcChuZXdfbm9kZS0+aGFzaF9tYXgsCisJCQkJCSAgIHN0 YWJsZV9ub2RlLT5oYXNoX21heCk7CisKKwkJCWlmIChjbXAgPCAwKSB7CisJCQkJcGFyZW50ID0g Km5ldzsKKwkJCQluZXcgPSAmcGFyZW50LT5yYl9sZWZ0OworCQkJfSBlbHNlIGlmIChjbXAgPiAw KSB7CisJCQkJcGFyZW50ID0gKm5ldzsKKwkJCQluZXcgPSAmcGFyZW50LT5yYl9yaWdodDsKKwkJ CX0gZWxzZSB7CisJCQkJLyogb2gsIG5vLCBzdGlsbCBhIGNvbGxpc2lvbiAqLworCQkJCWdvdG8g ZmFpbGVkOworCQkJfQorCQl9CisKKwkJZ290byBhZGRfbm9kZTsKKwl9CisKKwkvKiBubyB0cmVl IG5vZGUgZm91bmQgKi8KKwl0cmVlX25vZGUgPSBhbGxvY190cmVlX25vZGUodHJlZV9ub2RlX2xp c3RwKTsKKwlpZiAoIXRyZWVfbm9kZSkgeworCQlwcmludGsoS0VSTl9FUlIgIlVLU006IG1lbW9y eSBhbGxvY2F0aW9uIGVycm9yIVxuIik7CisJCWdvdG8gZmFpbGVkOworCX0gZWxzZSB7CisJCXRy ZWVfbm9kZS0+aGFzaCA9IGhhc2g7CisJCXJiX2xpbmtfbm9kZSgmdHJlZV9ub2RlLT5ub2RlLCBw YXJlbnQsIG5ldyk7CisJCXJiX2luc2VydF9jb2xvcigmdHJlZV9ub2RlLT5ub2RlLCByb290X3Ry ZWVwKTsKKwordHJlZV9ub2RlX3JldXNlOgorCQkvKiBwcmVwYXJlIGZvciBzdGFibGUgbm9kZSBp bnNlcnRpb24gKi8KKwkJcGFyZW50ID0gTlVMTDsKKwkJbmV3ID0gJnRyZWVfbm9kZS0+c3ViX3Jv b3QucmJfbm9kZTsKKwl9CisKK2FkZF9ub2RlOgorCXJiX2xpbmtfbm9kZSgmbmV3X25vZGUtPm5v ZGUsIHBhcmVudCwgbmV3KTsKKwlyYl9pbnNlcnRfY29sb3IoJm5ld19ub2RlLT5ub2RlLCAmdHJl ZV9ub2RlLT5zdWJfcm9vdCk7CisJbmV3X25vZGUtPnRyZWVfbm9kZSA9IHRyZWVfbm9kZTsKKwl0 cmVlX25vZGUtPmNvdW50Kys7CisJcmV0dXJuOworCitmYWlsZWQ6CisJLyogVGhpcyBjYW4gb25s eSBoYXBwZW4gd2hlbiB0d28gbm9kZXMgaGF2ZSBjb2xsaWRlZAorCSAqIGluIHR3byBsZXZlbHMu CisJICovCisJbmV3X25vZGUtPnRyZWVfbm9kZSA9IE5VTEw7CisJcmV0dXJuOworfQorCitzdGF0 aWMgaW5saW5lIHZvaWQgZnJlZV9hbGxfdHJlZV9ub2RlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0 KQoreworCXN0cnVjdCB0cmVlX25vZGUgKm5vZGUsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2Vu dHJ5X3NhZmUobm9kZSwgdG1wLCBsaXN0LCBhbGxfbGlzdCkgeworCQlmcmVlX3RyZWVfbm9kZShu b2RlKTsKKwl9Cit9CisKKy8qKgorICogc3RhYmxlX3RyZWVfZGVsdGFfaGFzaCgpIC0gRGVsdGEg aGFzaCB0aGUgc3RhYmxlIHRyZWUgZnJvbSBwcmV2aW91cyBoYXNoCisgKiBzdHJlbmd0aCB0byB0 aGUgY3VycmVudCBoYXNoX3N0cmVuZ3RoLiBJdCByZS1zdHJ1Y3R1cmVzIHRoZSBob2xlIHRyZWUu CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGFibGVfdHJlZV9kZWx0YV9oYXNoKHUzMiBwcmV2 X2hhc2hfc3RyZW5ndGgpCit7CisJc3RydWN0IHN0YWJsZV9ub2RlICpub2RlLCAqdG1wOworCXN0 cnVjdCByYl9yb290ICpyb290X25ld190cmVlcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXdfdHJl ZV9ub2RlX2xpc3RwOworCisJc3RhYmxlX3RyZWVfaW5kZXggPSAoc3RhYmxlX3RyZWVfaW5kZXgg KyAxKSAlIDI7CisJcm9vdF9uZXdfdHJlZXAgPSAmcm9vdF9zdGFibGVfdHJlZVtzdGFibGVfdHJl ZV9pbmRleF07CisJbmV3X3RyZWVfbm9kZV9saXN0cCA9ICZzdGFibGVfdHJlZV9ub2RlX2xpc3Rb c3RhYmxlX3RyZWVfaW5kZXhdOworCSpyb290X25ld190cmVlcCA9IFJCX1JPT1Q7CisJQlVHX09O KCFsaXN0X2VtcHR5KG5ld190cmVlX25vZGVfbGlzdHApKTsKKworCS8qCisJICogd2UgbmVlZCB0 byBiZSBzYWZlLCB0aGUgbm9kZSBjb3VsZCBiZSByZW1vdmVkIGJ5IGdldF91a3NtX3BhZ2UoKQor CSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShub2RlLCB0bXAsICZzdGFibGVfbm9kZV9s aXN0LCBhbGxfbGlzdCkgeworCQl2b2lkICphZGRyOworCQlzdHJ1Y3QgcGFnZSAqbm9kZV9wYWdl OworCQl1MzIgaGFzaDsKKworCQkvKgorCQkgKiBXZSBhcmUgY29tcGxldGVseSByZS1zdHJ1Y3R1 cmluZyB0aGUgc3RhYmxlIG5vZGVzIHRvIGEgbmV3CisJCSAqIHN0YWJsZSB0cmVlLiBXZSBkb24n dCB3YW50IHRvIHRvdWNoIHRoZSBvbGQgdHJlZSB1bmxpbmtzIGFuZAorCQkgKiBvbGQgdHJlZV9u b2Rlcy4gVGhlIG9sZCB0cmVlX25vZGVzIHdpbGwgYmUgZnJlZWQgYXQgb25jZS4KKwkJICovCisJ CW5vZGVfcGFnZSA9IGdldF91a3NtX3BhZ2Uobm9kZSwgMCwgMCk7CisJCWlmICghbm9kZV9wYWdl KQorCQkJY29udGludWU7CisKKwkJaWYgKG5vZGUtPnRyZWVfbm9kZSkgeworCQkJaGFzaCA9IG5v ZGUtPnRyZWVfbm9kZS0+aGFzaDsKKworCQkJYWRkciA9IGttYXBfYXRvbWljKG5vZGVfcGFnZSk7 CisKKwkJCWhhc2ggPSBkZWx0YV9oYXNoKGFkZHIsIHByZXZfaGFzaF9zdHJlbmd0aCwKKwkJCQkJ ICBoYXNoX3N0cmVuZ3RoLCBoYXNoKTsKKwkJCWt1bm1hcF9hdG9taWMoYWRkcik7CisJCX0gZWxz ZSB7CisJCQkvKgorCQkJICppdCB3YXMgbm90IGluc2VydGVkIHRvIHJidHJlZSBkdWUgdG8gY29s bGlzaW9uIGluIGxhc3QKKwkJCSAqcm91bmQgc2Nhbi4KKwkJCSAqLworCQkJaGFzaCA9IHBhZ2Vf aGFzaChub2RlX3BhZ2UsIGhhc2hfc3RyZW5ndGgsIDApOworCQl9CisKKwkJc3RhYmxlX25vZGVf cmVpbnNlcnQobm9kZSwgbm9kZV9wYWdlLCByb290X25ld190cmVlcCwKKwkJCQkgICAgIG5ld190 cmVlX25vZGVfbGlzdHAsIGhhc2gpOworCQlwdXRfcGFnZShub2RlX3BhZ2UpOworCX0KKworCXJv b3Rfc3RhYmxlX3RyZWVwID0gcm9vdF9uZXdfdHJlZXA7CisJZnJlZV9hbGxfdHJlZV9ub2Rlcyhz dGFibGVfdHJlZV9ub2RlX2xpc3RwKTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoc3RhYmxlX3RyZWVf bm9kZV9saXN0cCkpOworCXN0YWJsZV90cmVlX25vZGVfbGlzdHAgPSBuZXdfdHJlZV9ub2RlX2xp c3RwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5jX2hhc2hfc3RyZW5ndGgodW5zaWduZWQg bG9uZyBkZWx0YSkKK3sKKwloYXNoX3N0cmVuZ3RoICs9IDEgPDwgZGVsdGE7CisJaWYgKGhhc2hf c3RyZW5ndGggPiBIQVNIX1NUUkVOR1RIX01BWCkKKwkJaGFzaF9zdHJlbmd0aCA9IEhBU0hfU1RS RU5HVEhfTUFYOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjX2hhc2hfc3RyZW5ndGgodW5z aWduZWQgbG9uZyBkZWx0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGNoYW5nZSA9IDEgPDwgZGVsdGE7 CisKKwlpZiAoaGFzaF9zdHJlbmd0aCA8PSBjaGFuZ2UgKyAxKQorCQloYXNoX3N0cmVuZ3RoID0g MTsKKwllbHNlCisJCWhhc2hfc3RyZW5ndGggLT0gY2hhbmdlOworfQorCitzdGF0aWMgaW5saW5l IHZvaWQgaW5jX2hhc2hfc3RyZW5ndGhfZGVsdGEodm9pZCkKK3sKKwloYXNoX3N0cmVuZ3RoX2Rl bHRhKys7CisJaWYgKGhhc2hfc3RyZW5ndGhfZGVsdGEgPiBIQVNIX1NUUkVOR1RIX0RFTFRBX01B WCkKKwkJaGFzaF9zdHJlbmd0aF9kZWx0YSA9IEhBU0hfU1RSRU5HVEhfREVMVEFfTUFYOworfQor CisvKgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9jdXJyZW50X25lZ19yYXRpbyh2 b2lkKQoreworCWlmICghcnNoYXNoX3BvcyB8fCByc2hhc2hfbmVnID4gcnNoYXNoX3BvcykKKwkJ cmV0dXJuIDEwMDsKKworCXJldHVybiBkaXY2NF91NjQoMTAwICogcnNoYXNoX25lZyAsIHJzaGFz aF9wb3MpOworfQorKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9jdXJyZW50 X25lZ19yYXRpbyh2b2lkKQoreworCXU2NCBwb3MgPSBiZW5lZml0LnBvczsKKwl1NjQgbmVnID0g YmVuZWZpdC5uZWc7CisKKwlpZiAoIW5lZykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXBvcyB8fCBu ZWcgPiBwb3MpCisJCXJldHVybiAxMDA7CisKKwlpZiAobmVnID4gZGl2NjRfdTY0KFU2NF9NQVgs IDEwMCkpCisJCXBvcyA9IGRpdjY0X3U2NChwb3MsIDEwMCk7CisJZWxzZQorCQluZWcgKj0gMTAw OworCisJcmV0dXJuIGRpdjY0X3U2NChuZWcsIHBvcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5z aWduZWQgbG9uZyBnZXRfY3VycmVudF9iZW5lZml0KHZvaWQpCit7CisJdTY0IHBvcyA9IGJlbmVm aXQucG9zOworCXU2NCBuZWcgPSBiZW5lZml0Lm5lZzsKKwl1NjQgc2Nhbm5lZCA9IGJlbmVmaXQu c2Nhbm5lZDsKKworCWlmIChuZWcgPiBwb3MpCisJCXJldHVybiAwOworCisJcmV0dXJuIGRpdjY0 X3U2NCgocG9zIC0gbmVnKSwgc2Nhbm5lZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGp1ZGdl X3JzaGFzaF9kaXJlY3Rpb24odm9pZCkKK3sKKwl1NjQgY3VycmVudF9uZWdfcmF0aW8sIHN0YWJs ZV9iZW5lZml0OworCXU2NCBjdXJyZW50X2JlbmVmaXQsIGRlbHRhID0gMDsKKwlpbnQgcmV0ID0g U1RJTEw7CisKKwkvKiBUcnkgdG8gcHJvYmUgYSB2YWx1ZSBhZnRlciB0aGUgYm9vdCwgYW5kIGlu IGNhc2UgdGhlIHN5c3RlbQorCSAgIGFyZSBzdGlsbCBmb3IgYSBsb25nIHRpbWUuICovCisJaWYg KChmdWxseV9zY2FubmVkX3JvdW5kICYgMHhGRlVMTCkgPT0gMTApIHsKKwkJcmV0ID0gT0JTQ1VS RTsKKwkJZ290byBvdXQ7CisJfQorCisJY3VycmVudF9uZWdfcmF0aW8gPSBnZXRfY3VycmVudF9u ZWdfcmF0aW8oKTsKKworCWlmIChjdXJyZW50X25lZ19yYXRpbyA9PSAwKSB7CisJCXJzaGFzaF9u ZWdfY29udF96ZXJvKys7CisJCWlmIChyc2hhc2hfbmVnX2NvbnRfemVybyA+IDIpCisJCQlyZXR1 cm4gR09fRE9XTjsKKwkJZWxzZQorCQkJcmV0dXJuIFNUSUxMOworCX0KKwlyc2hhc2hfbmVnX2Nv bnRfemVybyA9IDA7CisKKwlpZiAoY3VycmVudF9uZWdfcmF0aW8gPiA5MCkgeworCQlyZXQgPSBH T19VUDsKKwkJZ290byBvdXQ7CisJfQorCisJY3VycmVudF9iZW5lZml0ID0gZ2V0X2N1cnJlbnRf YmVuZWZpdCgpOworCXN0YWJsZV9iZW5lZml0ID0gcnNoYXNoX3N0YXRlLnN0YWJsZV9iZW5lZml0 OworCisJaWYgKCFzdGFibGVfYmVuZWZpdCkgeworCQlyZXQgPSBPQlNDVVJFOworCQlnb3RvIG91 dDsKKwl9CisKKwlpZiAoY3VycmVudF9iZW5lZml0ID4gc3RhYmxlX2JlbmVmaXQpCisJCWRlbHRh ID0gY3VycmVudF9iZW5lZml0IC0gc3RhYmxlX2JlbmVmaXQ7CisJZWxzZSBpZiAoY3VycmVudF9i ZW5lZml0IDwgc3RhYmxlX2JlbmVmaXQpCisJCWRlbHRhID0gc3RhYmxlX2JlbmVmaXQgLSBjdXJy ZW50X2JlbmVmaXQ7CisKKwlkZWx0YSA9IGRpdjY0X3U2NCgxMDAgKiBkZWx0YSAsIHN0YWJsZV9i ZW5lZml0KTsKKworCWlmIChkZWx0YSA+IDUwKSB7CisJCXJzaGFzaF9jb250X29ic2N1cmUrKzsK KwkJaWYgKHJzaGFzaF9jb250X29ic2N1cmUgPiAyKQorCQkJcmV0dXJuIE9CU0NVUkU7CisJCWVs c2UKKwkJCXJldHVybiBTVElMTDsKKwl9CisKK291dDoKKwlyc2hhc2hfY29udF9vYnNjdXJlID0g MDsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHJzaGFzaF9hZGp1c3QoKSAtIFRoZSBtYWlu IGZ1bmN0aW9uIHRvIGNvbnRyb2wgdGhlIHJhbmRvbSBzYW1wbGluZyBzdGF0ZQorICogbWFjaGlu ZSBmb3IgaGFzaCBzdHJlbmd0aCBhZGFwdGluZy4KKyAqCisgKiByZXR1cm4gdHJ1ZSBpZiBoYXNo X3N0cmVuZ3RoIGhhcyBjaGFuZ2VkLgorICovCitzdGF0aWMgaW5saW5lIGludCByc2hhc2hfYWRq dXN0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBwcmV2X2hhc2hfc3RyZW5ndGggPSBoYXNoX3N0 cmVuZ3RoOworCisJaWYgKCFlbmNvZGVfYmVuZWZpdCgpKQorCQlyZXR1cm4gMDsKKworCXN3aXRj aCAocnNoYXNoX3N0YXRlLnN0YXRlKSB7CisJY2FzZSBSU0hBU0hfU1RJTEw6CisJCXN3aXRjaCAo anVkZ2VfcnNoYXNoX2RpcmVjdGlvbigpKSB7CisJCWNhc2UgR09fVVA6CisJCQlpZiAocnNoYXNo X3N0YXRlLnByZV9kaXJlY3QgPT0gR09fRE9XTikKKwkJCQloYXNoX3N0cmVuZ3RoX2RlbHRhID0g MDsKKworCQkJaW5jX2hhc2hfc3RyZW5ndGgoaGFzaF9zdHJlbmd0aF9kZWx0YSk7CisJCQlpbmNf aGFzaF9zdHJlbmd0aF9kZWx0YSgpOworCQkJcnNoYXNoX3N0YXRlLnN0YWJsZV9iZW5lZml0ID0g Z2V0X2N1cnJlbnRfYmVuZWZpdCgpOworCQkJcnNoYXNoX3N0YXRlLnByZV9kaXJlY3QgPSBHT19V UDsKKwkJCWJyZWFrOworCisJCWNhc2UgR09fRE9XTjoKKwkJCWlmIChyc2hhc2hfc3RhdGUucHJl X2RpcmVjdCA9PSBHT19VUCkKKwkJCQloYXNoX3N0cmVuZ3RoX2RlbHRhID0gMDsKKworCQkJZGVj X2hhc2hfc3RyZW5ndGgoaGFzaF9zdHJlbmd0aF9kZWx0YSk7CisJCQlpbmNfaGFzaF9zdHJlbmd0 aF9kZWx0YSgpOworCQkJcnNoYXNoX3N0YXRlLnN0YWJsZV9iZW5lZml0ID0gZ2V0X2N1cnJlbnRf YmVuZWZpdCgpOworCQkJcnNoYXNoX3N0YXRlLnByZV9kaXJlY3QgPSBHT19ET1dOOworCQkJYnJl YWs7CisKKwkJY2FzZSBPQlNDVVJFOgorCQkJcnNoYXNoX3N0YXRlLnN0YWJsZV9wb2ludCA9IGhh c2hfc3RyZW5ndGg7CisJCQlyc2hhc2hfc3RhdGUudHVybl9wb2ludF9kb3duID0gaGFzaF9zdHJl bmd0aDsKKwkJCXJzaGFzaF9zdGF0ZS50dXJuX3BvaW50X3VwID0gaGFzaF9zdHJlbmd0aDsKKwkJ CXJzaGFzaF9zdGF0ZS50dXJuX2JlbmVmaXRfZG93biA9IGdldF9jdXJyZW50X2JlbmVmaXQoKTsK KwkJCXJzaGFzaF9zdGF0ZS50dXJuX2JlbmVmaXRfdXAgPSBnZXRfY3VycmVudF9iZW5lZml0KCk7 CisJCQlyc2hhc2hfc3RhdGUubG9va3VwX3dpbmRvd19pbmRleCA9IDA7CisJCQlyc2hhc2hfc3Rh dGUuc3RhdGUgPSBSU0hBU0hfVFJZRE9XTjsKKwkJCWRlY19oYXNoX3N0cmVuZ3RoKGhhc2hfc3Ry ZW5ndGhfZGVsdGEpOworCQkJaW5jX2hhc2hfc3RyZW5ndGhfZGVsdGEoKTsKKwkJCWJyZWFrOwor CisJCWNhc2UgU1RJTEw6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisJ CWJyZWFrOworCisJY2FzZSBSU0hBU0hfVFJZRE9XTjoKKwkJaWYgKHJzaGFzaF9zdGF0ZS5sb29r dXBfd2luZG93X2luZGV4KysgJSA1ID09IDApCisJCQlyc2hhc2hfc3RhdGUuYmVsb3dfY291bnQg PSAwOworCisJCWlmIChnZXRfY3VycmVudF9iZW5lZml0KCkgPCByc2hhc2hfc3RhdGUuc3RhYmxl X2JlbmVmaXQpCisJCQlyc2hhc2hfc3RhdGUuYmVsb3dfY291bnQrKzsKKwkJZWxzZSBpZiAoZ2V0 X2N1cnJlbnRfYmVuZWZpdCgpID4KKwkJCSByc2hhc2hfc3RhdGUudHVybl9iZW5lZml0X2Rvd24p IHsKKwkJCXJzaGFzaF9zdGF0ZS50dXJuX3BvaW50X2Rvd24gPSBoYXNoX3N0cmVuZ3RoOworCQkJ cnNoYXNoX3N0YXRlLnR1cm5fYmVuZWZpdF9kb3duID0gZ2V0X2N1cnJlbnRfYmVuZWZpdCgpOwor CQl9CisKKwkJaWYgKHJzaGFzaF9zdGF0ZS5iZWxvd19jb3VudCA+PSAzIHx8CisJCSAgICBqdWRn ZV9yc2hhc2hfZGlyZWN0aW9uKCkgPT0gR09fVVAgfHwKKwkJICAgIGhhc2hfc3RyZW5ndGggPT0g MSkgeworCQkJaGFzaF9zdHJlbmd0aCA9IHJzaGFzaF9zdGF0ZS5zdGFibGVfcG9pbnQ7CisJCQlo YXNoX3N0cmVuZ3RoX2RlbHRhID0gMDsKKwkJCWluY19oYXNoX3N0cmVuZ3RoKGhhc2hfc3RyZW5n dGhfZGVsdGEpOworCQkJaW5jX2hhc2hfc3RyZW5ndGhfZGVsdGEoKTsKKwkJCXJzaGFzaF9zdGF0 ZS5sb29rdXBfd2luZG93X2luZGV4ID0gMDsKKwkJCXJzaGFzaF9zdGF0ZS5zdGF0ZSA9IFJTSEFT SF9UUllVUDsKKwkJCWhhc2hfc3RyZW5ndGhfZGVsdGEgPSAwOworCQl9IGVsc2UgeworCQkJZGVj X2hhc2hfc3RyZW5ndGgoaGFzaF9zdHJlbmd0aF9kZWx0YSk7CisJCQlpbmNfaGFzaF9zdHJlbmd0 aF9kZWx0YSgpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSU0hBU0hfVFJZVVA6CisJCWlmIChy c2hhc2hfc3RhdGUubG9va3VwX3dpbmRvd19pbmRleCsrICUgNSA9PSAwKQorCQkJcnNoYXNoX3N0 YXRlLmJlbG93X2NvdW50ID0gMDsKKworCQlpZiAoZ2V0X2N1cnJlbnRfYmVuZWZpdCgpIDwgcnNo YXNoX3N0YXRlLnR1cm5fYmVuZWZpdF9kb3duKQorCQkJcnNoYXNoX3N0YXRlLmJlbG93X2NvdW50 Kys7CisJCWVsc2UgaWYgKGdldF9jdXJyZW50X2JlbmVmaXQoKSA+IHJzaGFzaF9zdGF0ZS50dXJu X2JlbmVmaXRfdXApIHsKKwkJCXJzaGFzaF9zdGF0ZS50dXJuX3BvaW50X3VwID0gaGFzaF9zdHJl bmd0aDsKKwkJCXJzaGFzaF9zdGF0ZS50dXJuX2JlbmVmaXRfdXAgPSBnZXRfY3VycmVudF9iZW5l Zml0KCk7CisJCX0KKworCQlpZiAocnNoYXNoX3N0YXRlLmJlbG93X2NvdW50ID49IDMgfHwKKwkJ ICAgIGp1ZGdlX3JzaGFzaF9kaXJlY3Rpb24oKSA9PSBHT19ET1dOIHx8CisJCSAgICBoYXNoX3N0 cmVuZ3RoID09IEhBU0hfU1RSRU5HVEhfTUFYKSB7CisJCQloYXNoX3N0cmVuZ3RoID0gcnNoYXNo X3N0YXRlLnR1cm5fYmVuZWZpdF91cCA+CisJCQkJcnNoYXNoX3N0YXRlLnR1cm5fYmVuZWZpdF9k b3duID8KKwkJCQlyc2hhc2hfc3RhdGUudHVybl9wb2ludF91cCA6CisJCQkJcnNoYXNoX3N0YXRl LnR1cm5fcG9pbnRfZG93bjsKKworCQkJcnNoYXNoX3N0YXRlLnN0YXRlID0gUlNIQVNIX1BSRV9T VElMTDsKKwkJfSBlbHNlIHsKKwkJCWluY19oYXNoX3N0cmVuZ3RoKGhhc2hfc3RyZW5ndGhfZGVs dGEpOworCQkJaW5jX2hhc2hfc3RyZW5ndGhfZGVsdGEoKTsKKwkJfQorCisJCWJyZWFrOworCisJ Y2FzZSBSU0hBU0hfTkVXOgorCWNhc2UgUlNIQVNIX1BSRV9TVElMTDoKKwkJcnNoYXNoX3N0YXRl LnN0YWJsZV9iZW5lZml0ID0gZ2V0X2N1cnJlbnRfYmVuZWZpdCgpOworCQlyc2hhc2hfc3RhdGUu c3RhdGUgPSBSU0hBU0hfU1RJTEw7CisJCWhhc2hfc3RyZW5ndGhfZGVsdGEgPSAwOworCQlicmVh azsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwkvKiByc2hhc2hfbmVnID0gcnNoYXNoX3Bv cyA9IDA7ICovCisJcmVzZXRfYmVuZWZpdCgpOworCisJaWYgKHByZXZfaGFzaF9zdHJlbmd0aCAh PSBoYXNoX3N0cmVuZ3RoKQorCQlzdGFibGVfdHJlZV9kZWx0YV9oYXNoKHByZXZfaGFzaF9zdHJl bmd0aCk7CisKKwlyZXR1cm4gcHJldl9oYXNoX3N0cmVuZ3RoICE9IGhhc2hfc3RyZW5ndGg7Cit9 CisKKy8qKgorICogcm91bmRfdXBkYXRlX2xhZGRlcigpIC0gVGhlIG1haW4gZnVuY3Rpb24gdG8g ZG8gdXBkYXRlIG9mIGFsbCB0aGUKKyAqIGFkanVzdG1lbnRzIHdoZW5ldmVyIGEgc2NhbiByb3Vu ZCBpcyBmaW5pc2hlZC4KKyAqLworc3RhdGljIG5vaW5saW5lIHZvaWQgcm91bmRfdXBkYXRlX2xh ZGRlcih2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZGVkdXA7CisJc3RydWN0IHZt YV9zbG90ICpzbG90LCAqdG1wX3Nsb3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NBTl9MQURERVJf U0laRTsgaSsrKSB7CisJCXVrc21fc2Nhbl9sYWRkZXJbaV0uZmxhZ3MgJj0gflVLU01fUlVOR19S T1VORF9GSU5JU0hFRDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2xvdCwgdG1w X3Nsb3QsICZ2bWFfc2xvdF9kZWR1cCwgZGVkdXBfbGlzdCkgeworCisJCS8qIHNsb3QgbWF5IGJl IHJ1bmdfcm1fc2xvdCgpIHdoZW4gbW0gZXhpdHMgKi8KKwkJaWYgKHNsb3QtPnNub2RlKSB7CisJ CQlkZWR1cCA9IGNhbF9kZWR1cF9yYXRpb19vbGQoc2xvdCk7CisJCQlpZiAoZGVkdXAgJiYgZGVk dXAgPj0gdWtzbV9hYnVuZGFudF90aHJlc2hvbGQpCisJCQkJdm1hX3J1bmdfdXAoc2xvdCk7CisJ CX0KKworCQlzbG90LT5wYWdlc19iZW1lcmdlZCA9IDA7CisJCXNsb3QtPnBhZ2VzX2Nvd2VkID0g MDsKKworCQlsaXN0X2RlbF9pbml0KCZzbG90LT5kZWR1cF9saXN0KTsKKwl9Cit9CisKK3N0YXRp YyB2b2lkIHVrc21fZGVsX3ZtYV9zbG90KHN0cnVjdCB2bWFfc2xvdCAqc2xvdCkKK3sKKwlpbnQg aSwgajsKKwlzdHJ1Y3Qgcm1hcF9saXN0X2VudHJ5ICplbnRyeTsKKworCWlmIChzbG90LT5zbm9k ZSkgeworCQkvKgorCQkgKiBJbiBjYXNlIGl0IGp1c3QgZmFpbGVkIHdoZW4gZW50ZXJpbmcgdGhl IHJ1bmcsIGl0J3Mgbm90CisJCSAqIG5lY2Vzc2FyeS4KKwkJICovCisJCXJ1bmdfcm1fc2xvdChz bG90KTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJnNsb3QtPmRlZHVwX2xpc3QpKQorCQlsaXN0 X2RlbCgmc2xvdC0+ZGVkdXBfbGlzdCk7CisKKwlpZiAoIXNsb3QtPnJtYXBfbGlzdF9wb29sIHx8 ICFzbG90LT5wb29sX2NvdW50cykgeworCQkvKiBJbiBjYXNlIGl0IE9PTWVkIGluIHVrc21fdm1h X2VudGVyKCkgKi8KKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNsb3QtPnBv b2xfc2l6ZTsgaSsrKSB7CisJCXZvaWQgKmFkZHI7CisKKwkJaWYgKCFzbG90LT5ybWFwX2xpc3Rf cG9vbFtpXSkKKwkJCWNvbnRpbnVlOworCisJCWFkZHIgPSBrbWFwKHNsb3QtPnJtYXBfbGlzdF9w b29sW2ldKTsKKwkJZm9yIChqID0gMDsgaiA8IFBBR0VfU0laRSAvIHNpemVvZigqZW50cnkpOyBq KyspIHsKKwkJCWVudHJ5ID0gKHN0cnVjdCBybWFwX2xpc3RfZW50cnkgKilhZGRyICsgajsKKwkJ CWlmIChpc19hZGRyKGVudHJ5LT5hZGRyKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghZW50cnkt Pml0ZW0pCisJCQkJY29udGludWU7CisKKwkJCXJlbW92ZV9ybWFwX2l0ZW1fZnJvbV90cmVlKGVu dHJ5LT5pdGVtKTsKKwkJCWZyZWVfcm1hcF9pdGVtKGVudHJ5LT5pdGVtKTsKKwkJCXNsb3QtPnBv b2xfY291bnRzW2ldLS07CisJCX0KKwkJQlVHX09OKHNsb3QtPnBvb2xfY291bnRzW2ldKTsKKwkJ a3VubWFwKHNsb3QtPnJtYXBfbGlzdF9wb29sW2ldKTsKKwkJX19mcmVlX3BhZ2Uoc2xvdC0+cm1h cF9saXN0X3Bvb2xbaV0pOworCX0KKwlrZnJlZShzbG90LT5ybWFwX2xpc3RfcG9vbCk7CisJa2Zy ZWUoc2xvdC0+cG9vbF9jb3VudHMpOworCitvdXQ6CisJc2xvdC0+cnVuZyA9IE5VTEw7CisJQlVH X09OKHVrc21fcGFnZXNfdG90YWwgPCBzbG90LT5wYWdlcyk7CisJaWYgKHNsb3QtPmZsYWdzICYg VUtTTV9TTE9UX0lOX1VLU00pCisJCXVrc21fcGFnZXNfdG90YWwgLT0gc2xvdC0+cGFnZXM7CisK KwlpZiAoc2xvdC0+ZnVsbHlfc2Nhbm5lZF9yb3VuZCA9PSBmdWxseV9zY2FubmVkX3JvdW5kKQor CQlzY2FubmVkX3ZpcnR1YWxfcGFnZXMgLT0gc2xvdC0+cGFnZXM7CisJZWxzZQorCQlzY2FubmVk X3ZpcnR1YWxfcGFnZXMgLT0gc2xvdC0+cGFnZXNfc2Nhbm5lZDsKKwlmcmVlX3ZtYV9zbG90KHNs b3QpOworfQorCisKKyNkZWZpbmUgU1BJTl9MT0NLX1BFUklPRAkzMgorc3RhdGljIHN0cnVjdCB2 bWFfc2xvdCAqY2xlYW51cF9zbG90c1tTUElOX0xPQ0tfUEVSSU9EXTsKK3N0YXRpYyBpbmxpbmUg dm9pZCBjbGVhbnVwX3ZtYV9zbG90cyh2b2lkKQoreworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdDsK KwlpbnQgaTsKKworCWkgPSAwOworCXNwaW5fbG9jaygmdm1hX3Nsb3RfbGlzdF9sb2NrKTsKKwl3 aGlsZSAoIWxpc3RfZW1wdHkoJnZtYV9zbG90X2RlbCkpIHsKKwkJc2xvdCA9IGxpc3RfZW50cnko dm1hX3Nsb3RfZGVsLm5leHQsCisJCQkJICBzdHJ1Y3Qgdm1hX3Nsb3QsIHNsb3RfbGlzdCk7CisJ CWxpc3RfZGVsKCZzbG90LT5zbG90X2xpc3QpOworCQljbGVhbnVwX3Nsb3RzW2krK10gPSBzbG90 OworCQlpZiAoaSA9PSBTUElOX0xPQ0tfUEVSSU9EKSB7CisJCQlzcGluX3VubG9jaygmdm1hX3Ns b3RfbGlzdF9sb2NrKTsKKwkJCXdoaWxlICgtLWkgPj0gMCkKKwkJCQl1a3NtX2RlbF92bWFfc2xv dChjbGVhbnVwX3Nsb3RzW2ldKTsKKwkJCWkgPSAwOworCQkJc3Bpbl9sb2NrKCZ2bWFfc2xvdF9s aXN0X2xvY2spOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZ2bWFfc2xvdF9saXN0X2xvY2spOwor CisJd2hpbGUgKC0taSA+PSAwKQorCQl1a3NtX2RlbF92bWFfc2xvdChjbGVhbnVwX3Nsb3RzW2ld KTsKK30KKworLyoKKypleHBvdGlvbmFsIG1vdmluZyBhdmVyYWdlIGZvcm11bGEKKyovCitzdGF0 aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZW1hKHVuc2lnbmVkIGxvbmcgY3VyciwgdW5zaWduZWQg bG9uZyBsYXN0X2VtYSkKK3sKKwkvKgorCSAqIEZvciBhIHZlcnkgaGlnaCBidXJzdCwgZXZlbiB0 aGUgZW1hIGNhbm5vdCB3b3JrIHdlbGwsIGEgZmFsc2UgdmVyeQorCSAqIGhpZ2ggcGVyLXBhZ2Ug dGltZSBlc3RpbWF0aW9uIGNhbiByZXN1bHQgaW4gZmVlZGJhY2sgaW4gdmVyeSBoaWdoCisJICog b3ZlcmhlYWQgb2YgY29udGV4dCBzd2l0aCBhbmQgcnVuZyB1cGRhdGUgLS0gdGhpcyB3aWxsIHRo ZW4gbGVhZAorCSAqIHRvIGhpZ2hlciBwZXItcGFwZXIgdGltZSwgdGhpcyBtYXkgbm90IGNvbnZl cmdlLgorCSAqCisJICogSW5zdGVhZCwgd2UgdHJ5IHRvIGFwcHJvYWNoIHRoaXMgdmFsdWUgaW4g YSBiaW5hcnkgbWFubmVyLgorCSAqLworCWlmIChjdXJyID4gbGFzdF9lbWEgKiAxMCkKKwkJcmV0 dXJuIGxhc3RfZW1hICogMjsKKworCXJldHVybiAoRU1BX0FMUEhBICogY3VyciArICgxMDAgLSBF TUFfQUxQSEEpICogbGFzdF9lbWEpIC8gMTAwOworfQorCisvKgorICogY29udmVydCBjcHUgcmF0 aW8gaW4gMS9USU1FX1JBVElPX1NDQUxFIGNvbmZpZ3VyZWQgYnkgdXNlciB0bworICogbmFub3Nl Y29uZHMgYmFzZWQgb24gY3VycmVudCB1a3NtX3NsZWVwX2ppZmZpZXMuCisgKi8KK3N0YXRpYyBp bmxpbmUgdW5zaWduZWQgbG9uZyBjcHVfcmF0aW9fdG9fbnNlYyh1bnNpZ25lZCBpbnQgcmF0aW8p Cit7CisJcmV0dXJuIE5TRUNfUEVSX1VTRUMgKiBqaWZmaWVzX3RvX3VzZWNzKHVrc21fc2xlZXBf amlmZmllcykgLworCQkoVElNRV9SQVRJT19TQ0FMRSAtIHJhdGlvKSAqIHJhdGlvOworfQorCisK K3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBydW5nX3JlYWxfcmF0aW8oaW50IGNwdV90aW1l X3JhdGlvKQoreworCXVuc2lnbmVkIGxvbmcgcmV0OworCisJQlVHX09OKCFjcHVfdGltZV9yYXRp byk7CisKKwlpZiAoY3B1X3RpbWVfcmF0aW8gPiAwKQorCQlyZXQgPSBjcHVfdGltZV9yYXRpbzsK KwllbHNlCisJCXJldCA9ICh1bnNpZ25lZCBsb25nKSgtY3B1X3RpbWVfcmF0aW8pICoKKwkJCXVr c21fbWF4X2NwdV9wZXJjZW50YWdlIC8gMTAwVUw7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogMTsK K30KKworc3RhdGljIG5vaW5saW5lIHZvaWQgdWtzbV9jYWxjX3NjYW5fcGFnZXModm9pZCkKK3sK KwlzdHJ1Y3Qgc2Nhbl9ydW5nICpsYWRkZXIgPSB1a3NtX3NjYW5fbGFkZGVyOworCXVuc2lnbmVk IGxvbmcgc2xlZXBfdXNlY3MsIG5zZWNzOworCXVuc2lnbmVkIGxvbmcgcmF0aW87CisJaW50IGk7 CisJdW5zaWduZWQgbG9uZyBwZXJfcGFnZTsKKworCWlmICh1a3NtX2VtYV9wYWdlX3RpbWUgPiAx MDAwMDAgfHwKKwkgICAgKCgodW5zaWduZWQgbG9uZykgdWtzbV9ldmFsX3JvdW5kICYgKDI1NlVM IC0gMSkpID09IDBVTCkpCisJCXVrc21fZW1hX3BhZ2VfdGltZSA9IFVLU01fUEFHRV9USU1FX0RF RkFVTFQ7CisKKwlwZXJfcGFnZSA9IHVrc21fZW1hX3BhZ2VfdGltZTsKKwlCVUdfT04oIXBlcl9w YWdlKTsKKworCS8qCisJICogRm9yIGV2ZXJ5IDggZXZhbCByb3VuZCwgd2UgdHJ5IHRvIHByb2Jl IGEgdWtzbV9zbGVlcF9qaWZmaWVzIHZhbHVlCisJICogYmFzZWQgb24gc2F2ZWQgdXNlciBpbnB1 dC4KKwkgKi8KKwlpZiAoKCh1bnNpZ25lZCBsb25nKSB1a3NtX2V2YWxfcm91bmQgJiAoOFVMIC0g MSkpID09IDBVTCkKKwkJdWtzbV9zbGVlcF9qaWZmaWVzID0gdWtzbV9zbGVlcF9zYXZlZDsKKwor CS8qIFdlIHJlcXVpcmUgYSBydW5nIHNjYW4gYXQgbGVhc3QgMSBwYWdlIGluIGEgcGVyaW9kLiAq LworCW5zZWNzID0gcGVyX3BhZ2U7CisJcmF0aW8gPSBydW5nX3JlYWxfcmF0aW8obGFkZGVyWzBd LmNwdV9yYXRpbyk7CisJaWYgKGNwdV9yYXRpb190b19uc2VjKHJhdGlvKSA8IG5zZWNzKSB7CisJ CXNsZWVwX3VzZWNzID0gbnNlY3MgKiAoVElNRV9SQVRJT19TQ0FMRSAtIHJhdGlvKSAvIHJhdGlv CisJCQkJLyBOU0VDX1BFUl9VU0VDOworCQl1a3NtX3NsZWVwX2ppZmZpZXMgPSB1c2Vjc190b19q aWZmaWVzKHNsZWVwX3VzZWNzKSArIDE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFNDQU5fTEFE REVSX1NJWkU7IGkrKykgeworCQlyYXRpbyA9IHJ1bmdfcmVhbF9yYXRpbyhsYWRkZXJbaV0uY3B1 X3JhdGlvKTsKKwkJbGFkZGVyW2ldLnBhZ2VzX3RvX3NjYW4gPSBjcHVfcmF0aW9fdG9fbnNlYyhy YXRpbykgLworCQkJCQlwZXJfcGFnZTsKKwkJQlVHX09OKCFsYWRkZXJbaV0ucGFnZXNfdG9fc2Nh bik7CisJCXVrc21fY2FsY19ydW5nX3N0ZXAoJmxhZGRlcltpXSwgcGVyX3BhZ2UsIHJhdGlvKTsK Kwl9Cit9CisKKy8qCisgKiBGcm9tIHRoZSBzY2FuIHRpbWUgb2YgdGhpcyByb3VuZCAobnMpIHRv IG5leHQgZXhwZWN0ZWQgbWluIHNsZWVwIHRpbWUKKyAqIChtcyksIGJlIGNhcmVmdWwgb2YgdGhl IHBvc3NpYmxlIG92ZXJmbG93cy4gcmF0aW8gaXMgdGFrZW4gZnJvbQorICogcnVuZ19yZWFsX3Jh dGlvKCkKKyAqLworc3RhdGljIGlubGluZQordW5zaWduZWQgaW50IHNjYW5fdGltZV90b19zbGVl cCh1bnNpZ25lZCBsb25nIGxvbmcgc2Nhbl90aW1lLCB1bnNpZ25lZCBsb25nIHJhdGlvKQorewor CXNjYW5fdGltZSA+Pj0gMjA7IC8qIHRvIG1zZWMgbGV2ZWwgbm93ICovCisJQlVHX09OKHNjYW5f dGltZSA+IChVTE9OR19NQVggLyBUSU1FX1JBVElPX1NDQUxFKSk7CisKKwlyZXR1cm4gKHVuc2ln bmVkIGludCkgKCh1bnNpZ25lZCBsb25nKSBzY2FuX3RpbWUgKgorCQkJICAgICAgIChUSU1FX1JB VElPX1NDQUxFIC0gcmF0aW8pIC8gcmF0aW8pOworfQorCisjZGVmaW5lIF9fcm91bmRfbWFzayh4 LCB5KSAoKF9fdHlwZW9mX18oeCkpKCh5KS0xKSkKKyNkZWZpbmUgcm91bmRfdXAoeCwgeSkgKCgo KHgpLTEpIHwgX19yb3VuZF9tYXNrKHgsIHkpKSsxKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVk IGxvbmcgdm1hX3Bvb2xfc2l6ZShzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3QpCit7CisJcmV0dXJuIHJv dW5kX3VwKHNpemVvZihzdHJ1Y3Qgcm1hcF9saXN0X2VudHJ5KSAqIHNsb3QtPnBhZ2VzLAorCQkJ UEFHRV9TSVpFKSA+PiBQQUdFX1NISUZUOworfQorCitzdGF0aWMgdm9pZCB1a3NtX3ZtYV9lbnRl cihzdHJ1Y3Qgdm1hX3Nsb3QgKipzbG90cywgdW5zaWduZWQgbG9uZyBudW0pCit7CisJc3RydWN0 IHNjYW5fcnVuZyAqcnVuZzsKKwl1bnNpZ25lZCBsb25nIHBvb2xfc2l6ZSwgaTsKKwlzdHJ1Y3Qg dm1hX3Nsb3QgKnNsb3Q7CisJaW50IGZhaWxlZDsKKworCXJ1bmcgPSAmdWtzbV9zY2FuX2xhZGRl clswXTsKKworCWZhaWxlZCA9IDA7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXNs b3QgPSBzbG90c1tpXTsKKworCQlwb29sX3NpemUgPSB2bWFfcG9vbF9zaXplKHNsb3QpOworCQlz bG90LT5ybWFwX2xpc3RfcG9vbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICoKKwkJ CQkJICAgICAgIHBvb2xfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghc2xvdC0+cm1hcF9saXN0 X3Bvb2wpCisJCQlicmVhazsKKworCQlzbG90LT5wb29sX2NvdW50cyA9IGt6YWxsb2Moc2l6ZW9m KHVuc2lnbmVkIGludCkgKiBwb29sX3NpemUsCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJaWYg KCFzbG90LT5wb29sX2NvdW50cykgeworCQkJa2ZyZWUoc2xvdC0+cm1hcF9saXN0X3Bvb2wpOwor CQkJYnJlYWs7CisJCX0KKworCQlzbG90LT5wb29sX3NpemUgPSBwb29sX3NpemU7CisJCUJVR19P TihDQU5fT1ZFUkZMT1dfVTY0KHVrc21fcGFnZXNfdG90YWwsIHNsb3QtPnBhZ2VzKSk7CisJCXNs b3QtPmZsYWdzIHw9IFVLU01fU0xPVF9JTl9VS1NNOworCQl1a3NtX3BhZ2VzX3RvdGFsICs9IHNs b3QtPnBhZ2VzOworCX0KKworCWlmIChpKQorCQlydW5nX2FkZF9uZXdfc2xvdHMocnVuZywgc2xv dHMsIGkpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgc3RydWN0IHZtYV9zbG90ICpiYXRjaF9z bG90c1tTTE9UX1RSRUVfTk9ERV9TVE9SRV9TSVpFXTsKKworc3RhdGljIHZvaWQgdWtzbV9lbnRl cl9hbGxfc2xvdHModm9pZCkKK3sKKwlzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3Q7CisJdW5zaWduZWQg bG9uZyBpbmRleDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVtcHR5X3ZtYV9saXN0OworCWludCBpOwor CisJaSA9IDA7CisJaW5kZXggPSAwOworCUlOSVRfTElTVF9IRUFEKCZlbXB0eV92bWFfbGlzdCk7 CisKKwlzcGluX2xvY2soJnZtYV9zbG90X2xpc3RfbG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5 KCZ2bWFfc2xvdF9uZXcpKSB7CisJCXNsb3QgPSBsaXN0X2VudHJ5KHZtYV9zbG90X25ldy5uZXh0 LAorCQkJCSAgc3RydWN0IHZtYV9zbG90LCBzbG90X2xpc3QpOworCisJCWlmICghc2xvdC0+dm1h LT5hbm9uX3ZtYSkgeworCQkJbGlzdF9tb3ZlKCZzbG90LT5zbG90X2xpc3QsICZlbXB0eV92bWFf bGlzdCk7CisJCX0gZWxzZSBpZiAodm1hX2Nhbl9lbnRlcihzbG90LT52bWEpKSB7CisJCQliYXRj aF9zbG90c1tpbmRleCsrXSA9IHNsb3Q7CisJCQlsaXN0X2RlbF9pbml0KCZzbG90LT5zbG90X2xp c3QpOworCQl9IGVsc2UgeworCQkJbGlzdF9tb3ZlKCZzbG90LT5zbG90X2xpc3QsICZ2bWFfc2xv dF9ub2FkZCk7CisJCX0KKworCQlpZiAoKytpID09IFNQSU5fTE9DS19QRVJJT0QgfHwKKwkJICAg IChpbmRleCAmJiAhKGluZGV4ICUgU0xPVF9UUkVFX05PREVfU1RPUkVfU0laRSkpKSB7CisJCQlz cGluX3VubG9jaygmdm1hX3Nsb3RfbGlzdF9sb2NrKTsKKworCQkJaWYgKGluZGV4ICYmICEoaW5k ZXggJSBTTE9UX1RSRUVfTk9ERV9TVE9SRV9TSVpFKSkgeworCQkJCXVrc21fdm1hX2VudGVyKGJh dGNoX3Nsb3RzLCBpbmRleCk7CisJCQkJaW5kZXggPSAwOworCQkJfQorCQkJaSA9IDA7CisJCQlj b25kX3Jlc2NoZWQoKTsKKwkJCXNwaW5fbG9jaygmdm1hX3Nsb3RfbGlzdF9sb2NrKTsKKwkJfQor CX0KKworCWxpc3Rfc3BsaWNlKCZlbXB0eV92bWFfbGlzdCwgJnZtYV9zbG90X25ldyk7CisKKwlz cGluX3VubG9jaygmdm1hX3Nsb3RfbGlzdF9sb2NrKTsKKworCWlmIChpbmRleCkKKwkJdWtzbV92 bWFfZW50ZXIoYmF0Y2hfc2xvdHMsIGluZGV4KTsKKworfQorCitzdGF0aWMgaW5saW5lIGludCBy dW5nX3JvdW5kX2ZpbmlzaGVkKHN0cnVjdCBzY2FuX3J1bmcgKnJ1bmcpCit7CisJcmV0dXJuIHJ1 bmctPmZsYWdzICYgVUtTTV9SVU5HX1JPVU5EX0ZJTklTSEVEOworfQorCitzdGF0aWMgaW5saW5l IHZvaWQganVkZ2Vfc2xvdChzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3QpCit7CisJc3RydWN0IHNjYW5f cnVuZyAqcnVuZyA9IHNsb3QtPnJ1bmc7CisJdW5zaWduZWQgbG9uZyBkZWR1cDsKKwlpbnQgZGVs ZXRlZDsKKworCWRlZHVwID0gY2FsX2RlZHVwX3JhdGlvKHNsb3QpOworCWlmICh2bWFfZnVsbHlf c2Nhbm5lZChzbG90KSAmJiB1a3NtX3RocmFzaF90aHJlc2hvbGQpCisJCWRlbGV0ZWQgPSB2bWFf cnVuZ19lbnRlcihzbG90LCAmdWtzbV9zY2FuX2xhZGRlclswXSk7CisJZWxzZSBpZiAoZGVkdXAg JiYgZGVkdXAgPj0gdWtzbV9hYnVuZGFudF90aHJlc2hvbGQpCisJCWRlbGV0ZWQgPSB2bWFfcnVu Z191cChzbG90KTsKKwllbHNlCisJCWRlbGV0ZWQgPSB2bWFfcnVuZ19kb3duKHNsb3QpOworCisJ c2xvdC0+cGFnZXNfbWVyZ2VkID0gMDsKKwlzbG90LT5wYWdlc19jb3dlZCA9IDA7CisKKwlpZiAo dm1hX2Z1bGx5X3NjYW5uZWQoc2xvdCkpCisJCXNsb3QtPnBhZ2VzX3NjYW5uZWQgPSAwOworCisJ c2xvdC0+bGFzdF9zY2FubmVkID0gc2xvdC0+cGFnZXNfc2Nhbm5lZDsKKworCS8qIElmIGl0cyBk ZWxldGVkIGluIGFib3ZlLCB0aGVuIHJ1bmcgd2FzIGFscmVhZHkgYWR2YW5jZWQuICovCisJaWYg KCFkZWxldGVkKQorCQlhZHZhbmNlX2N1cnJlbnRfc2NhbihydW5nKTsKK30KKworCitzdGF0aWMg aW5saW5lIGludCBoYXNoX3JvdW5kX2ZpbmlzaGVkKHZvaWQpCit7CisJaWYgKHNjYW5uZWRfdmly dHVhbF9wYWdlcyA+ICh1a3NtX3BhZ2VzX3RvdGFsID4+IDIpKSB7CisJCXNjYW5uZWRfdmlydHVh bF9wYWdlcyA9IDA7CisJCWlmICh1a3NtX3BhZ2VzX3NjYW5uZWQpCisJCQlmdWxseV9zY2FubmVk X3JvdW5kKys7CisKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQor CisjZGVmaW5lIFVLU01fTU1TRU1fQkFUQ0gJNQorI2RlZmluZSBCVVNZX1JFVFJZCQkxMDAKKwor LyoqCisgKiB1a3NtX2RvX3NjYW4oKSAgLSB0aGUgbWFpbiB3b3JrZXIgZnVuY3Rpb24uCisgKi8K K3N0YXRpYyBub2lubGluZSB2b2lkIHVrc21fZG9fc2Nhbih2b2lkKQoreworCXN0cnVjdCB2bWFf c2xvdCAqc2xvdCwgKml0ZXI7CisJc3RydWN0IG1tX3N0cnVjdCAqYnVzeV9tbTsKKwl1bnNpZ25l ZCBjaGFyIHJvdW5kX2ZpbmlzaGVkLCBhbGxfcnVuZ3NfZW10cHk7CisJaW50IGksIGVyciwgbW1z ZW1fYmF0Y2g7CisJdW5zaWduZWQgbG9uZyBwY29zdDsKKwlsb25nIGxvbmcgZGVsdGFfZXhlYzsK Kwl1bnNpZ25lZCBsb25nIHZwYWdlcywgbWF4X2NwdV9yYXRpbzsKKwl1bnNpZ25lZCBsb25nIGxv bmcgc3RhcnRfdGltZSwgZW5kX3RpbWUsIHNjYW5fdGltZTsKKwl1bnNpZ25lZCBpbnQgZXhwZWN0 ZWRfamlmZmllczsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwl2cGFnZXMgPSAwOworCisJc3RhcnRf dGltZSA9IHRhc2tfc2NoZWRfcnVudGltZShjdXJyZW50KTsKKwltYXhfY3B1X3JhdGlvID0gMDsK KwltbXNlbV9iYXRjaCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NBTl9MQURERVJfU0laRTsp IHsKKwkJc3RydWN0IHNjYW5fcnVuZyAqcnVuZyA9ICZ1a3NtX3NjYW5fbGFkZGVyW2ldOworCQl1 bnNpZ25lZCBsb25nIHJhdGlvOworCQlpbnQgYnVzeV9yZXRyeTsKKworCQlpZiAoIXJ1bmctPnBh Z2VzX3RvX3NjYW4pIHsKKwkJCWkrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFydW5n LT52bWFfcm9vdC5udW0pIHsKKwkJCXJ1bmctPnBhZ2VzX3RvX3NjYW4gPSAwOworCQkJaSsrOwor CQkJY29udGludWU7CisJCX0KKworCQlyYXRpbyA9IHJ1bmdfcmVhbF9yYXRpbyhydW5nLT5jcHVf cmF0aW8pOworCQlpZiAocmF0aW8gPiBtYXhfY3B1X3JhdGlvKQorCQkJbWF4X2NwdV9yYXRpbyA9 IHJhdGlvOworCisJCWJ1c3lfcmV0cnkgPSBCVVNZX1JFVFJZOworCQkvKgorCQkgKiBEbyBub3Qg Y29uc2lkZXIgcnVuZ19yb3VuZF9maW5pc2hlZCgpIGhlcmUsIGp1c3QgdXNlZCB1cCB0aGUKKwkJ ICogcnVuZy0+cGFnZXNfdG9fc2NhbiBxdW90YS4KKwkJICovCisJCXdoaWxlIChydW5nLT5wYWdl c190b19zY2FuICYmIHJ1bmctPnZtYV9yb290Lm51bSAmJgorCQkgICAgICAgbGlrZWx5KCFmcmVl emluZyhjdXJyZW50KSkpIHsKKwkJCWludCByZXNldCA9IDA7CisKKwkJCXNsb3QgPSBydW5nLT5j dXJyZW50X3NjYW47CisKKwkJCUJVR19PTih2bWFfZnVsbHlfc2Nhbm5lZChzbG90KSk7CisKKwkJ CWlmIChtbXNlbV9iYXRjaCkgeworCQkJCWVyciA9IDA7CisJCQl9IGVsc2UgeworCQkJCWVyciA9 IHRyeV9kb3duX3JlYWRfc2xvdF9tbWFwX3NlbShzbG90KTsKKwkJCX0KKworCQkJaWYgKGVyciA9 PSAtRU5PRU5UKSB7CitybV9zbG90OgorCQkJCXJ1bmdfcm1fc2xvdChzbG90KTsKKwkJCQljb250 aW51ZTsKKwkJCX0KKworCQkJYnVzeV9tbSA9IHNsb3QtPm1tOworCisJCQlpZiAoZXJyID09IC1F QlVTWSkgeworCQkJCS8qIHNraXAgb3RoZXIgdm1hcyBvbiB0aGUgc2FtZSBtbSAqLworCQkJCWRv IHsKKwkJCQkJcmVzZXQgPSBhZHZhbmNlX2N1cnJlbnRfc2NhbihydW5nKTsKKwkJCQkJaXRlciA9 IHJ1bmctPmN1cnJlbnRfc2NhbjsKKwkJCQkJYnVzeV9yZXRyeS0tOworCQkJCQlpZiAoaXRlci0+ dm1hLT52bV9tbSAhPSBidXN5X21tIHx8CisJCQkJCSAgICAhYnVzeV9yZXRyeSB8fCByZXNldCkK KwkJCQkJCWJyZWFrOworCQkJCX0gd2hpbGUgKDEpOworCisJCQkJaWYgKGl0ZXItPnZtYS0+dm1f bW0gIT0gYnVzeV9tbSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBz Y2FuIHJvdW5kIGZpbnNpc2hlZCAqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCUJV R19PTighdm1hX2Nhbl9lbnRlcihzbG90LT52bWEpKTsKKwkJCWlmICh1a3NtX3Rlc3RfZXhpdChz bG90LT52bWEtPnZtX21tKSkgeworCQkJCW1tc2VtX2JhdGNoID0gMDsKKwkJCQl1cF9yZWFkKCZz bG90LT52bWEtPnZtX21tLT5tbWFwX3NlbSk7CisJCQkJZ290byBybV9zbG90OworCQkJfQorCisJ CQlpZiAobW1zZW1fYmF0Y2gpCisJCQkJbW1zZW1fYmF0Y2gtLTsKKwkJCWVsc2UKKwkJCQltbXNl bV9iYXRjaCA9IFVLU01fTU1TRU1fQkFUQ0g7CisKKwkJCS8qIE9rLCB3ZSBoYXZlIHRha2UgdGhl IG1tYXBfc2VtLCByZWFkeSB0byBzY2FuICovCisJCQlzY2FuX3ZtYV9vbmVfcGFnZShzbG90KTsK KwkJCXJ1bmctPnBhZ2VzX3RvX3NjYW4tLTsKKwkJCXZwYWdlcysrOworCisJCQlpZiAocnVuZy0+ Y3VycmVudF9vZmZzZXQgKyBydW5nLT5zdGVwID4gc2xvdC0+cGFnZXMgLSAxCisJCQkgICAgfHwg dm1hX2Z1bGx5X3NjYW5uZWQoc2xvdCkpIHsKKwkJCQl1cF9yZWFkKCZzbG90LT52bWEtPnZtX21t LT5tbWFwX3NlbSk7CisJCQkJanVkZ2Vfc2xvdChzbG90KTsKKwkJCQltbXNlbV9iYXRjaCA9IDA7 CisJCQl9IGVsc2UgeworCQkJCXJ1bmctPmN1cnJlbnRfb2Zmc2V0ICs9IHJ1bmctPnN0ZXA7CisJ CQkJaWYgKCFtbXNlbV9iYXRjaCkKKwkJCQkJdXBfcmVhZCgmc2xvdC0+dm1hLT52bV9tbS0+bW1h cF9zZW0pOworCQkJfQorCisJCQlidXN5X3JldHJ5ID0gQlVTWV9SRVRSWTsKKwkJCWNvbmRfcmVz Y2hlZCgpOworCQl9CisKKwkJaWYgKG1tc2VtX2JhdGNoKSB7CisJCQl1cF9yZWFkKCZzbG90LT52 bWEtPnZtX21tLT5tbWFwX3NlbSk7CisJCQltbXNlbV9iYXRjaCA9IDA7CisJCX0KKworCQlpZiAo ZnJlZXppbmcoY3VycmVudCkpCisJCQlicmVhazsKKworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJ ZW5kX3RpbWUgPSB0YXNrX3NjaGVkX3J1bnRpbWUoY3VycmVudCk7CisJZGVsdGFfZXhlYyA9IGVu ZF90aW1lIC0gc3RhcnRfdGltZTsKKworCWlmIChmcmVlemluZyhjdXJyZW50KSkKKwkJcmV0dXJu OworCisJY2xlYW51cF92bWFfc2xvdHMoKTsKKwl1a3NtX2VudGVyX2FsbF9zbG90cygpOworCisJ cm91bmRfZmluaXNoZWQgPSAxOworCWFsbF9ydW5nc19lbXRweSA9IDE7CisJZm9yIChpID0gMDsg aSA8IFNDQU5fTEFEREVSX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2Nhbl9ydW5nICpydW5nID0g JnVrc21fc2Nhbl9sYWRkZXJbaV07CisKKwkJaWYgKHJ1bmctPnZtYV9yb290Lm51bSkgeworCQkJ YWxsX3J1bmdzX2VtdHB5ID0gMDsKKwkJCWlmICghcnVuZ19yb3VuZF9maW5pc2hlZChydW5nKSkK KwkJCQlyb3VuZF9maW5pc2hlZCA9IDA7CisJCX0KKwl9CisKKwlpZiAoYWxsX3J1bmdzX2VtdHB5 KQorCQlyb3VuZF9maW5pc2hlZCA9IDA7CisKKwlpZiAocm91bmRfZmluaXNoZWQpIHsKKwkJcm91 bmRfdXBkYXRlX2xhZGRlcigpOworCQl1a3NtX2V2YWxfcm91bmQrKzsKKworCQlpZiAoaGFzaF9y b3VuZF9maW5pc2hlZCgpICYmIHJzaGFzaF9hZGp1c3QoKSkgeworCQkJLyogUmVzZXQgdGhlIHVu c3RhYmxlIHJvb3QgaWZmIGhhc2ggc3RyZW5ndGggY2hhbmdlZCAqLworCQkJdWtzbV9oYXNoX3Jv dW5kKys7CisJCQlyb290X3Vuc3RhYmxlX3RyZWUgPSBSQl9ST09UOworCQkJZnJlZV9hbGxfdHJl ZV9ub2RlcygmdW5zdGFibGVfdHJlZV9ub2RlX2xpc3QpOworCQl9CisKKwkJLyoKKwkJICogQSBu dW1iZXIgb2YgcGFnZXMgY2FuIGhhbmcgYXJvdW5kIGluZGVmaW5pdGVseSBvbiBwZXItY3B1CisJ CSAqIHBhZ2V2ZWNzLCByYWlzZWQgcGFnZSBjb3VudCBwcmV2ZW50aW5nIHdyaXRlX3Byb3RlY3Rf cGFnZQorCQkgKiBmcm9tIG1lcmdpbmcgdGhlbS4gIFRob3VnaCBpdCBkb2Vzbid0IHJlYWxseSBt YXR0ZXIgbXVjaCwKKwkJICogaXQgaXMgcHV6emxpbmcgdG8gc2VlIHNvbWUgc3R1Y2sgaW4gcGFn ZXNfdm9sYXRpbGUgdW50aWwKKwkJICogb3RoZXIgYWN0aXZpdHkgam9zdGxlcyB0aGVtIG91dCwg YW5kIHRoZXkgYWxzbyBwcmV2ZW50ZWQKKwkJICogTFRQJ3MgS1NNIHRlc3QgZnJvbSBzdWNjZWVk aW5nIGRldGVybWluaXN0aWNhbGx5OyBzbyBkcmFpbgorCQkgKiB0aGVtIGhlcmUgKGhlcmUgcmF0 aGVyIHRoYW4gb24gZW50cnkgdG8gdWtzbV9kb19zY2FuKCksCisJCSAqIHNvIHdlIGRvbid0IElQ SSB0b28gb2Z0ZW4gd2hlbiBwYWdlc190b19zY2FuIGlzIHNldCBsb3cpLgorCQkgKi8KKwkJbHJ1 X2FkZF9kcmFpbl9hbGwoKTsKKwl9CisKKworCWlmICh2cGFnZXMgJiYgZGVsdGFfZXhlYyA+IDAp IHsKKwkJcGNvc3QgPSAodW5zaWduZWQgbG9uZykgZGVsdGFfZXhlYyAvIHZwYWdlczsKKwkJaWYg KGxpa2VseSh1a3NtX2VtYV9wYWdlX3RpbWUpKQorCQkJdWtzbV9lbWFfcGFnZV90aW1lID0gZW1h KHBjb3N0LCB1a3NtX2VtYV9wYWdlX3RpbWUpOworCQllbHNlCisJCQl1a3NtX2VtYV9wYWdlX3Rp bWUgPSBwY29zdDsKKwl9CisKKwl1a3NtX2NhbGNfc2Nhbl9wYWdlcygpOworCXVrc21fc2xlZXBf cmVhbCA9IHVrc21fc2xlZXBfamlmZmllczsKKwkvKiBpbiBjYXNlIG9mIHJhZGljYWwgY3B1IGJ1 cnN0cywgYXBwbHkgdGhlIHVwcGVyIGJvdW5kICovCisJZW5kX3RpbWUgPSB0YXNrX3NjaGVkX3J1 bnRpbWUoY3VycmVudCk7CisJaWYgKG1heF9jcHVfcmF0aW8gJiYgZW5kX3RpbWUgPiBzdGFydF90 aW1lKSB7CisJCXNjYW5fdGltZSA9IGVuZF90aW1lIC0gc3RhcnRfdGltZTsKKwkJZXhwZWN0ZWRf amlmZmllcyA9IG1zZWNzX3RvX2ppZmZpZXMoCisJCQlzY2FuX3RpbWVfdG9fc2xlZXAoc2Nhbl90 aW1lLCBtYXhfY3B1X3JhdGlvKSk7CisKKwkJaWYgKGV4cGVjdGVkX2ppZmZpZXMgPiB1a3NtX3Ns ZWVwX3JlYWwpCisJCQl1a3NtX3NsZWVwX3JlYWwgPSBleHBlY3RlZF9qaWZmaWVzOworCisJCS8q IFdlIGhhdmUgYSAxIHNlY29uZCB1cCBib3VuZCBmb3IgcmVzcG9uc2l2ZW5lc3MuICovCisJCWlm IChqaWZmaWVzX3RvX21zZWNzKHVrc21fc2xlZXBfcmVhbCkgPiBNU0VDX1BFUl9TRUMpCisJCQl1 a3NtX3NsZWVwX3JlYWwgPSBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCX0KKworCXJldHVybjsK K30KKworc3RhdGljIGludCBrc21kX3Nob3VsZF9ydW4odm9pZCkKK3sKKwlyZXR1cm4gdWtzbV9y dW4gJiBVS1NNX1JVTl9NRVJHRTsKK30KKworc3RhdGljIGludCB1a3NtX3NjYW5fdGhyZWFkKHZv aWQgKm5vdGhpbmcpCit7CisJc2V0X2ZyZWV6YWJsZSgpOworCXNldF91c2VyX25pY2UoY3VycmVu dCwgNSk7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQltdXRleF9sb2Nr KCZ1a3NtX3RocmVhZF9tdXRleCk7CisJCWlmIChrc21kX3Nob3VsZF9ydW4oKSkgeworCQkJdWtz bV9kb19zY2FuKCk7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZ1a3NtX3RocmVhZF9tdXRleCk7CisK KwkJdHJ5X3RvX2ZyZWV6ZSgpOworCisJCWlmIChrc21kX3Nob3VsZF9ydW4oKSkgeworCQkJc2No ZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHVrc21fc2xlZXBfcmVhbCk7CisJCQl1a3NtX3Ns ZWVwX3RpbWVzKys7CisJCX0gZWxzZSB7CisJCQl3YWl0X2V2ZW50X2ZyZWV6YWJsZSh1a3NtX3Ro cmVhZF93YWl0LAorCQkJCWtzbWRfc2hvdWxkX3J1bigpIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3Ao KSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBybWFwX3dhbGtfa3NtKHN0cnVjdCBw YWdlICpwYWdlLCBzdHJ1Y3Qgcm1hcF93YWxrX2NvbnRyb2wgKnJ3YykKK3sKKwlzdHJ1Y3Qgc3Rh YmxlX25vZGUgKnN0YWJsZV9ub2RlOworCXN0cnVjdCBub2RlX3ZtYSAqbm9kZV92bWE7CisJc3Ry dWN0IHJtYXBfaXRlbSAqcm1hcF9pdGVtOworCWludCByZXQgPSBTV0FQX0FHQUlOOworCWludCBz ZWFyY2hfbmV3X2ZvcmtzID0gMDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisKKwlWTV9CVUdf T05fUEFHRSghUGFnZUtzbShwYWdlKSwgcGFnZSk7CisJVk1fQlVHX09OX1BBR0UoIVBhZ2VMb2Nr ZWQocGFnZSksIHBhZ2UpOworCisJc3RhYmxlX25vZGUgPSBwYWdlX3N0YWJsZV9ub2RlKHBhZ2Up OworCWlmICghc3RhYmxlX25vZGUpCisJCXJldHVybiByZXQ7CithZ2FpbjoKKwlobGlzdF9mb3Jf ZWFjaF9lbnRyeShub2RlX3ZtYSwgJnN0YWJsZV9ub2RlLT5obGlzdCwgaGxpc3QpIHsKKwkJaGxp c3RfZm9yX2VhY2hfZW50cnkocm1hcF9pdGVtLCAmbm9kZV92bWEtPnJtYXBfaGxpc3QsIGhsaXN0 KSB7CisJCQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gcm1hcF9pdGVtLT5hbm9uX3ZtYTsK KwkJCXN0cnVjdCBhbm9uX3ZtYV9jaGFpbiAqdm1hYzsKKwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVj dCAqdm1hOworCisJCQlhbm9uX3ZtYV9sb2NrX3JlYWQoYW5vbl92bWEpOworCQkJYW5vbl92bWFf aW50ZXJ2YWxfdHJlZV9mb3JlYWNoKHZtYWMsICZhbm9uX3ZtYS0+cmJfcm9vdCwKKwkJCQkJCSAg ICAgICAwLCBVTE9OR19NQVgpIHsKKwkJCQl2bWEgPSB2bWFjLT52bWE7CisJCQkJYWRkcmVzcyA9 IGdldF9ybWFwX2FkZHIocm1hcF9pdGVtKTsKKworCQkJCWlmIChhZGRyZXNzIDwgdm1hLT52bV9z dGFydCB8fAorCQkJCSAgICBhZGRyZXNzID49IHZtYS0+dm1fZW5kKQorCQkJCQljb250aW51ZTsK KworCQkJCWlmICgocm1hcF9pdGVtLT5zbG90LT52bWEgPT0gdm1hKSA9PQorCQkJCSAgICBzZWFy Y2hfbmV3X2ZvcmtzKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChyd2MtPmludmFsaWRfdm1h ICYmIHJ3Yy0+aW52YWxpZF92bWEodm1hLCByd2MtPmFyZykpCisJCQkJCWNvbnRpbnVlOworCisJ CQkJcmV0ID0gcndjLT5ybWFwX29uZShwYWdlLCB2bWEsIGFkZHJlc3MsIHJ3Yy0+YXJnKTsKKwkJ CQlpZiAocmV0ICE9IFNXQVBfQUdBSU4pIHsKKwkJCQkJYW5vbl92bWFfdW5sb2NrX3JlYWQoYW5v bl92bWEpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisKKwkJCQlpZiAocndjLT5kb25lICYmIHJ3 Yy0+ZG9uZShwYWdlKSkgeworCQkJCQlhbm9uX3ZtYV91bmxvY2tfcmVhZChhbm9uX3ZtYSk7CisJ CQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJCWFub25fdm1hX3VubG9ja19yZWFkKGFub25f dm1hKTsKKwkJfQorCX0KKwlpZiAoIXNlYXJjaF9uZXdfZm9ya3MrKykKKwkJZ290byBhZ2FpbjsK K291dDoKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX01JR1JBVElPTgorLyogQ29t bW9uIGtzbSBpbnRlcmZhY2UgYnV0IG1heSBiZSBzcGVjaWZpYyB0byB1a3NtICovCit2b2lkIGtz bV9taWdyYXRlX3BhZ2Uoc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBwYWdlICpvbGRwYWdl KQoreworCXN0cnVjdCBzdGFibGVfbm9kZSAqc3RhYmxlX25vZGU7CisKKwlWTV9CVUdfT05fUEFH RSghUGFnZUxvY2tlZChvbGRwYWdlKSwgb2xkcGFnZSk7CisJVk1fQlVHX09OX1BBR0UoIVBhZ2VM b2NrZWQobmV3cGFnZSksIG5ld3BhZ2UpOworCVZNX0JVR19PTihuZXdwYWdlLT5tYXBwaW5nICE9 IG9sZHBhZ2UtPm1hcHBpbmcpOworCisJc3RhYmxlX25vZGUgPSBwYWdlX3N0YWJsZV9ub2RlKG5l d3BhZ2UpOworCWlmIChzdGFibGVfbm9kZSkgeworCQlWTV9CVUdfT04oc3RhYmxlX25vZGUtPmtw Zm4gIT0gcGFnZV90b19wZm4ob2xkcGFnZSkpOworCQlzdGFibGVfbm9kZS0+a3BmbiA9IHBhZ2Vf dG9fcGZuKG5ld3BhZ2UpOworCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfTUlHUkFUSU9OICovCisK KyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRQorc3RhdGljIHN0cnVjdCBzdGFibGVfbm9k ZSAqdWtzbV9jaGVja19zdGFibGVfdHJlZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKKwkJCQkJ CSB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisKKwlm b3IgKG5vZGUgPSByYl9maXJzdChyb290X3N0YWJsZV90cmVlcCk7IG5vZGU7IG5vZGUgPSByYl9u ZXh0KG5vZGUpKSB7CisJCXN0cnVjdCBzdGFibGVfbm9kZSAqc3RhYmxlX25vZGU7CisKKwkJc3Rh YmxlX25vZGUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgc3RhYmxlX25vZGUsIG5vZGUpOworCQlp ZiAoc3RhYmxlX25vZGUtPmtwZm4gPj0gc3RhcnRfcGZuICYmCisJCSAgICBzdGFibGVfbm9kZS0+ a3BmbiA8IGVuZF9wZm4pCisJCQlyZXR1cm4gc3RhYmxlX25vZGU7CisJfQorCXJldHVybiBOVUxM OworfQorCitzdGF0aWMgaW50IHVrc21fbWVtb3J5X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9i bG9jayAqc2VsZiwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqYXJnKQor eworCXN0cnVjdCBtZW1vcnlfbm90aWZ5ICptbiA9IGFyZzsKKwlzdHJ1Y3Qgc3RhYmxlX25vZGUg KnN0YWJsZV9ub2RlOworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIE1FTV9HT0lOR19PRkZM SU5FOgorCQkvKgorCQkgKiBLZWVwIGl0IHZlcnkgc2ltcGxlIGZvciBub3c6IGp1c3QgbG9jayBv dXQga3NtZCBhbmQKKwkJICogTUFEVl9VTk1FUkdFQUJMRSB3aGlsZSBhbnkgbWVtb3J5IGlzIGdv aW5nIG9mZmxpbmUuCisJCSAqIG11dGV4X2xvY2tfbmVzdGVkKCkgaXMgbmVjZXNzYXJ5IGJlY2F1 c2UgbG9ja2RlcCB3YXMgYWxhcm1lZAorCQkgKiB0aGF0IGhlcmUgd2UgdGFrZSB1a3NtX3RocmVh ZF9tdXRleCBpbnNpZGUgbm90aWZpZXIgY2hhaW4KKwkJICogbXV0ZXgsIGFuZCBsYXRlciB0YWtl IG5vdGlmaWVyIGNoYWluIG11dGV4IGluc2lkZQorCQkgKiB1a3NtX3RocmVhZF9tdXRleCB0byB1 bmxvY2sgaXQuICAgQnV0IHRoYXQncyBzYWZlIGJlY2F1c2UgYm90aAorCQkgKiBhcmUgaW5zaWRl IG1lbV9ob3RwbHVnX211dGV4LgorCQkgKi8KKwkJbXV0ZXhfbG9ja19uZXN0ZWQoJnVrc21fdGhy ZWFkX211dGV4LCBTSU5HTEVfREVQVEhfTkVTVElORyk7CisJCWJyZWFrOworCisJY2FzZSBNRU1f T0ZGTElORToKKwkJLyoKKwkJICogTW9zdCBvZiB0aGUgd29yayBpcyBkb25lIGJ5IHBhZ2UgbWln cmF0aW9uOyBidXQgdGhlcmUgbWlnaHQKKwkJICogYmUgYSBmZXcgc3RhYmxlX25vZGVzIGxlZnQg b3Zlciwgc3RpbGwgcG9pbnRpbmcgdG8gc3RydWN0CisJCSAqIHBhZ2VzIHdoaWNoIGhhdmUgYmVl biBvZmZsaW5lZDogcHJ1bmUgdGhvc2UgZnJvbSB0aGUgdHJlZS4KKwkJICovCisJCXdoaWxlICgo c3RhYmxlX25vZGUgPSB1a3NtX2NoZWNrX3N0YWJsZV90cmVlKG1uLT5zdGFydF9wZm4sCisJCQkJ CW1uLT5zdGFydF9wZm4gKyBtbi0+bnJfcGFnZXMpKSAhPSBOVUxMKQorCQkJcmVtb3ZlX25vZGVf ZnJvbV9zdGFibGVfdHJlZShzdGFibGVfbm9kZSwgMSwgMSk7CisJCS8qIGZhbGx0aHJvdWdoICov CisKKwljYXNlIE1FTV9DQU5DRUxfT0ZGTElORToKKwkJbXV0ZXhfdW5sb2NrKCZ1a3NtX3RocmVh ZF9tdXRleCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorI2VuZGlmIC8q IENPTkZJR19NRU1PUllfSE9UUkVNT1ZFICovCisKKyNpZmRlZiBDT05GSUdfU1lTRlMKKy8qCisg KiBUaGlzIGFsbCBjb21waWxlcyB3aXRob3V0IENPTkZJR19TWVNGUywgYnV0IGlzIGEgd2FzdGUg b2Ygc3BhY2UuCisgKi8KKworI2RlZmluZSBVS1NNX0FUVFJfUk8oX25hbWUpIFwKKwlzdGF0aWMg c3RydWN0IGtvYmpfYXR0cmlidXRlIF9uYW1lIyNfYXR0ciA9IF9fQVRUUl9STyhfbmFtZSkKKyNk ZWZpbmUgVUtTTV9BVFRSKF9uYW1lKSBcCisJc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBf bmFtZSMjX2F0dHIgPSBcCisJCV9fQVRUUihfbmFtZSwgMDY0NCwgX25hbWUjI19zaG93LCBfbmFt ZSMjX3N0b3JlKQorCitzdGF0aWMgc3NpemVfdCBtYXhfY3B1X3BlcmNlbnRhZ2Vfc2hvdyhzdHJ1 Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBj aGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHVrc21fbWF4X2NwdV9w ZXJjZW50YWdlKTsKK30KKworc3RhdGljIHNzaXplX3QgbWF4X2NwdV9wZXJjZW50YWdlX3N0b3Jl KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICph dHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWdu ZWQgbG9uZyBtYXhfY3B1X3BlcmNlbnRhZ2U7CisJaW50IGVycjsKKworCWVyciA9IHN0cmljdF9z dHJ0b3VsKGJ1ZiwgMTAsICZtYXhfY3B1X3BlcmNlbnRhZ2UpOworCWlmIChlcnIgfHwgbWF4X2Nw dV9wZXJjZW50YWdlID4gMTAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtYXhfY3B1X3Bl cmNlbnRhZ2UgPT0gMTAwKQorCQltYXhfY3B1X3BlcmNlbnRhZ2UgPSA5OTsKKwllbHNlIGlmICht YXhfY3B1X3BlcmNlbnRhZ2UgPCAxMCkKKwkJbWF4X2NwdV9wZXJjZW50YWdlID0gMTA7CisKKwl1 a3NtX21heF9jcHVfcGVyY2VudGFnZSA9IG1heF9jcHVfcGVyY2VudGFnZTsKKworCXJldHVybiBj b3VudDsKK30KK1VLU01fQVRUUihtYXhfY3B1X3BlcmNlbnRhZ2UpOworCitzdGF0aWMgc3NpemVf dCBzbGVlcF9taWxsaXNlY3Nfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgc3Ry dWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYo YnVmLCAiJXVcbiIsIGppZmZpZXNfdG9fbXNlY3ModWtzbV9zbGVlcF9qaWZmaWVzKSk7Cit9CisK K3N0YXRpYyBzc2l6ZV90IHNsZWVwX21pbGxpc2Vjc19zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29i aiwKKwkJCQkgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0 IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgbXNlY3M7CisJaW50 IGVycjsKKworCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZtc2Vjcyk7CisJaWYgKGVy ciB8fCBtc2VjcyA+IE1TRUNfUEVSX1NFQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl1a3NtX3Ns ZWVwX2ppZmZpZXMgPSBtc2Vjc190b19qaWZmaWVzKG1zZWNzKTsKKwl1a3NtX3NsZWVwX3NhdmVk ID0gdWtzbV9zbGVlcF9qaWZmaWVzOworCisJcmV0dXJuIGNvdW50OworfQorVUtTTV9BVFRSKHNs ZWVwX21pbGxpc2Vjcyk7CisKKworc3RhdGljIHNzaXplX3QgY3B1X2dvdmVybm9yX3Nob3coc3Ry dWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNo YXIgKmJ1ZikKK3sKKwlpbnQgbiA9IHNpemVvZih1a3NtX2NwdV9nb3Zlcm5vcl9zdHIpIC8gc2l6 ZW9mKGNoYXIgKik7CisJaW50IGk7CisKKwlidWZbMF0gPSAnXDAnOworCWZvciAoaSA9IDA7IGkg PCBuIDsgaSsrKSB7CisJCWlmICh1a3NtX2NwdV9nb3Zlcm5vciA9PSBpKQorCQkJc3RyY2F0KGJ1 ZiwgIlsiKTsKKworCQlzdHJjYXQoYnVmLCB1a3NtX2NwdV9nb3Zlcm5vcl9zdHJbaV0pOworCisJ CWlmICh1a3NtX2NwdV9nb3Zlcm5vciA9PSBpKQorCQkJc3RyY2F0KGJ1ZiwgIl0iKTsKKworCQlz dHJjYXQoYnVmLCAiICIpOworCX0KKwlzdHJjYXQoYnVmLCAiXG4iKTsKKworCXJldHVybiBzdHJs ZW4oYnVmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfcGVyZm9ybWFuY2VfdmFsdWVz KHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IHNjYW5fcnVuZyAqcnVuZzsKKwlzdHJ1Y3QgdWtz bV9jcHVfcHJlc2V0X3MgKnByZXNldCA9IHVrc21fY3B1X3ByZXNldCArIHVrc21fY3B1X2dvdmVy bm9yOworCisKKwlmb3IgKGkgPSAwOyBpIDwgU0NBTl9MQURERVJfU0laRTsgaSsrKSB7CisJCXJ1 bmcgPSB1a3NtX3NjYW5fbGFkZGVyICsgaTsKKwkJcnVuZy0+Y3B1X3JhdGlvID0gcHJlc2V0LT5j cHVfcmF0aW9baV07CisJCXJ1bmctPmNvdmVyX21zZWNzID0gcHJlc2V0LT5jb3Zlcl9tc2Vjc1tp XTsKKwl9CisKKwl1a3NtX21heF9jcHVfcGVyY2VudGFnZSA9IHByZXNldC0+bWF4X2NwdTsKK30K Kworc3RhdGljIHNzaXplX3QgY3B1X2dvdmVybm9yX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2Jq LAorCQkJCSAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjb25zdCBjaGFy ICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgbiA9IHNpemVvZih1a3NtX2NwdV9nb3Zlcm5v cl9zdHIpIC8gc2l6ZW9mKGNoYXIgKik7CisKKwlmb3IgKG4tLTsgbiA+PTAgOyBuLS0pIHsKKwkJ aWYgKCFzdHJuY21wKGJ1ZiwgdWtzbV9jcHVfZ292ZXJub3Jfc3RyW25dLAorCQkJICAgICBzdHJs ZW4odWtzbV9jcHVfZ292ZXJub3Jfc3RyW25dKSkpCisJCQlicmVhazsKKwl9CisKKwlpZiAobiA8 IDApCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UKKwkJdWtzbV9jcHVfZ292ZXJub3IgPSBuOwor CisJaW5pdF9wZXJmb3JtYW5jZV92YWx1ZXMoKTsKKworCXJldHVybiBjb3VudDsKK30KK1VLU01f QVRUUihjcHVfZ292ZXJub3IpOworCitzdGF0aWMgc3NpemVfdCBydW5fc2hvdyhzdHJ1Y3Qga29i amVjdCAqa29iaiwgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQor eworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB1a3NtX3J1bik7Cit9CisKK3N0YXRpYyBz c2l6ZV90IHJ1bl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmpfYXR0cmli dXRlICphdHRyLAorCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBl cnI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1Ziwg MTAsICZmbGFncyk7CisJaWYgKGVyciB8fCBmbGFncyA+IFVJTlRfTUFYKQorCQlyZXR1cm4gLUVJ TlZBTDsKKwlpZiAoZmxhZ3MgPiBVS1NNX1JVTl9NRVJHRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisK KwltdXRleF9sb2NrKCZ1a3NtX3RocmVhZF9tdXRleCk7CisJaWYgKHVrc21fcnVuICE9IGZsYWdz KSB7CisJCXVrc21fcnVuID0gZmxhZ3M7CisJfQorCW11dGV4X3VubG9jaygmdWtzbV90aHJlYWRf bXV0ZXgpOworCisJaWYgKGZsYWdzICYgVUtTTV9SVU5fTUVSR0UpCisJCXdha2VfdXBfaW50ZXJy dXB0aWJsZSgmdWtzbV90aHJlYWRfd2FpdCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CitVS1NNX0FU VFIocnVuKTsKKworc3RhdGljIHNzaXplX3QgYWJ1bmRhbnRfdGhyZXNob2xkX3Nob3coc3RydWN0 IGtvYmplY3QgKmtvYmosCisJCQkJICAgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNo YXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdWtzbV9hYnVuZGFudF90 aHJlc2hvbGQpOworfQorCitzdGF0aWMgc3NpemVfdCBhYnVuZGFudF90aHJlc2hvbGRfc3RvcmUo c3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICph dHRyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBl cnI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1Ziwg MTAsICZmbGFncyk7CisJaWYgKGVyciB8fCBmbGFncyA+IDk5KQorCQlyZXR1cm4gLUVJTlZBTDsK KworCXVrc21fYWJ1bmRhbnRfdGhyZXNob2xkID0gZmxhZ3M7CisKKwlyZXR1cm4gY291bnQ7Cit9 CitVS1NNX0FUVFIoYWJ1bmRhbnRfdGhyZXNob2xkKTsKKworc3RhdGljIHNzaXplX3QgdGhyYXNo X3RocmVzaG9sZF9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgc3RydWN0IGtv YmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAi JXVcbiIsIHVrc21fdGhyYXNoX3RocmVzaG9sZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRocmFz aF90aHJlc2hvbGRfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICAgc3RydWN0 IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90 IGNvdW50KQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWVyciA9IHN0 cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZmbGFncyk7CisJaWYgKGVyciB8fCBmbGFncyA+IDk5KQor CQlyZXR1cm4gLUVJTlZBTDsKKworCXVrc21fdGhyYXNoX3RocmVzaG9sZCA9IGZsYWdzOworCisJ cmV0dXJuIGNvdW50OworfQorVUtTTV9BVFRSKHRocmFzaF90aHJlc2hvbGQpOworCitzdGF0aWMg c3NpemVfdCBjcHVfcmF0aW9zX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgICAg c3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IGksIHNpemU7 CisJc3RydWN0IHNjYW5fcnVuZyAqcnVuZzsKKwljaGFyICpwID0gYnVmOworCisJZm9yIChpID0g MDsgaSA8IFNDQU5fTEFEREVSX1NJWkU7IGkrKykgeworCQlydW5nID0gJnVrc21fc2Nhbl9sYWRk ZXJbaV07CisKKwkJaWYgKHJ1bmctPmNwdV9yYXRpbyA+IDApCisJCQlzaXplID0gc3ByaW50Zihw LCAiJWQgIiwgcnVuZy0+Y3B1X3JhdGlvKTsKKwkJZWxzZQorCQkJc2l6ZSA9IHNwcmludGYocCwg Ik1BWC8lZCAiLAorCQkJCQlUSU1FX1JBVElPX1NDQUxFIC8gLXJ1bmctPmNwdV9yYXRpbyk7CisK KwkJcCArPSBzaXplOworCX0KKworCSpwKysgPSAnXG4nOworCSpwID0gJ1wwJzsKKworCXJldHVy biBwIC0gYnVmOworfQorCitzdGF0aWMgc3NpemVfdCBjcHVfcmF0aW9zX3N0b3JlKHN0cnVjdCBr b2JqZWN0ICprb2JqLAorCQkJCSAgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJ CQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgaSwgY3B1cmF0 aW9zW1NDQU5fTEFEREVSX1NJWkVdLCBlcnI7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlzdHJ1 Y3Qgc2Nhbl9ydW5nICpydW5nOworCWNoYXIgKnAsICplbmQgPSBOVUxMOworCisJcCA9IGt6YWxs b2MoY291bnQsIEdGUF9LRVJORUwpOworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlt ZW1jcHkocCwgYnVmLCBjb3VudCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NBTl9MQURERVJfU0la RTsgaSsrKSB7CisJCWlmIChpICE9IFNDQU5fTEFEREVSX1NJWkUgLTEpIHsKKwkJCWVuZCA9IHN0 cmNocihwLCAnICcpOworCQkJaWYgKCFlbmQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCSpl bmQgPSAnXDAnOworCQl9CisKKwkJaWYgKHN0cnN0cihwLCAiTUFYLyIpKSB7CisJCQlwID0gc3Ry Y2hyKHAsICcvJykgKyAxOworCQkJZXJyID0gc3RyaWN0X3N0cnRvdWwocCwgMTAsICZ2YWx1ZSk7 CisJCQlpZiAoZXJyIHx8IHZhbHVlID4gVElNRV9SQVRJT19TQ0FMRSB8fCAhdmFsdWUpCisJCQkJ cmV0dXJuIC1FSU5WQUw7CisKKwkJCWNwdXJhdGlvc1tpXSA9IC0gKGludCkgKFRJTUVfUkFUSU9f U0NBTEUgLyB2YWx1ZSk7CisJCX0gZWxzZSB7CisJCQllcnIgPSBzdHJpY3Rfc3RydG91bChwLCAx MCwgJnZhbHVlKTsKKwkJCWlmIChlcnIgfHwgdmFsdWUgPiBUSU1FX1JBVElPX1NDQUxFIHx8ICF2 YWx1ZSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJY3B1cmF0aW9zW2ldID0gdmFsdWU7CisJ CX0KKworCQlwID0gZW5kICsgMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NBTl9MQURERVJf U0laRTsgaSsrKSB7CisJCXJ1bmcgPSAmdWtzbV9zY2FuX2xhZGRlcltpXTsKKworCQlydW5nLT5j cHVfcmF0aW8gPSBjcHVyYXRpb3NbaV07CisJfQorCisJcmV0dXJuIGNvdW50OworfQorVUtTTV9B VFRSKGNwdV9yYXRpb3MpOworCitzdGF0aWMgc3NpemVfdCBldmFsX2ludGVydmFsc19zaG93KHN0 cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0 ciwgY2hhciAqYnVmKQoreworCWludCBpLCBzaXplOworCXN0cnVjdCBzY2FuX3J1bmcgKnJ1bmc7 CisJY2hhciAqcCA9IGJ1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0FOX0xBRERFUl9TSVpFOyBp KyspIHsKKwkJcnVuZyA9ICZ1a3NtX3NjYW5fbGFkZGVyW2ldOworCQlzaXplID0gc3ByaW50Zihw LCAiJXUgIiwgcnVuZy0+Y292ZXJfbXNlY3MpOworCQlwICs9IHNpemU7CisJfQorCisJKnArKyA9 ICdcbic7CisJKnAgPSAnXDAnOworCisJcmV0dXJuIHAgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6 ZV90IGV2YWxfaW50ZXJ2YWxzX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAg IHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICBjb25zdCBjaGFyICpidWYs IHNpemVfdCBjb3VudCkKK3sKKwlpbnQgaSwgZXJyOworCXVuc2lnbmVkIGxvbmcgdmFsdWVzW1ND QU5fTEFEREVSX1NJWkVdOworCXN0cnVjdCBzY2FuX3J1bmcgKnJ1bmc7CisJY2hhciAqcCwgKmVu ZCA9IE5VTEw7CisKKwlwID0ga3phbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKQor CQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweShwLCBidWYsIGNvdW50KTsKKworCWZvciAoaSA9 IDA7IGkgPCBTQ0FOX0xBRERFUl9TSVpFOyBpKyspIHsKKwkJaWYgKGkgIT0gU0NBTl9MQURERVJf U0laRSAtMSkgeworCQkJZW5kID0gc3RyY2hyKHAsICcgJyk7CisJCQlpZiAoIWVuZCkKKwkJCQly ZXR1cm4gLUVJTlZBTDsKKworCQkJKmVuZCA9ICdcMCc7CisJCX0KKworCQllcnIgPSBzdHJpY3Rf c3RydG91bChwLCAxMCwgJnZhbHVlc1tpXSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gLUVJTlZB TDsKKworCQlwID0gZW5kICsgMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NBTl9MQURERVJf U0laRTsgaSsrKSB7CisJCXJ1bmcgPSAmdWtzbV9zY2FuX2xhZGRlcltpXTsKKworCQlydW5nLT5j b3Zlcl9tc2VjcyA9IHZhbHVlc1tpXTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CitVS1NNX0FU VFIoZXZhbF9pbnRlcnZhbHMpOworCitzdGF0aWMgc3NpemVfdCBlbWFfcGVyX3BhZ2VfdGltZV9z aG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0 dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIHVrc21fZW1h X3BhZ2VfdGltZSk7Cit9CitVS1NNX0FUVFJfUk8oZW1hX3Blcl9wYWdlX3RpbWUpOworCitzdGF0 aWMgc3NpemVfdCBwYWdlc19zaGFyZWRfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkg c3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmlu dGYoYnVmLCAiJWx1XG4iLCB1a3NtX3BhZ2VzX3NoYXJlZCk7Cit9CitVS1NNX0FUVFJfUk8ocGFn ZXNfc2hhcmVkKTsKKworc3RhdGljIHNzaXplX3QgcGFnZXNfc2hhcmluZ19zaG93KHN0cnVjdCBr b2JqZWN0ICprb2JqLAorCQkJCSAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpi dWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCB1a3NtX3BhZ2VzX3NoYXJpbmcp OworfQorVUtTTV9BVFRSX1JPKHBhZ2VzX3NoYXJpbmcpOworCitzdGF0aWMgc3NpemVfdCBwYWdl c191bnNoYXJlZF9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgIHN0cnVjdCBrb2Jq X2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVs dVxuIiwgdWtzbV9wYWdlc191bnNoYXJlZCk7Cit9CitVS1NNX0FUVFJfUk8ocGFnZXNfdW5zaGFy ZWQpOworCitzdGF0aWMgc3NpemVfdCBmdWxsX3NjYW5zX3Nob3coc3RydWN0IGtvYmplY3QgKmtv YmosCisJCQkgICAgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7 CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxsdVxuIiwgZnVsbHlfc2Nhbm5lZF9yb3VuZCk7Cit9 CitVS1NNX0FUVFJfUk8oZnVsbF9zY2Fucyk7CisKK3N0YXRpYyBzc2l6ZV90IHBhZ2VzX3NjYW5u ZWRfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBrb2JqX2F0dHJpYnV0 ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IDA7CisJdTY0IGRl bHRhLCByZXQ7CisKKwlpZiAocGFnZXNfc2Nhbm5lZF9zdG9yZWQpIHsKKwkJYmFzZSA9IHBhZ2Vz X3NjYW5uZWRfYmFzZTsKKwkJcmV0ID0gcGFnZXNfc2Nhbm5lZF9zdG9yZWQ7CisJCWRlbHRhID0g dWtzbV9wYWdlc19zY2FubmVkID4+IGJhc2U7CisJCWlmIChDQU5fT1ZFUkZMT1dfVTY0KHJldCwg ZGVsdGEpKSB7CisJCQlyZXQgPj49IDE7CisJCQlkZWx0YSA+Pj0gMTsKKwkJCWJhc2UrKzsKKwkJ CXJldCArPSBkZWx0YTsKKwkJfQorCX0gZWxzZSB7CisJCXJldCA9IHVrc21fcGFnZXNfc2Nhbm5l ZDsKKwl9CisKKwl3aGlsZSAocmV0ID4gVUxPTkdfTUFYKSB7CisJCXJldCA+Pj0gMTsKKwkJYmFz ZSsrOworCX0KKworCWlmIChiYXNlKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlbHUgKiAyXiVs dVxuIiwgKHVuc2lnbmVkIGxvbmcpcmV0LCBiYXNlKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRm KGJ1ZiwgIiVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpcmV0KTsKK30KK1VLU01fQVRUUl9STyhwYWdl c19zY2FubmVkKTsKKworc3RhdGljIHNzaXplX3QgaGFzaF9zdHJlbmd0aF9zaG93KHN0cnVjdCBr b2JqZWN0ICprb2JqLAorCQkJCSAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpi dWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCBoYXNoX3N0cmVuZ3RoKTsKK30K K1VLU01fQVRUUl9STyhoYXNoX3N0cmVuZ3RoKTsKKworc3RhdGljIHNzaXplX3Qgc2xlZXBfdGlt ZXNfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBrb2JqX2F0dHJpYnV0 ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsbHVcbiIsIHVr c21fc2xlZXBfdGltZXMpOworfQorVUtTTV9BVFRSX1JPKHNsZWVwX3RpbWVzKTsKKworCitzdGF0 aWMgc3RydWN0IGF0dHJpYnV0ZSAqdWtzbV9hdHRyc1tdID0geworCSZtYXhfY3B1X3BlcmNlbnRh Z2VfYXR0ci5hdHRyLAorCSZzbGVlcF9taWxsaXNlY3NfYXR0ci5hdHRyLAorCSZjcHVfZ292ZXJu b3JfYXR0ci5hdHRyLAorCSZydW5fYXR0ci5hdHRyLAorCSZlbWFfcGVyX3BhZ2VfdGltZV9hdHRy LmF0dHIsCisJJnBhZ2VzX3NoYXJlZF9hdHRyLmF0dHIsCisJJnBhZ2VzX3NoYXJpbmdfYXR0ci5h dHRyLAorCSZwYWdlc191bnNoYXJlZF9hdHRyLmF0dHIsCisJJmZ1bGxfc2NhbnNfYXR0ci5hdHRy LAorCSZwYWdlc19zY2FubmVkX2F0dHIuYXR0ciwKKwkmaGFzaF9zdHJlbmd0aF9hdHRyLmF0dHIs CisJJnNsZWVwX3RpbWVzX2F0dHIuYXR0ciwKKwkmdGhyYXNoX3RocmVzaG9sZF9hdHRyLmF0dHIs CisJJmFidW5kYW50X3RocmVzaG9sZF9hdHRyLmF0dHIsCisJJmNwdV9yYXRpb3NfYXR0ci5hdHRy LAorCSZldmFsX2ludGVydmFsc19hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1 Y3QgYXR0cmlidXRlX2dyb3VwIHVrc21fYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSB1a3NtX2F0 dHJzLAorCS5uYW1lID0gInVrc20iLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfU1lTRlMgKi8KKwor c3RhdGljIGlubGluZSB2b2lkIGluaXRfc2Nhbl9sYWRkZXIodm9pZCkKK3sKKwlpbnQgaTsKKwlz dHJ1Y3Qgc2Nhbl9ydW5nICpydW5nOworCisJZm9yIChpID0gMDsgaSA8IFNDQU5fTEFEREVSX1NJ WkU7IGkrKykgeworCQlydW5nID0gdWtzbV9zY2FuX2xhZGRlciArIGk7CisJCXNsb3RfdHJlZV9p bml0X3Jvb3QoJnJ1bmctPnZtYV9yb290KTsKKwl9CisKKwlpbml0X3BlcmZvcm1hbmNlX3ZhbHVl cygpOworCXVrc21fY2FsY19zY2FuX3BhZ2VzKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNh bF9wb3NpdGl2ZV9uZWdhdGl2ZV9jb3N0cyh2b2lkKQoreworCXN0cnVjdCBwYWdlICpwMSwgKnAy OworCXVuc2lnbmVkIGNoYXIgKmFkZHIxLCAqYWRkcjI7CisJdW5zaWduZWQgbG9uZyBpLCB0aW1l X3N0YXJ0LCBoYXNoX2Nvc3Q7CisJdW5zaWduZWQgbG9uZyBsb29wbnVtID0gMDsKKworCS8qSU1Q T1JUQU5UOiB2b2xhdGlsZSBpcyBuZWVkZWQgdG8gcHJldmVudCBvdmVyLW9wdGltaXphdGlvbiBi eSBnY2MuICovCisJdm9sYXRpbGUgdTMyIGhhc2g7CisJdm9sYXRpbGUgaW50IHJldDsKKworCXAx ID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXAxKQorCQlyZXR1cm4gLUVOT01FTTsK KworCXAyID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXAyKQorCQlyZXR1cm4gLUVO T01FTTsKKworCWFkZHIxID0ga21hcF9hdG9taWMocDEpOworCWFkZHIyID0ga21hcF9hdG9taWMo cDIpOworCW1lbXNldChhZGRyMSwgcHJhbmRvbV91MzIoKSwgUEFHRV9TSVpFKTsKKwltZW1jcHko YWRkcjIsIGFkZHIxLCBQQUdFX1NJWkUpOworCisJLyogbWFrZSBzdXJlIHRoYXQgdGhlIHR3byBw YWdlcyBkaWZmZXIgaW4gbGFzdCBieXRlICovCisJYWRkcjJbUEFHRV9TSVpFLTFdID0gfmFkZHIy W1BBR0VfU0laRS0xXTsKKwlrdW5tYXBfYXRvbWljKGFkZHIyKTsKKwlrdW5tYXBfYXRvbWljKGFk ZHIxKTsKKworCXRpbWVfc3RhcnQgPSBqaWZmaWVzOworCXdoaWxlIChqaWZmaWVzIC0gdGltZV9z dGFydCA8IDEwMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCisJCQloYXNoID0gcGFn ZV9oYXNoKHAxLCBIQVNIX1NUUkVOR1RIX0ZVTEwsIDApOworCQlsb29wbnVtICs9IDEwMDsKKwl9 CisJaGFzaF9jb3N0ID0gKGppZmZpZXMgLSB0aW1lX3N0YXJ0KTsKKworCXRpbWVfc3RhcnQgPSBq aWZmaWVzOworCWZvciAoaSA9IDA7IGkgPCBsb29wbnVtOyBpKyspCisJCXJldCA9IHBhZ2VzX2lk ZW50aWNhbChwMSwgcDIpOworCW1lbWNtcF9jb3N0ID0gSEFTSF9TVFJFTkdUSF9GVUxMICogKGpp ZmZpZXMgLSB0aW1lX3N0YXJ0KTsKKwltZW1jbXBfY29zdCAvPSBoYXNoX2Nvc3Q7CisJcHJpbnRr KEtFUk5fSU5GTyAiVUtTTTogcmVsYXRpdmUgbWVtY21wX2Nvc3QgPSAlbHUgIgorCQkJICJoYXNo PSV1IGNtcF9yZXQ9JWQuXG4iLAorCSAgICAgICBtZW1jbXBfY29zdCwgaGFzaCwgcmV0KTsKKwor CV9fZnJlZV9wYWdlKHAxKTsKKwlfX2ZyZWVfcGFnZShwMik7CisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgaW5pdF96ZXJvcGFnZV9oYXNoX3RhYmxlKHZvaWQpCit7CisJc3RydWN0IHBhZ2Ug KnBhZ2U7CisJY2hhciAqYWRkcjsKKwlpbnQgaTsKKworCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9L RVJORUwpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhZGRyID0ga21hcF9h dG9taWMocGFnZSk7CisJbWVtc2V0KGFkZHIsIDAsIFBBR0VfU0laRSk7CisJa3VubWFwX2F0b21p YyhhZGRyKTsKKworCXplcm9faGFzaF90YWJsZSA9IGttYWxsb2MoSEFTSF9TVFJFTkdUSF9NQVgg KiBzaXplb2YodTMyKSwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCF6ZXJvX2hhc2hfdGFibGUpCisJ CXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IEhBU0hfU1RSRU5HVEhfTUFYOyBp KyspCisJCXplcm9faGFzaF90YWJsZVtpXSA9IHBhZ2VfaGFzaChwYWdlLCBpLCAwKTsKKworCV9f ZnJlZV9wYWdlKHBhZ2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlu aXRfcmFuZG9tX3NhbXBsaW5nKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBpOworCXJhbmRvbV9u dW1zID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghcmFuZG9tX251bXMp CisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IEhBU0hfU1RSRU5HVEhfRlVM TDsgaSsrKQorCQlyYW5kb21fbnVtc1tpXSA9IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSEFTSF9T VFJFTkdUSF9GVUxMOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyByYW5kX3JhbmdlLCBzd2FwX2lu ZGV4LCB0bXA7CisKKwkJcmFuZF9yYW5nZSA9IEhBU0hfU1RSRU5HVEhfRlVMTCAtIGk7CisJCXN3 YXBfaW5kZXggPSBpICsgcHJhbmRvbV91MzIoKSAlIHJhbmRfcmFuZ2U7CisJCXRtcCA9IHJhbmRv bV9udW1zW2ldOworCQlyYW5kb21fbnVtc1tpXSA9ICByYW5kb21fbnVtc1tzd2FwX2luZGV4XTsK KwkJcmFuZG9tX251bXNbc3dhcF9pbmRleF0gPSB0bXA7CisJfQorCisJcnNoYXNoX3N0YXRlLnN0 YXRlID0gUlNIQVNIX05FVzsKKwlyc2hhc2hfc3RhdGUuYmVsb3dfY291bnQgPSAwOworCXJzaGFz aF9zdGF0ZS5sb29rdXBfd2luZG93X2luZGV4ID0gMDsKKworCXJldHVybiBjYWxfcG9zaXRpdmVf bmVnYXRpdmVfY29zdHMoKTsKK30KKworc3RhdGljIGludCBfX2luaXQgdWtzbV9zbGFiX2luaXQo dm9pZCkKK3sKKwlybWFwX2l0ZW1fY2FjaGUgPSBVS1NNX0tNRU1fQ0FDSEUocm1hcF9pdGVtLCAw KTsKKwlpZiAoIXJtYXBfaXRlbV9jYWNoZSkKKwkJZ290byBvdXQ7CisKKwlzdGFibGVfbm9kZV9j YWNoZSA9IFVLU01fS01FTV9DQUNIRShzdGFibGVfbm9kZSwgMCk7CisJaWYgKCFzdGFibGVfbm9k ZV9jYWNoZSkKKwkJZ290byBvdXRfZnJlZTE7CisKKwlub2RlX3ZtYV9jYWNoZSA9IFVLU01fS01F TV9DQUNIRShub2RlX3ZtYSwgMCk7CisJaWYgKCFub2RlX3ZtYV9jYWNoZSkKKwkJZ290byBvdXRf ZnJlZTI7CisKKwl2bWFfc2xvdF9jYWNoZSA9IFVLU01fS01FTV9DQUNIRSh2bWFfc2xvdCwgMCk7 CisJaWYgKCF2bWFfc2xvdF9jYWNoZSkKKwkJZ290byBvdXRfZnJlZTM7CisKKwl0cmVlX25vZGVf Y2FjaGUgPSBVS1NNX0tNRU1fQ0FDSEUodHJlZV9ub2RlLCAwKTsKKwlpZiAoIXRyZWVfbm9kZV9j YWNoZSkKKwkJZ290byBvdXRfZnJlZTQ7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU0OgorCWtt ZW1fY2FjaGVfZGVzdHJveSh2bWFfc2xvdF9jYWNoZSk7CitvdXRfZnJlZTM6CisJa21lbV9jYWNo ZV9kZXN0cm95KG5vZGVfdm1hX2NhY2hlKTsKK291dF9mcmVlMjoKKwlrbWVtX2NhY2hlX2Rlc3Ry b3koc3RhYmxlX25vZGVfY2FjaGUpOworb3V0X2ZyZWUxOgorCWttZW1fY2FjaGVfZGVzdHJveShy bWFwX2l0ZW1fY2FjaGUpOworb3V0OgorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9p ZCBfX2luaXQgdWtzbV9zbGFiX2ZyZWUodm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koc3Rh YmxlX25vZGVfY2FjaGUpOworCWttZW1fY2FjaGVfZGVzdHJveShybWFwX2l0ZW1fY2FjaGUpOwor CWttZW1fY2FjaGVfZGVzdHJveShub2RlX3ZtYV9jYWNoZSk7CisJa21lbV9jYWNoZV9kZXN0cm95 KHZtYV9zbG90X2NhY2hlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kodHJlZV9ub2RlX2NhY2hlKTsK K30KKworLyogQ29tbW9uIGludGVyZmFjZSB0byBrc20sIGRpZmZlcmVudCB0byBpdC4gKi8KK2lu dCBrc21fbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBz dGFydCwKKwkJdW5zaWduZWQgbG9uZyBlbmQsIGludCBhZHZpY2UsIHVuc2lnbmVkIGxvbmcgKnZt X2ZsYWdzKQoreworCWludCBlcnI7CisKKwlzd2l0Y2ggKGFkdmljZSkgeworCWNhc2UgTUFEVl9N RVJHRUFCTEU6CisJCXJldHVybiAwOwkJLyoganVzdCBpZ25vcmUgdGhlIGFkdmljZSAqLworCisJ Y2FzZSBNQURWX1VOTUVSR0VBQkxFOgorCQlpZiAoISgqdm1fZmxhZ3MgJiBWTV9NRVJHRUFCTEUp KQorCQkJcmV0dXJuIDA7CQkvKiBqdXN0IGlnbm9yZSB0aGUgYWR2aWNlICovCisKKwkJaWYgKHZt YS0+YW5vbl92bWEpIHsKKwkJCWVyciA9IHVubWVyZ2VfdWtzbV9wYWdlcyh2bWEsIHN0YXJ0LCBl bmQpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJdWtzbV9yZW1vdmVf dm1hKHZtYSk7CisJCSp2bV9mbGFncyAmPSB+Vk1fTUVSR0VBQkxFOworCQlicmVhazsKKwl9CisK KwlyZXR1cm4gMDsKK30KKworLyogQ29tbW9uIGludGVyZmFjZSB0byBrc20sIGFjdHVhbGx5IHRo ZSBzYW1lLiAqLworc3RydWN0IHBhZ2UgKmtzbV9taWdodF9uZWVkX3RvX2NvcHkoc3RydWN0IHBh Z2UgKnBhZ2UsCisJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBh ZGRyZXNzKQoreworCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBwYWdlX2Fub25fdm1hKHBh Z2UpOworCXN0cnVjdCBwYWdlICpuZXdfcGFnZTsKKworCWlmIChQYWdlS3NtKHBhZ2UpKSB7CisJ CWlmIChwYWdlX3N0YWJsZV9ub2RlKHBhZ2UpKQorCQkJcmV0dXJuIHBhZ2U7CS8qIG5vIG5lZWQg dG8gY29weSBpdCAqLworCX0gZWxzZSBpZiAoIWFub25fdm1hKSB7CisJCXJldHVybiBwYWdlOwkJ Lyogbm8gbmVlZCB0byBjb3B5IGl0ICovCisJfSBlbHNlIGlmIChhbm9uX3ZtYS0+cm9vdCA9PSB2 bWEtPmFub25fdm1hLT5yb290ICYmCisJCSBwYWdlLT5pbmRleCA9PSBsaW5lYXJfcGFnZV9pbmRl eCh2bWEsIGFkZHJlc3MpKSB7CisJCXJldHVybiBwYWdlOwkJLyogc3RpbGwgbm8gbmVlZCB0byBj b3B5IGl0ICovCisJfQorCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKQorCQlyZXR1cm4gcGFnZTsJ CS8qIGxldCBkb19zd2FwX3BhZ2UgcmVwb3J0IHRoZSBlcnJvciAqLworCisJbmV3X3BhZ2UgPSBh bGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVJfTU9WQUJMRSwgdm1hLCBhZGRyZXNzKTsKKwlpZiAo bmV3X3BhZ2UpIHsKKwkJY29weV91c2VyX2hpZ2hwYWdlKG5ld19wYWdlLCBwYWdlLCBhZGRyZXNz LCB2bWEpOworCisJCVNldFBhZ2VEaXJ0eShuZXdfcGFnZSk7CisJCV9fU2V0UGFnZVVwdG9kYXRl KG5ld19wYWdlKTsKKwkJX19zZXRfcGFnZV9sb2NrZWQobmV3X3BhZ2UpOworCX0KKworCXJldHVy biBuZXdfcGFnZTsKK30KKworc3RhdGljIGludCBfX2luaXQgdWtzbV9pbml0KHZvaWQpCit7CisJ c3RydWN0IHRhc2tfc3RydWN0ICp1a3NtX3RocmVhZDsKKwlpbnQgZXJyOworCisJdWtzbV9zbGVl cF9qaWZmaWVzID0gbXNlY3NfdG9famlmZmllcygxMDApOworCXVrc21fc2xlZXBfc2F2ZWQgPSB1 a3NtX3NsZWVwX2ppZmZpZXM7CisKKwlzbG90X3RyZWVfaW5pdCgpOworCWluaXRfc2Nhbl9sYWRk ZXIoKTsKKworCisJZXJyID0gaW5pdF9yYW5kb21fc2FtcGxpbmcoKTsKKwlpZiAoZXJyKQorCQln b3RvIG91dF9mcmVlMjsKKworCWVyciA9IHVrc21fc2xhYl9pbml0KCk7CisJaWYgKGVycikKKwkJ Z290byBvdXRfZnJlZTE7CisKKwllcnIgPSBpbml0X3plcm9wYWdlX2hhc2hfdGFibGUoKTsKKwlp ZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlMDsKKworCXVrc21fdGhyZWFkID0ga3RocmVhZF9ydW4o dWtzbV9zY2FuX3RocmVhZCwgTlVMTCwgInVrc21kIik7CisJaWYgKElTX0VSUih1a3NtX3RocmVh ZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1a3NtOiBjcmVhdGluZyBrdGhyZWFkIGZhaWxlZFxu Iik7CisJCWVyciA9IFBUUl9FUlIodWtzbV90aHJlYWQpOworCQlnb3RvIG91dF9mcmVlOworCX0K KworI2lmZGVmIENPTkZJR19TWVNGUworCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cChtbV9rb2Jq LCAmdWtzbV9hdHRyX2dyb3VwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAidWtz bTogcmVnaXN0ZXIgc3lzZnMgZmFpbGVkXG4iKTsKKwkJa3RocmVhZF9zdG9wKHVrc21fdGhyZWFk KTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisjZWxzZQorCXVrc21fcnVuID0gVUtTTV9SVU5fTUVS R0U7CS8qIG5vIHdheSBmb3IgdXNlciB0byBzdGFydCBpdCAqLworCisjZW5kaWYgLyogQ09ORklH X1NZU0ZTICovCisKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRQorCS8qCisJICogQ2hv b3NlIGEgaGlnaCBwcmlvcml0eSBzaW5jZSB0aGUgY2FsbGJhY2sgdGFrZXMgdWtzbV90aHJlYWRf bXV0ZXg6CisJICogbGF0ZXIgY2FsbGJhY2tzIGNvdWxkIG9ubHkgYmUgdGFraW5nIGxvY2tzIHdo aWNoIG5lc3Qgd2l0aGluIHRoYXQuCisJICovCisJaG90cGx1Z19tZW1vcnlfbm90aWZpZXIodWtz bV9tZW1vcnlfY2FsbGJhY2ssIDEwMCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU6 CisJa2ZyZWUoemVyb19oYXNoX3RhYmxlKTsKK291dF9mcmVlMDoKKwl1a3NtX3NsYWJfZnJlZSgp Oworb3V0X2ZyZWUxOgorCWtmcmVlKHJhbmRvbV9udW1zKTsKK291dF9mcmVlMjoKKwlrZnJlZSh1 a3NtX3NjYW5fbGFkZGVyKTsKKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgTU9EVUxFCitzdWJz eXNfaW5pdGNhbGwoa3NtX2luaXQpOworI2Vsc2UKK2xhdGVfaW5pdGNhbGwodWtzbV9pbml0KTsK KyNlbmRpZgorCmRpZmYgLS1naXQgYS9tbS92bXN0YXQuYyBiL21tL3Ztc3RhdC5jCmluZGV4IDFi MTJkMzkuLjJmYTk2MzEgMTAwNjQ0Ci0tLSBhL21tL3Ztc3RhdC5jCisrKyBiL21tL3Ztc3RhdC5j CkBAIC03OTUsNiArNzk1LDkgQEAgY29uc3QgY2hhciAqIGNvbnN0IHZtc3RhdF90ZXh0W10gPSB7 CiAJIm5yX2Fub25fdHJhbnNwYXJlbnRfaHVnZXBhZ2VzIiwKIAkibnJfZnJlZV9jbWEiLAogCisj aWZkZWYgQ09ORklHX1VLU00KKyAgICAgICAibnJfdWtzbV96ZXJvX3BhZ2VzIiwKKyNlbmRpZgog CS8qIGVudW0gd3JpdGViYWNrX3N0YXRfaXRlbSBjb3VudGVycyAqLwogCSJucl9kaXJ0eV90aHJl c2hvbGQiLAogCSJucl9kaXJ0eV9iYWNrZ3JvdW5kX3RocmVzaG9sZCIsCi0tIAoyLjEuMgoK --001a1134cdee2fe6780506827203-- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/