From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A967DC3DA79 for ; Mon, 15 Jan 2024 16:27:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To: Subject:MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=ivIgS0vFwSdUKT8jgphTjtYh0FaSjeUltr4ID35yNVs=; b=r0/UsXL9CfFUHG Fubzu//qp44xQQ552wovtH0ul46LLQJiV7trKyrEO6xRBpJGHnfpeSzar+ZZGYnvoAW5fr+UabEV2 LkpzdWya7VWv7QrVUx8HepM4p3hnXKuqd1syBzXzTibepz4/Us6WSEP8RYfWouH3D9XAqxcGEk/Sx p4qbJS6pUROIUXhxON0qWjrzvxTUCgoBiPuyt72lTpNm7up8ACtJDm+JUUe9L5SoWGEJzEb5DrLwf Kjvu1h/BIM8LFNANE74YJoBZ0dM0dYXWIYtuhMGmlSyfjrwaI9Rs0EC7JBbU/ZwVPnpHvT1S19jEH h+5mA/SFetYwikuRxV/A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rPPo1-009f88-1X; Mon, 15 Jan 2024 16:27:21 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rPPnw-009f6s-2w for linux-arm-kernel@lists.infradead.org; Mon, 15 Jan 2024 16:27:20 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 7DF232F4; Mon, 15 Jan 2024 08:28:00 -0800 (PST) Received: from [10.57.76.47] (unknown [10.57.76.47]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 2C6C73F5A1; Mon, 15 Jan 2024 08:27:10 -0800 (PST) Message-ID: Date: Mon, 15 Jan 2024 16:27:08 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v4 14/16] arm64/mm: Wire up PTE_CONT for user mappings Content-Language: en-GB To: Alexandre Ghiti , Catalin Marinas , Will Deacon , Ard Biesheuvel , Marc Zyngier , Oliver Upton , James Morse , Suzuki K Poulose , Zenghui Yu , Andrey Ryabinin , Alexander Potapenko , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , Andrew Morton , Anshuman Khandual , Matthew Wilcox , Yu Zhao , Mark Rutland , David Hildenbrand , Kefeng Wang , John Hubbard , Zi Yan , Barry Song <21cnbao@gmail.com>, Alistair Popple , Yang Shi Cc: linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org References: <20231218105100.172635-1-ryan.roberts@arm.com> <20231218105100.172635-15-ryan.roberts@arm.com> <4c9f4507-94ce-4b1b-975e-74cc19faece9@ghiti.fr> From: Ryan Roberts In-Reply-To: <4c9f4507-94ce-4b1b-975e-74cc19faece9@ghiti.fr> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240115_082717_118115_9B5DC5BC X-CRM114-Status: GOOD ( 33.63 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMTUvMDEvMjAyNCAxNToxNCwgQWxleGFuZHJlIEdoaXRpIHdyb3RlOgo+IEhpIFJ5YW4sCj4g Cj4gT24gMTgvMTIvMjAyMyAxMTo1MCwgUnlhbiBSb2JlcnRzIHdyb3RlOgo+PiBXaXRoIHRoZSBw dGVwIEFQSSBzdWZmaWNpZW50bHkgcmVmYWN0b3JlZCwgd2UgY2FuIG5vdyBpbnRyb2R1Y2UgYSBu ZXcKPj4gImNvbnRwdGUiIEFQSSBsYXllciwgd2hpY2ggdHJhbnNwYXJlbnRseSBtYW5hZ2VzIHRo ZSBQVEVfQ09OVCBiaXQgZm9yCj4+IHVzZXIgbWFwcGluZ3MuIFdoZW5ldmVyIGl0IGRldGVjdHMg YSBzZXQgb2YgUFRFcyB0aGF0IG1lZXQgdGhlCj4+IHJlcXVpcmVtZW50cyBmb3IgYSBjb250aWd1 b3VzIHJhbmdlLCB0aGUgUFRFcyBhcmUgcmUtcGFpbnRlZCB3aXRoIHRoZQo+PiBQVEVfQ09OVCBi aXQuIFVzZSBvZiBjb250cHRlIG1hcHBpbmdzIGlzIGludGVuZGVkIHRvIGJlIHRyYW5zcGFyZW50 IHRvCj4+IHRoZSBjb3JlLW1tLCB3aGljaCBjb250aW51ZXMgdG8gaW50ZXJhY3Qgd2l0aCBpbmRp dmlkdWFsIHB0ZXMuCj4+Cj4+IFNpbmNlIGEgY29udHB0ZSBibG9jayBvbmx5IGhhcyBhIHNpbmds ZSBhY2Nlc3MgYW5kIGRpcnR5IGJpdCwgdGhlCj4+IHNlbWFudGljIGhlcmUgY2hhbmdlcyBzbGln aHRseTsgd2hlbiBnZXR0aW5nIGEgcHRlIChlLmcuIHB0ZXBfZ2V0KCkpCj4+IHRoYXQgaXMgcGFy dCBvZiBhIGNvbnRwdGUgbWFwcGluZywgdGhlIGFjY2VzcyBhbmQgZGlydHkgaW5mb3JtYXRpb24g YXJlCj4+IHB1bGxlZCBmcm9tIHRoZSBibG9jayAoc28gYWxsIHB0ZXMgaW4gdGhlIGJsb2NrIHJl dHVybiB0aGUgc2FtZQo+PiBhY2Nlc3MvZGlydHkgaW5mbykuIFdoZW4gY2hhbmdpbmcgdGhlIGFj Y2Vzcy9kaXJ0eSBpbmZvIG9uIGEgcHRlIChlLmcuCj4+IHB0ZXBfc2V0X2FjY2Vzc19mbGFncygp KSB0aGF0IGlzIHBhcnQgb2YgYSBjb250cHRlIG1hcHBpbmcsIHRoaXMgY2hhbmdlCj4+IHdpbGwg YWZmZWN0IHRoZSB3aG9sZSBjb250cHRlIGJsb2NrLiBUaGlzIGlzIHdvcmtzIGZpbmUgaW4gcHJh Y3RpY2UKPj4gc2luY2Ugd2UgZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBmb2xpbyBpcyBt YXBwZWQgYnkgYSBjb250cHRlCj4+IGJsb2NrLCBhbmQgdGhlIGNvcmUtbW0gdHJhY2tzIGFjY2Vz cy9kaXJ0eSBpbmZvcm1hdGlvbiBwZXIgZm9saW8uCj4+Cj4+IFRoaXMgaW5pdGlhbCBjaGFuZ2Ug cHJvdmlkZXMgYSBiYXNlbGluZSB0aGF0IGNhbiBiZSBvcHRpbWl6ZWQgaW4gZnV0dXJlCj4+IGNv bW1pdHMuIFRoYXQgc2FpZCwgZm9sZC91bmZvbGQgb3BlcmF0aW9ucyAod2hpY2ggaW1wbHkgdGxi Cj4+IGludmFsaWRhdGlvbikgYXJlIGF2b2lkZWQgd2hlcmUgcG9zc2libGUgd2l0aCBhIGZldyB0 cmlja3MgZm9yCj4+IGFjY2Vzcy9kaXJ0eSBiaXQgbWFuYWdlbWVudC4gV3JpdGUtcHJvdGVjdCBt b2RpZmljYXRpb25zIGZvciBjb250cHRlCj4+IG1hcHBpbmdzIGFyZSBjdXJyZW50bHkgbm9uLW9w dGltYWwsIGFuZCBpbmN1cmUgYSByZWdyZXNzaW9uIGluIGZvcmsoKQo+PiBwZXJmb3JtYW5jZS4g VGhpcyB3aWxsIGJlIGFkZHJlc3NlZCBpbiBmb2xsb3ctdXAgY2hhbmdlcy4KPj4KPj4gSW4gb3Jk ZXIgZm9yIHRoZSBwdWJsaWMgZnVuY3Rpb25zLCB3aGljaCB1c2VkIHRvIGJlIHB1cmUgaW5saW5l LCB0bwo+PiBjb250aW51ZSB0byBiZSBjYWxsYWJsZSBieSBtb2R1bGVzLCBleHBvcnQgYWxsIHRo ZSBjb250cHRlXyogc3ltYm9scwo+PiB0aGF0IGFyZSBub3cgY2FsbGVkIGJ5IHRob3NlIHB1Ymxp YyBpbmxpbmUgZnVuY3Rpb25zLgo+Pgo+PiBUaGUgZmVhdHVyZSBpcyBlbmFibGVkL2Rpc2FibGVk IHdpdGggdGhlIEFSTTY0X0NPTlRQVEUgS2NvbmZpZyBwYXJhbWV0ZXIKPj4gYXQgYnVpbGQgdGlt ZS4gSXQgZGVmYXVsdHMgdG8gZW5hYmxlZCBhcyBsb25nIGFzIGl0cyBkZXBlbmRlbmN5LAo+PiBU UkFOU1BBUkVOVF9IVUdFUEFHRSBpcyBhbHNvIGVuYWJsZWQuIFRoZSBjb3JlLW1tIGRlcGVuZHMg dXBvbgo+PiBUUkFOU1BBUkVOVF9IVUdFUEFHRSB0byBiZSBhYmxlIHRvIGFsbG9jYXRlIGxhcmdl IGZvbGlvcywgc28gaWYgaXRzIG5vdAo+PiBlbmFibGVkLCB0aGVuIHRoZXJlIGlzIG5vIGNoYW5j ZSBvZiBtZWV0aW5nIHRoZSBwaHlzaWNhbCBjb250aWd1aXR5Cj4+IHJlcXVpcmVtZW50IGZvciBj b250cHRlIG1hcHBpbmdzLgo+Pgo+PiBUZXN0ZWQtYnk6IEpvaG4gSHViYmFyZCA8amh1YmJhcmRA bnZpZGlhLmNvbT4KPj4gU2lnbmVkLW9mZi1ieTogUnlhbiBSb2JlcnRzIDxyeWFuLnJvYmVydHNA YXJtLmNvbT4KPj4gLS0tCj4+IMKgIGFyY2gvYXJtNjQvS2NvbmZpZ8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgfMKgIDEwICstCj4+IMKgIGFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJs ZS5oIHwgMTg0ICsrKysrKysrKysrKysrKwo+PiDCoCBhcmNoL2FybTY0L21tL01ha2VmaWxlwqDC oMKgwqDCoMKgwqDCoMKgwqAgfMKgwqAgMSArCj4+IMKgIGFyY2gvYXJtNjQvbW0vY29udHB0ZS5j wqDCoMKgwqDCoMKgwqDCoMKgIHwgMzg4ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysK Pj4gwqAgNCBmaWxlcyBjaGFuZ2VkLCA1ODIgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQo+ PiDCoCBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9tbS9jb250cHRlLmMKPj4KPj4gZGlm ZiAtLWdpdCBhL2FyY2gvYXJtNjQvS2NvbmZpZyBiL2FyY2gvYXJtNjQvS2NvbmZpZwo+PiBpbmRl eCA3YjA3MWEwMDQyNWQuLmRlNzZlNDg0ZmYzYSAxMDA2NDQKPj4gLS0tIGEvYXJjaC9hcm02NC9L Y29uZmlnCj4+ICsrKyBiL2FyY2gvYXJtNjQvS2NvbmZpZwo+PiBAQCAtMjIwOSw2ICsyMjA5LDE1 IEBAIGNvbmZpZyBVTldJTkRfUEFUQ0hfUEFDX0lOVE9fU0NTCj4+IMKgwqDCoMKgwqAgc2VsZWN0 IFVOV0lORF9UQUJMRVMKPj4gwqDCoMKgwqDCoCBzZWxlY3QgRFlOQU1JQ19TQ1MKPj4gwqAgK2Nv bmZpZyBBUk02NF9DT05UUFRFCj4+ICvCoMKgwqAgYm9vbCAiQ29udGlndW91cyBQVEUgbWFwcGlu Z3MgZm9yIHVzZXIgbWVtb3J5IiBpZiBFWFBFUlQKPj4gK8KgwqDCoCBkZXBlbmRzIG9uIFRSQU5T UEFSRU5UX0hVR0VQQUdFCj4+ICvCoMKgwqAgZGVmYXVsdCB5Cj4+ICvCoMKgwqAgaGVscAo+PiAr wqDCoMKgwqDCoCBXaGVuIGVuYWJsZWQsIHVzZXIgbWFwcGluZ3MgYXJlIGNvbmZpZ3VyZWQgdXNp bmcgdGhlIFBURSBjb250aWd1b3VzCj4+ICvCoMKgwqDCoMKgIGJpdCwgZm9yIGFueSBtYXBwaW5n cyB0aGF0IG1lZXQgdGhlIHNpemUgYW5kIGFsaWdubWVudCByZXF1aXJlbWVudHMuCj4+ICvCoMKg wqDCoMKgIFRoaXMgcmVkdWNlcyBUTEIgcHJlc3N1cmUgYW5kIGltcHJvdmVzIHBlcmZvcm1hbmNl Lgo+PiArCj4+IMKgIGVuZG1lbnUgIyAiS2VybmVsIEZlYXR1cmVzIgo+PiDCoCDCoCBtZW51ICJC b290IG9wdGlvbnMiCj4+IEBAIC0yMzE4LDQgKzIzMjcsMyBAQCBlbmRtZW51ICMgIkNQVSBQb3dl ciBNYW5hZ2VtZW50Igo+PiDCoCBzb3VyY2UgImRyaXZlcnMvYWNwaS9LY29uZmlnIgo+PiDCoCDC oCBzb3VyY2UgImFyY2gvYXJtNjQva3ZtL0tjb25maWciCj4+IC0KPj4gZGlmZiAtLWdpdCBhL2Fy Y2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9w Z3RhYmxlLmgKPj4gaW5kZXggNjkzMGMxNGYwNjJmLi5lNjQxMjA0NTIzMDEgMTAwNjQ0Cj4+IC0t LSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oCj4+ICsrKyBiL2FyY2gvYXJtNjQv aW5jbHVkZS9hc20vcGd0YWJsZS5oCj4+IEBAIC0xMzMsNiArMTMzLDEwIEBAIHN0YXRpYyBpbmxp bmUgcHRldmFsX3QgX19waHlzX3RvX3B0ZV92YWwocGh5c19hZGRyX3QgcGh5cykKPj4gwqDCoCAq Lwo+PiDCoCAjZGVmaW5lIHB0ZV92YWxpZF9ub3RfdXNlcihwdGUpIFwKPj4gwqDCoMKgwqDCoCAo KHB0ZV92YWwocHRlKSAmIChQVEVfVkFMSUQgfCBQVEVfVVNFUiB8IFBURV9VWE4pKSA9PSAoUFRF X1ZBTElEIHwKPj4gUFRFX1VYTikpCj4+ICsvKgo+PiArICogUmV0dXJucyB0cnVlIGlmIHRoZSBw dGUgaXMgdmFsaWQgYW5kIGhhcyB0aGUgY29udGlndW91cyBiaXQgc2V0Lgo+PiArICovCj4+ICsj ZGVmaW5lIHB0ZV92YWxpZF9jb250KHB0ZSnCoMKgwqAgKHB0ZV92YWxpZChwdGUpICYmIHB0ZV9j b250KHB0ZSkpCj4+IMKgIC8qCj4+IMKgwqAgKiBDb3VsZCB0aGUgcHRlIGJlIHByZXNlbnQgaW4g dGhlIFRMQj8gV2UgbXVzdCBjaGVjayBtbV90bGJfZmx1c2hfcGVuZGluZwo+PiDCoMKgICogc28g dGhhdCB3ZSBkb24ndCBlcnJvbmVvdXNseSByZXR1cm4gZmFsc2UgZm9yIHBhZ2VzIHRoYXQgaGF2 ZSBiZWVuCj4+IEBAIC0xMTE2LDYgKzExMjAsMTg0IEBAIGV4dGVybiB2b2lkIHB0ZXBfbW9kaWZ5 X3Byb3RfY29tbWl0KHN0cnVjdAo+PiB2bV9hcmVhX3N0cnVjdCAqdm1hLAo+PiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVf dCAqcHRlcCwKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHB0 ZV90IG9sZF9wdGUsIHB0ZV90IG5ld19wdGUpOwo+PiDCoCArI2lmZGVmIENPTkZJR19BUk02NF9D T05UUFRFCj4+ICsKPj4gKy8qCj4+ICsgKiBUaGUgY29udHB0ZSBBUElzIGFyZSB1c2VkIHRvIHRy YW5zcGFyZW50bHkgbWFuYWdlIHRoZSBjb250aWd1b3VzIGJpdCBpbiBwdGVzCj4+ICsgKiB3aGVy ZSBpdCBpcyBwb3NzaWJsZSBhbmQgbWFrZXMgc2Vuc2UgdG8gZG8gc28uIFRoZSBQVEVfQ09OVCBi aXQgaXMgY29uc2lkZXJlZAo+PiArICogYSBwcml2YXRlIGltcGxlbWVudGF0aW9uIGRldGFpbCBv ZiB0aGUgcHVibGljIHB0ZXAgQVBJIChzZWUgYmVsb3cpLgo+PiArICovCj4+ICtleHRlcm4gdm9p ZCBfX2NvbnRwdGVfdHJ5X2ZvbGQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcg YWRkciwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwdGVfdCAqcHRlcCwgcHRl X3QgcHRlKTsKPj4gK2V4dGVybiB2b2lkIF9fY29udHB0ZV90cnlfdW5mb2xkKHN0cnVjdCBtbV9z dHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSk7Cj4+ICtleHRlcm4gcHRlX3QgY29udHB0 ZV9wdGVwX2dldChwdGVfdCAqcHRlcCwgcHRlX3Qgb3JpZ19wdGUpOwo+PiArZXh0ZXJuIHB0ZV90 IGNvbnRwdGVfcHRlcF9nZXRfbG9ja2xlc3MocHRlX3QgKm9yaWdfcHRlcCk7Cj4+ICtleHRlcm4g dm9pZCBjb250cHRlX3NldF9wdGVzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25n IGFkZHIsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHRlX3QgKnB0ZXAsIHB0 ZV90IHB0ZSwgdW5zaWduZWQgaW50IG5yKTsKPj4gK2V4dGVybiBpbnQgY29udHB0ZV9wdGVwX3Rl c3RfYW5kX2NsZWFyX3lvdW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXAp Owo+PiArZXh0ZXJuIGludCBjb250cHRlX3B0ZXBfY2xlYXJfZmx1c2hfeW91bmcoc3RydWN0IHZt X2FyZWFfc3RydWN0ICp2bWEsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5z aWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCk7Cj4+ICtleHRlcm4gaW50IGNvbnRwdGVfcHRl cF9zZXRfYWNjZXNzX2ZsYWdzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXAs Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHRlX3QgZW50cnksIGludCBkaXJ0 eSk7Cj4+ICsKPj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBjb250cHRlX3RyeV9mb2xkKHN0cnVjdCBt bV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKQo+PiArewo+PiArwqDC oMKgIC8qCj4+ICvCoMKgwqDCoCAqIE9ubHkgYm90aGVyIHRyeWluZyBpZiBib3RoIHRoZSB2aXJ0 dWFsIGFuZCBwaHlzaWNhbCBhZGRyZXNzZXMgYXJlCj4+ICvCoMKgwqDCoCAqIGFsaWduZWQgYW5k IGNvcnJlc3BvbmQgdG8gdGhlIGxhc3QgZW50cnkgaW4gYSBjb250aWcgcmFuZ2UuIFRoZSBjb3Jl Cj4+ICvCoMKgwqDCoCAqIGNvZGUgbW9zdGx5IG1vZGlmaWVzIHJhbmdlcyBmcm9tIGxvdyB0byBo aWdoLCBzbyB0aGlzIGlzIHRoZSBsaWtlbHkKPj4gK8KgwqDCoMKgICogdGhlIGxhc3QgbW9kaWZp Y2F0aW9uIGluIHRoZSBjb250aWcgcmFuZ2UsIHNvIGEgZ29vZCB0aW1lIHRvIGZvbGQuCj4+ICvC oMKgwqDCoCAqIFdlIGNhbid0IGZvbGQgc3BlY2lhbCBtYXBwaW5ncywgYmVjYXVzZSB0aGVyZSBp cyBubyBhc3NvY2lhdGVkIGZvbGlvLgo+PiArwqDCoMKgwqAgKi8KPj4gKwo+PiArwqDCoMKgIGNv bnN0IHVuc2lnbmVkIGxvbmcgY29udG1hc2sgPSBDT05UX1BURVMgLSAxOwo+PiArwqDCoMKgIGJv b2wgdmFsaWduID0gKCgodW5zaWduZWQgbG9uZylwdGVwID4+IDMpICYgY29udG1hc2spID09IGNv bnRtYXNrOwo+PiArwqDCoMKgIGJvb2wgcGFsaWduID0gKHB0ZV9wZm4ocHRlKSAmIGNvbnRtYXNr KSA9PSBjb250bWFzazsKPj4gKwo+PiArwqDCoMKgIGlmICh2YWxpZ24gJiYgcGFsaWduICYmCj4+ ICvCoMKgwqDCoMKgwqDCoCBwdGVfdmFsaWQocHRlKSAmJiAhcHRlX2NvbnQocHRlKSAmJiAhcHRl X3NwZWNpYWwocHRlKSkKPj4gK8KgwqDCoMKgwqDCoMKgIF9fY29udHB0ZV90cnlfZm9sZChtbSwg YWRkciwgcHRlcCwgcHRlKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGlubGluZSB2b2lkIGNvbnRw dGVfdHJ5X3VuZm9sZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHRlX3QgKnB0ZXAsIHB0 ZV90IHB0ZSkKPj4gK3sKPj4gK8KgwqDCoCBpZiAocHRlX3ZhbGlkX2NvbnQocHRlKSkKPj4gK8Kg wqDCoMKgwqDCoMKgIF9fY29udHB0ZV90cnlfdW5mb2xkKG1tLCBhZGRyLCBwdGVwLCBwdGUpOwo+ PiArfQo+PiArCj4+ICsvKgo+PiArICogVGhlIGJlbG93IGZ1bmN0aW9ucyBjb25zdGl0dXRlIHRo ZSBwdWJsaWMgQVBJIHRoYXQgYXJtNjQgcHJlc2VudHMgdG8gdGhlCj4+ICsgKiBjb3JlLW1tIHRv IG1hbmlwdWxhdGUgUFRFIGVudHJpZXMgd2l0aGluIHRoZWlyIHBhZ2UgdGFibGVzIChvciBhdCBs ZWFzdCB0aGlzCj4+ICsgKiBpcyB0aGUgc3Vic2V0IG9mIHRoZSBBUEkgdGhhdCBhcm02NCBuZWVk cyB0byBpbXBsZW1lbnQpLiBUaGVzZSBwdWJsaWMKPj4gKyAqIHZlcnNpb25zIHdpbGwgYXV0b21h dGljYWxseSBhbmQgdHJhbnNwYXJlbnRseSBhcHBseSB0aGUgY29udGlndW91cyBiaXQgd2hlcmUK Pj4gKyAqIGl0IG1ha2VzIHNlbnNlIHRvIGRvIHNvLiBUaGVyZWZvcmUgYW55IHVzZXJzIHRoYXQg YXJlIGNvbnRpZy1hd2FyZSAoZS5nLgo+PiArICogaHVnZXRsYiwga2VybmVsIG1hcHBlcikgc2hv dWxkIE5PVCB1c2UgdGhlc2UgQVBJcywgYnV0IGluc3RlYWQgdXNlIHRoZQo+PiArICogcHJpdmF0 ZSB2ZXJzaW9ucywgd2hpY2ggYXJlIHByZWZpeGVkIHdpdGggZG91YmxlIHVuZGVyc2NvcmUuIEFs bCBvZiB0aGVzZQo+PiArICogQVBJcyBleGNlcHQgZm9yIHB0ZXBfZ2V0X2xvY2tsZXNzKCkgYXJl IGV4cGVjdGVkIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBQVEwKPj4gKyAqIGhlbGQuCj4+ICsgKi8K Pj4gKwo+PiArI2RlZmluZSBwdGVwX2dldCBwdGVwX2dldAo+PiArc3RhdGljIGlubGluZSBwdGVf dCBwdGVwX2dldChwdGVfdCAqcHRlcCkKPj4gK3sKPj4gK8KgwqDCoCBwdGVfdCBwdGUgPSBfX3B0 ZXBfZ2V0KHB0ZXApOwo+PiArCj4+ICvCoMKgwqAgaWYgKCFwdGVfdmFsaWRfY29udChwdGUpKQo+ PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHB0ZTsKPj4gKwo+PiArwqDCoMKgIHJldHVybiBjb250 cHRlX3B0ZXBfZ2V0KHB0ZXAsIHB0ZSk7Cj4+ICt9Cj4+ICsKPj4gKyNkZWZpbmUgcHRlcF9nZXRf bG9ja2xlc3MgcHRlcF9nZXRfbG9ja2xlc3MKPj4gK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlcF9n ZXRfbG9ja2xlc3MocHRlX3QgKnB0ZXApCj4+ICt7Cj4+ICvCoMKgwqAgcHRlX3QgcHRlID0gX19w dGVwX2dldChwdGVwKTsKPj4gKwo+PiArwqDCoMKgIGlmICghcHRlX3ZhbGlkX2NvbnQocHRlKSkK Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBwdGU7Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gY29u dHB0ZV9wdGVwX2dldF9sb2NrbGVzcyhwdGVwKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGlubGlu ZSB2b2lkIHNldF9wdGUocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSkKPj4gK3sKPj4gK8KgwqDCoCAv Kgo+PiArwqDCoMKgwqAgKiBXZSBkb24ndCBoYXZlIHRoZSBtbSBvciB2YWRkciBzbyBjYW5ub3Qg dW5mb2xkIG9yIGZvbGQgY29udGlnIGVudHJpZXMKPj4gK8KgwqDCoMKgICogKHNpbmNlIGl0IHJl cXVpcmVzIHRsYiBtYWludGVuYW5jZSkuIHNldF9wdGUoKSBpcyBub3QgdXNlZCBpbiBjb3JlCj4+ ICvCoMKgwqDCoCAqIGNvZGUsIHNvIHRoaXMgc2hvdWxkIG5ldmVyIGV2ZW4gYmUgY2FsbGVkLiBS ZWdhcmRsZXNzIGRvIG91ciBiZXN0IHRvCj4+ICvCoMKgwqDCoCAqIHNlcnZpY2UgYW55IGNhbGwg YW5kIGVtaXQgYSB3YXJuaW5nIGlmIHRoZXJlIGlzIGFueSBhdHRlbXB0IHRvIHNldCBhCj4+ICvC oMKgwqDCoCAqIHB0ZSBvbiB0b3Agb2YgYW4gZXhpc3RpbmcgY29udGlnIHJhbmdlLgo+PiArwqDC oMKgwqAgKi8KPj4gK8KgwqDCoCBwdGVfdCBvcmlnX3B0ZSA9IF9fcHRlcF9nZXQocHRlcCk7Cj4+ ICsKPj4gK8KgwqDCoCBXQVJOX09OX09OQ0UocHRlX3ZhbGlkX2NvbnQob3JpZ19wdGUpKTsKPj4g K8KgwqDCoCBfX3NldF9wdGUocHRlcCwgcHRlX21rbm9uY29udChwdGUpKTsKPj4gK30KPj4gKwo+ PiArI2RlZmluZSBzZXRfcHRlcyBzZXRfcHRlcwo+PiArc3RhdGljIGlubGluZSB2b2lkIHNldF9w dGVzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSwgdW5zaWduZWQg aW50IG5yKQo+PiArewo+PiArwqDCoMKgIHB0ZSA9IHB0ZV9ta25vbmNvbnQocHRlKTsKPj4gKwo+ PiArwqDCoMKgIGlmIChuciA9PSAxKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBjb250cHRlX3RyeV91 bmZvbGQobW0sIGFkZHIsIHB0ZXAsIF9fcHRlcF9nZXQocHRlcCkpOwo+PiArwqDCoMKgwqDCoMKg wqAgX19zZXRfcHRlcyhtbSwgYWRkciwgcHRlcCwgcHRlLCAxKTsKPj4gK8KgwqDCoMKgwqDCoMKg IGNvbnRwdGVfdHJ5X2ZvbGQobW0sIGFkZHIsIHB0ZXAsIHB0ZSk7Cj4+ICvCoMKgwqAgfSBlbHNl Cj4+ICvCoMKgwqDCoMKgwqDCoCBjb250cHRlX3NldF9wdGVzKG1tLCBhZGRyLCBwdGVwLCBwdGUs IG5yKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGlubGluZSB2b2lkIHB0ZV9jbGVhcihzdHJ1Y3Qg bW1fc3RydWN0ICptbSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25l ZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQo+PiArewo+PiArwqDCoMKgIGNvbnRwdGVfdHJ5X3Vu Zm9sZChtbSwgYWRkciwgcHRlcCwgX19wdGVwX2dldChwdGVwKSk7Cj4+ICvCoMKgwqAgX19wdGVf Y2xlYXIobW0sIGFkZHIsIHB0ZXApOwo+PiArfQo+PiArCj4+ICsjZGVmaW5lIF9fSEFWRV9BUkNI X1BURVBfR0VUX0FORF9DTEVBUgo+PiArc3RhdGljIGlubGluZSBwdGVfdCBwdGVwX2dldF9hbmRf Y2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKPj4gK3sKPj4gK8KgwqDCoCBj b250cHRlX3RyeV91bmZvbGQobW0sIGFkZHIsIHB0ZXAsIF9fcHRlcF9nZXQocHRlcCkpOwo+PiAr wqDCoMKgIHJldHVybiBfX3B0ZXBfZ2V0X2FuZF9jbGVhcihtbSwgYWRkciwgcHRlcCk7Cj4+ICt9 Cj4+ICsKPj4gKyNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwo+ PiArc3RhdGljIGlubGluZSBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyhzdHJ1Y3Qgdm1f YXJlYV9zdHJ1Y3QgKnZtYSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNp Z25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQo+PiArewo+PiArwqDCoMKgIHB0ZV90IG9yaWdf cHRlID0gX19wdGVwX2dldChwdGVwKTsKPj4gKwo+PiArwqDCoMKgIGlmICghcHRlX3ZhbGlkX2Nv bnQob3JpZ19wdGUpKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIF9fcHRlcF90ZXN0X2FuZF9j bGVhcl95b3VuZyh2bWEsIGFkZHIsIHB0ZXApOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIGNvbnRw dGVfcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyh2bWEsIGFkZHIsIHB0ZXApOwo+PiArfQo+PiAr Cj4+ICsjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfQ0xFQVJfWU9VTkdfRkxVU0gKPj4gK3N0YXRp YyBpbmxpbmUgaW50IHB0ZXBfY2xlYXJfZmx1c2hfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0 ICp2bWEsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBh ZGRyLCBwdGVfdCAqcHRlcCkKPj4gK3sKPj4gK8KgwqDCoCBwdGVfdCBvcmlnX3B0ZSA9IF9fcHRl cF9nZXQocHRlcCk7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIXB0ZV92YWxpZF9jb250KG9yaWdfcHRl KSkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBfX3B0ZXBfY2xlYXJfZmx1c2hfeW91bmcodm1h LCBhZGRyLCBwdGVwKTsKPj4gKwo+PiArwqDCoMKgIHJldHVybiBjb250cHRlX3B0ZXBfY2xlYXJf Zmx1c2hfeW91bmcodm1hLCBhZGRyLCBwdGVwKTsKPj4gK30KPj4gKwo+PiArI2RlZmluZSBfX0hB VkVfQVJDSF9QVEVQX1NFVF9XUlBST1RFQ1QKPj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVwX3Nl dF93cnByb3RlY3Qoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKPj4gK3sKPj4gK8Kg wqDCoCBjb250cHRlX3RyeV91bmZvbGQobW0sIGFkZHIsIHB0ZXAsIF9fcHRlcF9nZXQocHRlcCkp Owo+PiArwqDCoMKgIF9fcHRlcF9zZXRfd3Jwcm90ZWN0KG1tLCBhZGRyLCBwdGVwKTsKPj4gK8Kg wqDCoCBjb250cHRlX3RyeV9mb2xkKG1tLCBhZGRyLCBwdGVwLCBfX3B0ZXBfZ2V0KHB0ZXApKTsK Pj4gK30KPj4gKwo+PiArI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1NFVF9BQ0NFU1NfRkxBR1MK Pj4gK3N0YXRpYyBpbmxpbmUgaW50IHB0ZXBfc2V0X2FjY2Vzc19mbGFncyhzdHJ1Y3Qgdm1fYXJl YV9zdHJ1Y3QgKnZtYSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25l ZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHB0ZV90IGVudHJ5LCBpbnQgZGlydHkpCj4+ICt7Cj4+ICvCoMKgwqAgcHRlX3Qgb3JpZ19w dGUgPSBfX3B0ZXBfZ2V0KHB0ZXApOwo+PiArCj4+ICvCoMKgwqAgZW50cnkgPSBwdGVfbWtub25j b250KGVudHJ5KTsKPj4gKwo+PiArwqDCoMKgIGlmICghcHRlX3ZhbGlkX2NvbnQob3JpZ19wdGUp KQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIF9fcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYSwg YWRkciwgcHRlcCwgZW50cnksIGRpcnR5KTsKPj4gKwo+PiArwqDCoMKgIHJldHVybiBjb250cHRl X3B0ZXBfc2V0X2FjY2Vzc19mbGFncyh2bWEsIGFkZHIsIHB0ZXAsIGVudHJ5LCBkaXJ0eSk7Cj4+ ICt9Cj4+ICsKPj4gKyNlbHNlIC8qIENPTkZJR19BUk02NF9DT05UUFRFICovCj4+ICsKPj4gwqAg I2RlZmluZSBwdGVwX2dldMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBfX3B0ZXBfZ2V0 Cj4+IMKgICNkZWZpbmUgc2V0X3B0ZcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIF9fc2V0X3B0ZQo+PiDCoCAjZGVmaW5lIHNldF9wdGVzwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIF9fc2V0X3B0ZXMKPj4gQEAgLTExMzEsNiArMTMxMyw4IEBAIGV4dGVybiB2b2lk IHB0ZXBfbW9kaWZ5X3Byb3RfY29tbWl0KHN0cnVjdAo+PiB2bV9hcmVhX3N0cnVjdCAqdm1hLAo+ PiDCoCAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX0FDQ0VTU19GTEFHUwo+PiDCoCAjZGVm aW5lIHB0ZXBfc2V0X2FjY2Vzc19mbGFnc8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgX19wdGVwX3Nl dF9hY2Nlc3NfZmxhZ3MKPj4gwqAgKyNlbmRpZiAvKiBDT05GSUdfQVJNNjRfQ09OVFBURSAqLwo+ PiArCj4+IMKgICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCj4+IMKgIMKgICNlbmRpZiAvKiBf X0FTTV9QR1RBQkxFX0ggKi8KPj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vTWFrZWZpbGUg Yi9hcmNoL2FybTY0L21tL01ha2VmaWxlCj4+IGluZGV4IGRiZDFiYzk1OTY3ZC4uNjA0NTQyNTY5 NDViIDEwMDY0NAo+PiAtLS0gYS9hcmNoL2FybTY0L21tL01ha2VmaWxlCj4+ICsrKyBiL2FyY2gv YXJtNjQvbW0vTWFrZWZpbGUKPj4gQEAgLTMsNiArMyw3IEBAIG9iai15wqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIDo9IGRtYS1tYXBwaW5nLm8gZXh0YWJsZS5vIGZhdWx0Lm8gaW5pdC5v IFwKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjYWNoZS5vIGNv cHlwYWdlLm8gZmx1c2gubyBcCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgaW9yZW1hcC5vIG1tYXAubyBwZ2QubyBtbXUubyBcCj4+IMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGV4dC5vIHByb2MubyBwYWdlYXR0ci5vIGZpeG1h cC5vCj4+ICtvYmotJChDT05GSUdfQVJNNjRfQ09OVFBURSnCoMKgwqAgKz0gY29udHB0ZS5vCj4+ IMKgIG9iai0kKENPTkZJR19IVUdFVExCX1BBR0UpwqDCoMKgICs9IGh1Z2V0bGJwYWdlLm8KPj4g wqAgb2JqLSQoQ09ORklHX1BURFVNUF9DT1JFKcKgwqDCoCArPSBwdGR1bXAubwo+PiDCoCBvYmot JChDT05GSUdfUFREVU1QX0RFQlVHRlMpwqDCoMKgICs9IHB0ZHVtcF9kZWJ1Z2ZzLm8KPj4gZGlm ZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vY29udHB0ZS5jIGIvYXJjaC9hcm02NC9tbS9jb250cHRl LmMKPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4gaW5kZXggMDAwMDAwMDAwMDAwLi42OWMzNjc0 OWRkOTgKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysgYi9hcmNoL2FybTY0L21tL2NvbnRwdGUuYwo+ PiBAQCAtMCwwICsxLDM4OCBAQAo+PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0y LjAtb25seQo+PiArLyoKPj4gKyAqIENvcHlyaWdodCAoQykgMjAyMyBBUk0gTHRkLgo+PiArICov Cj4+ICsKPj4gKyNpbmNsdWRlIDxsaW51eC9tbS5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L2V4cG9y dC5oPgo+PiArI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgo+PiArCj4+ICtzdGF0aWMgaW5saW5l IGJvb2wgbW1faXNfdXNlcihzdHJ1Y3QgbW1fc3RydWN0ICptbSkKPj4gK3sKPj4gK8KgwqDCoCAv Kgo+PiArwqDCoMKgwqAgKiBEb24ndCBhdHRlbXB0IHRvIGFwcGx5IHRoZSBjb250aWcgYml0IHRv IGtlcm5lbCBtYXBwaW5ncywgYmVjYXVzZQo+PiArwqDCoMKgwqAgKiBkeW5hbWljYWxseSBhZGRp bmcvcmVtb3ZpbmcgdGhlIGNvbnRpZyBiaXQgY2FuIGNhdXNlIHBhZ2UgZmF1bHRzLgo+PiArwqDC oMKgwqAgKiBUaGVzZSByYWNpbmcgZmF1bHRzIGFyZSBvayBmb3IgdXNlciBzcGFjZSwgc2luY2Ug dGhleSBnZXQgc2VyaWFsaXplZAo+PiArwqDCoMKgwqAgKiBvbiB0aGUgUFRMLiBCdXQga2VybmVs IG1hcHBpbmdzIGNhbid0IHRvbGVyYXRlIGZhdWx0cy4KPj4gK8KgwqDCoMKgICovCj4+ICvCoMKg wqAgcmV0dXJuIG1tICE9ICZpbml0X21tOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW5saW5lIHB0 ZV90ICpjb250cHRlX2FsaWduX2Rvd24ocHRlX3QgKnB0ZXApCj4+ICt7Cj4+ICvCoMKgwqAgcmV0 dXJuIChwdGVfdCAqKShBTElHTl9ET1dOKCh1bnNpZ25lZCBsb25nKXB0ZXAgPj4gMywgQ09OVF9Q VEVTKSA8PCAzKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgcHRlcF9jbGVhcl9mbHVzaF9y YW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHB0ZV90ICpwdGVwLCBpbnQgbnIpCj4+ICt7Cj4+ICvC oMKgwqAgc3RydWN0IHZtX2FyZWFfc3RydWN0IHZtYSA9IFRMQl9GTFVTSF9WTUEobW0sIDApOwo+ PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciA9IGFkZHI7Cj4+ICvCoMKgwqAgaW50 IGk7Cj4+ICsKPj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKywgcHRlcCsrLCBhZGRy ICs9IFBBR0VfU0laRSkKPj4gK8KgwqDCoMKgwqDCoMKgIF9fcHRlX2NsZWFyKG1tLCBhZGRyLCBw dGVwKTsKPj4gKwo+PiArwqDCoMKgIF9fZmx1c2hfdGxiX3JhbmdlKCZ2bWEsIHN0YXJ0X2FkZHIs IGFkZHIsIFBBR0VfU0laRSwgdHJ1ZSwgMyk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBib29sIHB0 ZXBfYW55X3ZhbGlkKHB0ZV90ICpwdGVwLCBpbnQgbnIpCj4+ICt7Cj4+ICvCoMKgwqAgaW50IGk7 Cj4+ICsKPj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKywgcHRlcCsrKSB7Cj4+ICvC oMKgwqDCoMKgwqDCoCBpZiAocHRlX3ZhbGlkKF9fcHRlcF9nZXQocHRlcCkpKQo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gdHJ1ZTsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDC oCByZXR1cm4gZmFsc2U7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIGNvbnRwdGVfY29udmVy dChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUpCj4+ICt7Cj4+ICvC oMKgwqAgc3RydWN0IHZtX2FyZWFfc3RydWN0IHZtYSA9IFRMQl9GTFVTSF9WTUEobW0sIDApOwo+ PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcjsKPj4gK8KgwqDCoCBwdGVfdCAqc3Rh cnRfcHRlcDsKPj4gK8KgwqDCoCBpbnQgaTsKPj4gKwo+PiArwqDCoMKgIHN0YXJ0X3B0ZXAgPSBw dGVwID0gY29udHB0ZV9hbGlnbl9kb3duKHB0ZXApOwo+PiArwqDCoMKgIHN0YXJ0X2FkZHIgPSBh ZGRyID0gQUxJR05fRE9XTihhZGRyLCBDT05UX1BURV9TSVpFKTsKPj4gK8KgwqDCoCBwdGUgPSBw Zm5fcHRlKEFMSUdOX0RPV04ocHRlX3BmbihwdGUpLCBDT05UX1BURVMpLCBwdGVfcGdwcm90KHB0 ZSkpOwo+PiArCj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IENPTlRfUFRFUzsgaSsrLCBwdGVw KyssIGFkZHIgKz0gUEFHRV9TSVpFKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBwdGVfdCBwdGVudCA9 IF9fcHRlcF9nZXRfYW5kX2NsZWFyKG1tLCBhZGRyLCBwdGVwKTsKPj4gKwo+PiArwqDCoMKgwqDC oMKgwqAgaWYgKHB0ZV9kaXJ0eShwdGVudCkpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHB0 ZSA9IHB0ZV9ta2RpcnR5KHB0ZSk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChwdGVfeW91 bmcocHRlbnQpKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwdGUgPSBwdGVfbWt5b3VuZyhw dGUpOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIF9fZmx1c2hfdGxiX3JhbmdlKCZ2bWEs IHN0YXJ0X2FkZHIsIGFkZHIsIFBBR0VfU0laRSwgdHJ1ZSwgMyk7Cj4+ICsKPj4gK8KgwqDCoCBf X3NldF9wdGVzKG1tLCBzdGFydF9hZGRyLCBzdGFydF9wdGVwLCBwdGUsIENPTlRfUFRFUyk7Cj4+ ICt9Cj4+ICsKPj4gK3ZvaWQgX19jb250cHRlX3RyeV9mb2xkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1t LCB1bnNpZ25lZCBsb25nIGFkZHIsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHB0ZV90ICpw dGVwLCBwdGVfdCBwdGUpCj4+ICt7Cj4+ICvCoMKgwqAgLyoKPj4gK8KgwqDCoMKgICogV2UgaGF2 ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGUgdmlydHVhbCBhbmQgcHlzaWNhbCBhZGRyZXNzZXMg YXJlCj4+ICvCoMKgwqDCoCAqIGNvcnJlY3RseSBhbGlnbmVkIGZvciBhIGNvbnRwdGUgbWFwcGlu ZyBpbiBjb250cHRlX3RyeV9mb2xkKCkgc28gdGhlCj4+ICvCoMKgwqDCoCAqIHJlbWFpbmluZyBj aGVja3MgYXJlIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250cHRlIHJhbmdlIGlzIGZ1bGx5Cj4+ICvC oMKgwqDCoCAqIGNvdmVyZWQgYnkgYSBzaW5nbGUgZm9saW8sIGFuZCBlbnN1cmUgdGhhdCBhbGwg dGhlIHB0ZXMgYXJlIHZhbGlkCj4+ICvCoMKgwqDCoCAqIHdpdGggY29udGlndW91cyBQRk5zIGFu ZCBtYXRjaGluZyBwcm90cy4gV2UgaWdub3JlIHRoZSBzdGF0ZSBvZiB0aGUKPj4gK8KgwqDCoMKg ICogYWNjZXNzIGFuZCBkaXJ0eSBiaXRzIGZvciB0aGUgcHVycG9zZSBvZiBkZWNpZGluZyBpZiBp dHMgYSBjb250aWd1b3VzCj4+ICvCoMKgwqDCoCAqIHJhbmdlOyB0aGUgZm9sZGluZyBwcm9jZXNz IHdpbGwgZ2VuZXJhdGUgYSBzaW5nbGUgY29udHB0ZSBlbnRyeSB3aGljaAo+PiArwqDCoMKgwqAg KiBoYXMgYSBzaW5nbGUgYWNjZXNzIGFuZCBkaXJ0eSBiaXQuIFRob3NlIDIgYml0cyBhcmUgdGhl IGxvZ2ljYWwgT1Igb2YKPj4gK8KgwqDCoMKgICogdGhlaXIgcmVzcGVjdGl2ZSBiaXRzIGluIHRo ZSBjb25zdGl0dWVudCBwdGUgZW50cmllcy4gSW4gb3JkZXIgdG8KPj4gK8KgwqDCoMKgICogZW5z dXJlIHRoZSBjb250cHRlIHJhbmdlIGlzIGNvdmVyZWQgYnkgYSBzaW5nbGUgZm9saW8sIHdlIG11 c3QKPj4gK8KgwqDCoMKgICogcmVjb3ZlciB0aGUgZm9saW8gZnJvbSB0aGUgcGZuLCBidXQgc3Bl Y2lhbCBtYXBwaW5ncyBkb24ndCBoYXZlIGEKPj4gK8KgwqDCoMKgICogZm9saW8gYmFja2luZyB0 aGVtLiBGb3J0dW5hdGVseSBjb250cHRlX3RyeV9mb2xkKCkgYWxyZWFkeSBjaGVja2VkCj4+ICvC oMKgwqDCoCAqIHRoYXQgdGhlIHB0ZSBpcyBub3Qgc3BlY2lhbCAtIHdlIG5ldmVyIHRyeSB0byBm b2xkIHNwZWNpYWwgbWFwcGluZ3MuCj4+ICvCoMKgwqDCoCAqIE5vdGUgd2UgY2FuJ3QgdXNlIHZt X25vcm1hbF9wYWdlKCkgZm9yIHRoaXMgc2luY2Ugd2UgZG9uJ3QgaGF2ZSB0aGUKPj4gK8KgwqDC oMKgICogdm1hLgo+PiArwqDCoMKgwqAgKi8KPj4gKwo+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcg Zm9saW9fc2FkZHI7Cj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyBmb2xpb19lYWRkcjsKPj4gK8Kg wqDCoCB1bnNpZ25lZCBsb25nIGNvbnRfc2FkZHI7Cj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyBj b250X2VhZGRyOwo+PiArwqDCoMKgIHN0cnVjdCBmb2xpbyAqZm9saW87Cj4+ICvCoMKgwqAgc3Ry dWN0IHBhZ2UgKnBhZ2U7Cj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyBwZm47Cj4+ICvCoMKgwqAg cHRlX3QgKm9yaWdfcHRlcDsKPj4gK8KgwqDCoCBwZ3Byb3RfdCBwcm90Owo+PiArwqDCoMKgIHB0 ZV90IHN1YnB0ZTsKPj4gK8KgwqDCoCBpbnQgaTsKPj4gKwo+PiArwqDCoMKgIGlmICghbW1faXNf dXNlcihtbSkpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+ICsKPj4gK8KgwqDCoCBwYWdl ID0gcHRlX3BhZ2UocHRlKTsKPj4gK8KgwqDCoCBmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7Cj4+ ICvCoMKgwqAgZm9saW9fc2FkZHIgPSBhZGRyIC0gKHBhZ2UgLSAmZm9saW8tPnBhZ2UpICogUEFH RV9TSVpFOwo+PiArwqDCoMKgIGZvbGlvX2VhZGRyID0gZm9saW9fc2FkZHIgKyBmb2xpb19ucl9w YWdlcyhmb2xpbykgKiBQQUdFX1NJWkU7Cj4+ICvCoMKgwqAgY29udF9zYWRkciA9IEFMSUdOX0RP V04oYWRkciwgQ09OVF9QVEVfU0laRSk7Cj4+ICvCoMKgwqAgY29udF9lYWRkciA9IGNvbnRfc2Fk ZHIgKyBDT05UX1BURV9TSVpFOwo+PiArCj4+ICvCoMKgwqAgaWYgKGZvbGlvX3NhZGRyID4gY29u dF9zYWRkciB8fCBmb2xpb19lYWRkciA8IGNvbnRfZWFkZHIpCj4+ICvCoMKgwqDCoMKgwqDCoCBy ZXR1cm47Cj4+ICsKPj4gK8KgwqDCoCBwZm4gPSBwdGVfcGZuKHB0ZSkgLSAoKGFkZHIgLSBjb250 X3NhZGRyKSA+PiBQQUdFX1NISUZUKTsKPj4gK8KgwqDCoCBwcm90ID0gcHRlX3BncHJvdChwdGVf bWtvbGQocHRlX21rY2xlYW4ocHRlKSkpOwo+PiArwqDCoMKgIG9yaWdfcHRlcCA9IHB0ZXA7Cj4+ ICvCoMKgwqAgcHRlcCA9IGNvbnRwdGVfYWxpZ25fZG93bihwdGVwKTsKPj4gKwo+PiArwqDCoMKg IGZvciAoaSA9IDA7IGkgPCBDT05UX1BURVM7IGkrKywgcHRlcCsrLCBwZm4rKykgewo+PiArwqDC oMKgwqDCoMKgwqAgc3VicHRlID0gX19wdGVwX2dldChwdGVwKTsKPj4gK8KgwqDCoMKgwqDCoMKg IHN1YnB0ZSA9IHB0ZV9ta29sZChwdGVfbWtjbGVhbihzdWJwdGUpKTsKPj4gKwo+PiArwqDCoMKg wqDCoMKgwqAgaWYgKCFwdGVfdmFsaWQoc3VicHRlKSB8fAo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBwdGVfcGZuKHN1YnB0ZSkgIT0gcGZuIHx8Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHBncHJvdF92YWwocHRlX3BncHJvdChzdWJwdGUpKSAhPSBwZ3Byb3RfdmFsKHByb3QpKQo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKg wqAgcHRlID0gcHRlX21rY29udChwdGUpOwo+PiArwqDCoMKgIGNvbnRwdGVfY29udmVydChtbSwg YWRkciwgb3JpZ19wdGVwLCBwdGUpOwo+PiArfQo+PiArRVhQT1JUX1NZTUJPTChfX2NvbnRwdGVf dHJ5X2ZvbGQpOwo+PiArCj4+ICt2b2lkIF9fY29udHB0ZV90cnlfdW5mb2xkKHN0cnVjdCBtbV9z dHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUpCj4+ICt7Cj4+ICvCoMKgwqAgLyoKPj4gK8KgwqDCoMKg ICogV2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGUgcHRlcyBhcmUgY29udGlndW91cyBp bgo+PiArwqDCoMKgwqAgKiBjb250cHRlX3RyeV91bmZvbGQoKSwgc28ganVzdCBjaGVjayB0aGF0 IHRoZSBtbSBpcyB1c2VyIHNwYWNlLgo+PiArwqDCoMKgwqAgKi8KPj4gKwo+PiArwqDCoMKgIGlm ICghbW1faXNfdXNlcihtbSkpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+ICsKPj4gK8Kg wqDCoCBwdGUgPSBwdGVfbWtub25jb250KHB0ZSk7Cj4+ICvCoMKgwqAgY29udHB0ZV9jb252ZXJ0 KG1tLCBhZGRyLCBwdGVwLCBwdGUpOwo+PiArfQo+PiArRVhQT1JUX1NZTUJPTChfX2NvbnRwdGVf dHJ5X3VuZm9sZCk7Cj4+ICsKPj4gK3B0ZV90IGNvbnRwdGVfcHRlcF9nZXQocHRlX3QgKnB0ZXAs IHB0ZV90IG9yaWdfcHRlKQo+PiArewo+PiArwqDCoMKgIC8qCj4+ICvCoMKgwqDCoCAqIEdhdGhl ciBhY2Nlc3MvZGlydHkgYml0cywgd2hpY2ggbWF5IGJlIHBvcHVsYXRlZCBpbiBhbnkgb2YgdGhl IHB0ZXMKPj4gK8KgwqDCoMKgICogb2YgdGhlIGNvbnRpZyByYW5nZS4gV2UgYXJlIGd1YXJyYW50 ZWVkIHRvIGJlIGhvbGRpbmcgdGhlIFBUTCwgc28gYW55Cj4+ICvCoMKgwqDCoCAqIGNvbnRpZ3Vv dXMgcmFuZ2UgY2Fubm90IGJlIHVuZm9sZGVkIG9yIG90aGVyd2lzZSBtb2RpZmllZCB1bmRlciBv dXIKPj4gK8KgwqDCoMKgICogZmVldC4KPj4gK8KgwqDCoMKgICovCj4+ICsKPj4gK8KgwqDCoCBw dGVfdCBwdGU7Cj4+ICvCoMKgwqAgaW50IGk7Cj4+ICsKPj4gK8KgwqDCoCBwdGVwID0gY29udHB0 ZV9hbGlnbl9kb3duKHB0ZXApOwo+PiArCj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IENPTlRf UFRFUzsgaSsrLCBwdGVwKyspIHsKPj4gK8KgwqDCoMKgwqDCoMKgIHB0ZSA9IF9fcHRlcF9nZXQo cHRlcCk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChwdGVfZGlydHkocHRlKSkKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqAgb3JpZ19wdGUgPSBwdGVfbWtkaXJ0eShvcmlnX3B0ZSk7Cj4+ ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChwdGVfeW91bmcocHRlKSkKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgb3JpZ19wdGUgPSBwdGVfbWt5b3VuZyhvcmlnX3B0ZSk7Cj4+ICvCoMKgwqAg fQo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIG9yaWdfcHRlOwo+PiArfQo+PiArRVhQT1JUX1NZTUJP TChjb250cHRlX3B0ZXBfZ2V0KTsKPj4gKwo+PiArcHRlX3QgY29udHB0ZV9wdGVwX2dldF9sb2Nr bGVzcyhwdGVfdCAqb3JpZ19wdGVwKQo+PiArewo+PiArwqDCoMKgIC8qCj4+ICvCoMKgwqDCoCAq IEdhdGhlciBhY2Nlc3MvZGlydHkgYml0cywgd2hpY2ggbWF5IGJlIHBvcHVsYXRlZCBpbiBhbnkg b2YgdGhlIHB0ZXMKPj4gK8KgwqDCoMKgICogb2YgdGhlIGNvbnRpZyByYW5nZS4gV2UgbWF5IG5v dCBiZSBob2xkaW5nIHRoZSBQVEwsIHNvIGFueSBjb250aWd1b3VzCj4+ICvCoMKgwqDCoCAqIHJh bmdlIG1heSBiZSB1bmZvbGRlZC9tb2RpZmllZC9yZWZvbGRlZCB1bmRlciBvdXIgZmVldC4gVGhl cmVmb3JlIHdlCj4+ICvCoMKgwqDCoCAqIGVuc3VyZSB3ZSByZWFkIGEgX2NvbnNpc3RlbnRfIGNv bnRwdGUgcmFuZ2UgYnkgY2hlY2tpbmcgdGhhdCBhbGwgcHRlcwo+PiArwqDCoMKgwqAgKiBpbiB0 aGUgcmFuZ2UgYXJlIHZhbGlkIGFuZCBoYXZlIENPTlRfUFRFIHNldCwgdGhhdCBhbGwgcGZucyBh cmUKPj4gK8KgwqDCoMKgICogY29udGlndW91cyBhbmQgdGhhdCBhbGwgcGdwcm90cyBhcmUgdGhl IHNhbWUgKGlnbm9yaW5nIGFjY2Vzcy9kaXJ0eSkuCj4+ICvCoMKgwqDCoCAqIElmIHdlIGZpbmQg YSBwdGUgdGhhdCBpcyBub3QgY29uc2lzdGVudCwgdGhlbiB3ZSBtdXN0IGJlIHJhY2luZyB3aXRo Cj4+ICvCoMKgwqDCoCAqIGFuIHVwZGF0ZSBzbyBzdGFydCBhZ2Fpbi4gSWYgdGhlIHRhcmdldCBw dGUgZG9lcyBub3QgaGF2ZSBDT05UX1BURQo+PiArwqDCoMKgwqAgKiBzZXQgdGhlbiB0aGF0IGlz IGNvbnNpZGVyZWQgY29uc2lzdGVudCBvbiBpdHMgb3duIGJlY2F1c2UgaXQgaXMgbm90Cj4+ICvC oMKgwqDCoCAqIHBhcnQgb2YgYSBjb250cHRlIHJhbmdlLgo+PiArwqDCoMKgwqAgKi8KPj4gKwo+ PiArwqDCoMKgIHBncHJvdF90IG9yaWdfcHJvdDsKPj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIHBm bjsKPj4gK8KgwqDCoCBwdGVfdCBvcmlnX3B0ZTsKPj4gK8KgwqDCoCBwZ3Byb3RfdCBwcm90Owo+ PiArwqDCoMKgIHB0ZV90ICpwdGVwOwo+PiArwqDCoMKgIHB0ZV90IHB0ZTsKPj4gK8KgwqDCoCBp bnQgaTsKPj4gKwo+PiArcmV0cnk6Cj4+ICvCoMKgwqAgb3JpZ19wdGUgPSBfX3B0ZXBfZ2V0KG9y aWdfcHRlcCk7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIXB0ZV92YWxpZF9jb250KG9yaWdfcHRlKSkK Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBvcmlnX3B0ZTsKPj4gKwo+PiArwqDCoMKgIG9yaWdf cHJvdCA9IHB0ZV9wZ3Byb3QocHRlX21rb2xkKHB0ZV9ta2NsZWFuKG9yaWdfcHRlKSkpOwo+PiAr wqDCoMKgIHB0ZXAgPSBjb250cHRlX2FsaWduX2Rvd24ob3JpZ19wdGVwKTsKPj4gK8KgwqDCoCBw Zm4gPSBwdGVfcGZuKG9yaWdfcHRlKSAtIChvcmlnX3B0ZXAgLSBwdGVwKTsKPj4gKwo+PiArwqDC oMKgIGZvciAoaSA9IDA7IGkgPCBDT05UX1BURVM7IGkrKywgcHRlcCsrLCBwZm4rKykgewo+PiAr wqDCoMKgwqDCoMKgwqAgcHRlID0gX19wdGVwX2dldChwdGVwKTsKPj4gK8KgwqDCoMKgwqDCoMKg IHByb3QgPSBwdGVfcGdwcm90KHB0ZV9ta29sZChwdGVfbWtjbGVhbihwdGUpKSk7Cj4+ICsKPj4g K8KgwqDCoMKgwqDCoMKgIGlmICghcHRlX3ZhbGlkX2NvbnQocHRlKSB8fAo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqAgcHRlX3BmbihwdGUpICE9IHBmbiB8fAo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqAgcGdwcm90X3ZhbChwcm90KSAhPSBwZ3Byb3RfdmFsKG9yaWdfcHJvdCkpCj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGdvdG8gcmV0cnk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChw dGVfZGlydHkocHRlKSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgb3JpZ19wdGUgPSBwdGVf bWtkaXJ0eShvcmlnX3B0ZSk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChwdGVfeW91bmco cHRlKSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgb3JpZ19wdGUgPSBwdGVfbWt5b3VuZyhv cmlnX3B0ZSk7Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIG9yaWdfcHRlOwo+ PiArfQo+PiArRVhQT1JUX1NZTUJPTChjb250cHRlX3B0ZXBfZ2V0X2xvY2tsZXNzKTsKPj4gKwo+ PiArdm9pZCBjb250cHRlX3NldF9wdGVzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBs b25nIGFkZHIsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwdGVf dCAqcHRlcCwgcHRlX3QgcHRlLCB1bnNpZ25lZCBpbnQgbnIpCj4+ICt7Cj4+ICvCoMKgwqAgdW5z aWduZWQgbG9uZyBuZXh0Owo+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgZW5kOwo+PiArwqDCoMKg IHVuc2lnbmVkIGxvbmcgcGZuOwo+PiArwqDCoMKgIHBncHJvdF90IHByb3Q7Cj4+ICvCoMKgwqAg cHRlX3Qgb3JpZ19wdGU7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIW1tX2lzX3VzZXIobW0pKQo+PiAr wqDCoMKgwqDCoMKgwqAgcmV0dXJuIF9fc2V0X3B0ZXMobW0sIGFkZHIsIHB0ZXAsIHB0ZSwgbnIp Owo+PiArCj4+ICvCoMKgwqAgZW5kID0gYWRkciArIChuciA8PCBQQUdFX1NISUZUKTsKPj4gK8Kg wqDCoCBwZm4gPSBwdGVfcGZuKHB0ZSk7Cj4+ICvCoMKgwqAgcHJvdCA9IHB0ZV9wZ3Byb3QocHRl KTsKPj4gKwo+PiArwqDCoMKgIGRvIHsKPj4gK8KgwqDCoMKgwqDCoMKgIG5leHQgPSBwdGVfY29u dF9hZGRyX2VuZChhZGRyLCBlbmQpOwo+PiArwqDCoMKgwqDCoMKgwqAgbnIgPSAobmV4dCAtIGFk ZHIpID4+IFBBR0VfU0hJRlQ7Cj4+ICvCoMKgwqDCoMKgwqDCoCBwdGUgPSBwZm5fcHRlKHBmbiwg cHJvdCk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmICgoKGFkZHIgfCBuZXh0IHwgKHBmbiA8 PCBQQUdFX1NISUZUKSkgJiB+Q09OVF9QVEVfTUFTSykgPT0gMCkKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgcHRlID0gcHRlX21rY29udChwdGUpOwo+PiArwqDCoMKgwqDCoMKgwqAgZWxzZQo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwdGUgPSBwdGVfbWtub25jb250KHB0ZSk7Cj4+ICsK Pj4gK8KgwqDCoMKgwqDCoMKgIC8qCj4+ICvCoMKgwqDCoMKgwqDCoMKgICogSWYgb3BlcmF0aW5n IG9uIGEgcGFydGlhbCBjb250aWd1b3VzIHJhbmdlIHRoZW4gd2UgbXVzdCBmaXJzdAo+PiArwqDC oMKgwqDCoMKgwqDCoCAqIHVuZm9sZCB0aGUgY29udGlndW91cyByYW5nZSBpZiBpdCB3YXMgcHJl dmlvdXNseSBmb2xkZWQuCj4+ICvCoMKgwqDCoMKgwqDCoMKgICogT3RoZXJ3aXNlIHdlIGNvdWxk IGVuZCB1cCB3aXRoIG92ZXJsYXBwaW5nIHRsYiBlbnRyaWVzLgo+PiArwqDCoMKgwqDCoMKgwqDC oCAqLwo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKG5yICE9IENPTlRfUFRFUykKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgY29udHB0ZV90cnlfdW5mb2xkKG1tLCBhZGRyLCBwdGVwLCBfX3B0ZXBf Z2V0KHB0ZXApKTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgLyoKPj4gK8KgwqDCoMKgwqDCoMKg wqAgKiBJZiB3ZSBhcmUgcmVwbGFjaW5nIHB0ZXMgdGhhdCB3ZXJlIGNvbnRpZ3VvdXMgb3IgaWYg dGhlIG5ldwo+PiArwqDCoMKgwqDCoMKgwqDCoCAqIHB0ZXMgYXJlIGNvbnRpZ3VvdXMgYW5kIGFu eSBvZiB0aGUgcHRlcyBiZWluZyByZXBsYWNlZCBhcmUKPj4gK8KgwqDCoMKgwqDCoMKgwqAgKiB2 YWxpZCwgd2UgbmVlZCB0byBjbGVhciBhbmQgZmx1c2ggdGhlIHJhbmdlIHRvIHByZXZlbnQKPj4g K8KgwqDCoMKgwqDCoMKgwqAgKiBvdmVybGFwcGluZyB0bGIgZW50cmllcy4KPj4gK8KgwqDCoMKg wqDCoMKgwqAgKi8KPj4gK8KgwqDCoMKgwqDCoMKgIG9yaWdfcHRlID0gX19wdGVwX2dldChwdGVw KTsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChwdGVfdmFsaWRfY29udChvcmlnX3B0ZSkgfHwKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHB0ZV9jb250KHB0ZSkgJiYgcHRlcF9hbnlfdmFsaWQo cHRlcCwgbnIpKSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHRlcF9jbGVhcl9mbHVzaF9y YW5nZShtbSwgYWRkciwgcHRlcCwgbnIpOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBfX3NldF9w dGVzKG1tLCBhZGRyLCBwdGVwLCBwdGUsIG5yKTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgYWRk ciA9IG5leHQ7Cj4+ICvCoMKgwqDCoMKgwqDCoCBwdGVwICs9IG5yOwo+PiArwqDCoMKgwqDCoMKg wqAgcGZuICs9IG5yOwo+PiArCj4+ICvCoMKgwqAgfSB3aGlsZSAoYWRkciAhPSBlbmQpOwo+PiAr fQo+PiArRVhQT1JUX1NZTUJPTChjb250cHRlX3NldF9wdGVzKTsKPj4gKwo+PiAraW50IGNvbnRw dGVfcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcg YWRkciwgcHRlX3QgKnB0ZXApCj4+ICt7Cj4+ICvCoMKgwqAgLyoKPj4gK8KgwqDCoMKgICogcHRl cF9jbGVhcl9mbHVzaF95b3VuZygpIHRlY2huaWNhbGx5IHJlcXVpcmVzIHVzIHRvIGNsZWFyIHRo ZSBhY2Nlc3MKPj4gK8KgwqDCoMKgICogZmxhZyBmb3IgYSBfc2luZ2xlXyBwdGUuIEhvd2V2ZXIs IHRoZSBjb3JlLW1tIGNvZGUgYWN0dWFsbHkgdHJhY2tzCj4+ICvCoMKgwqDCoCAqIGFjY2Vzcy9k aXJ0eSBwZXIgZm9saW8sIG5vdCBwZXIgcGFnZS4gQW5kIHNpbmNlIHdlIG9ubHkgY3JlYXRlIGEK Pj4gK8KgwqDCoMKgICogY29udGlnIHJhbmdlIHdoZW4gdGhlIHJhbmdlIGlzIGNvdmVyZWQgYnkg YSBzaW5nbGUgZm9saW8sIHdlIGNhbiBnZXQKPj4gK8KgwqDCoMKgICogYXdheSB3aXRoIGNsZWFy aW5nIHlvdW5nIGZvciB0aGUgd2hvbGUgY29udGlnIHJhbmdlIGhlcmUsIHNvIHdlIGF2b2lkCj4+ ICvCoMKgwqDCoCAqIGhhdmluZyB0byB1bmZvbGQuCj4+ICvCoMKgwqDCoCAqLwo+PiArCj4+ICvC oMKgwqAgaW50IHlvdW5nID0gMDsKPj4gK8KgwqDCoCBpbnQgaTsKPj4gKwo+PiArwqDCoMKgIHB0 ZXAgPSBjb250cHRlX2FsaWduX2Rvd24ocHRlcCk7Cj4+ICvCoMKgwqAgYWRkciA9IEFMSUdOX0RP V04oYWRkciwgQ09OVF9QVEVfU0laRSk7Cj4+ICsKPj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwg Q09OVF9QVEVTOyBpKyssIHB0ZXArKywgYWRkciArPSBQQUdFX1NJWkUpCj4+ICvCoMKgwqDCoMKg wqDCoCB5b3VuZyB8PSBfX3B0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcodm1hLCBhZGRyLCBwdGVw KTsKPj4gKwo+PiArwqDCoMKgIHJldHVybiB5b3VuZzsKPj4gK30KPj4gK0VYUE9SVF9TWU1CT0wo Y29udHB0ZV9wdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKTsKPj4gKwo+PiAraW50IGNvbnRwdGVf cHRlcF9jbGVhcl9mbHVzaF95b3VuZyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgYWRkciwg cHRlX3QgKnB0ZXApCj4+ICt7Cj4+ICvCoMKgwqAgaW50IHlvdW5nOwo+PiArCj4+ICvCoMKgwqAg eW91bmcgPSBjb250cHRlX3B0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcodm1hLCBhZGRyLCBwdGVw KTsKPj4gKwo+PiArwqDCoMKgIGlmICh5b3VuZykgewo+PiArwqDCoMKgwqDCoMKgwqAgLyoKPj4g K8KgwqDCoMKgwqDCoMKgwqAgKiBTZWUgY29tbWVudCBpbiBfX3B0ZXBfY2xlYXJfZmx1c2hfeW91 bmcoKTsgc2FtZSByYXRpb25hbGUgZm9yCj4+ICvCoMKgwqDCoMKgwqDCoMKgICogZWxpZGluZyB0 aGUgdHJhaWxpbmcgRFNCIGFwcGxpZXMgaGVyZS4KPj4gK8KgwqDCoMKgwqDCoMKgwqAgKi8KPj4g K8KgwqDCoMKgwqDCoMKgIGFkZHIgPSBBTElHTl9ET1dOKGFkZHIsIENPTlRfUFRFX1NJWkUpOwo+ PiArwqDCoMKgwqDCoMKgwqAgX19mbHVzaF90bGJfcmFuZ2Vfbm9zeW5jKHZtYSwgYWRkciwgYWRk ciArIENPTlRfUFRFX1NJWkUsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIFBBR0VfU0laRSwgdHJ1ZSwgMyk7Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAg cmV0dXJuIHlvdW5nOwo+PiArfQo+PiArRVhQT1JUX1NZTUJPTChjb250cHRlX3B0ZXBfY2xlYXJf Zmx1c2hfeW91bmcpOwo+PiArCj4+ICtpbnQgY29udHB0ZV9wdGVwX3NldF9hY2Nlc3NfZmxhZ3Mo c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwLAo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHRlX3QgZW50cnksIGludCBkaXJ0eSkK Pj4gK3sKPj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHI7Cj4+ICvCoMKgwqAgcHRl X3Qgb3JpZ19wdGU7Cj4+ICvCoMKgwqAgaW50IGk7Cj4+ICsKPj4gK8KgwqDCoCAvKgo+PiArwqDC oMKgwqAgKiBHYXRoZXIgdGhlIGFjY2Vzcy9kaXJ0eSBiaXRzIGZvciB0aGUgY29udGlndW91cyBy YW5nZS4gSWYgbm90aGluZyBoYXMKPj4gK8KgwqDCoMKgICogY2hhbmdlZCwgaXRzIGEgbm9vcC4K Pj4gK8KgwqDCoMKgICovCj4+ICvCoMKgwqAgb3JpZ19wdGUgPSBwdGVfbWtub25jb250KHB0ZXBf Z2V0KHB0ZXApKTsKPj4gK8KgwqDCoCBpZiAocHRlX3ZhbChvcmlnX3B0ZSkgPT0gcHRlX3ZhbChl bnRyeSkpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4gKwo+PiArwqDCoMKgIC8qCj4+ ICvCoMKgwqDCoCAqIFdlIGNhbiBmaXggdXAgYWNjZXNzL2RpcnR5IGJpdHMgd2l0aG91dCBoYXZp bmcgdG8gdW5mb2xkL2ZvbGQgdGhlCj4+ICvCoMKgwqDCoCAqIGNvbnRpZyByYW5nZS4gQnV0IGlm IHRoZSB3cml0ZSBiaXQgaXMgY2hhbmdpbmcsIHdlIG5lZWQgdG8gZ28gdGhyb3VnaAo+PiArwqDC oMKgwqAgKiB0aGUgZnVsbCB1bmZvbGQvZm9sZCBjeWNsZS4KPj4gK8KgwqDCoMKgICovCj4+ICvC oMKgwqAgaWYgKHB0ZV93cml0ZShvcmlnX3B0ZSkgPT0gcHRlX3dyaXRlKGVudHJ5KSkgewo+PiAr wqDCoMKgwqDCoMKgwqAgLyoKPj4gK8KgwqDCoMKgwqDCoMKgwqAgKiBGb3IgSFcgYWNjZXNzIG1h bmFnZW1lbnQsIHdlIHRlY2huaWNhbGx5IG9ubHkgbmVlZCB0byB1cGRhdGUKPj4gK8KgwqDCoMKg wqDCoMKgwqAgKiB0aGUgZmxhZyBvbiBhIHNpbmdsZSBwdGUgaW4gdGhlIHJhbmdlLiBCdXQgZm9y IFNXIGFjY2Vzcwo+PiArwqDCoMKgwqDCoMKgwqDCoCAqIG1hbmFnZW1lbnQsIHdlIG5lZWQgdG8g dXBkYXRlIGFsbCB0aGUgcHRlcyB0byBwcmV2ZW50IGV4dHJhCj4+ICvCoMKgwqDCoMKgwqDCoMKg ICogZmF1bHRzLiBBdm9pZCBwZXItcGFnZSB0bGIgZmx1c2ggaW4gX19wdGVwX3NldF9hY2Nlc3Nf ZmxhZ3MoKQo+PiArwqDCoMKgwqDCoMKgwqDCoCAqIGFuZCBpbnN0ZWFkIGZsdXNoIHRoZSB3aG9s ZSByYW5nZSBhdCB0aGUgZW5kLgo+PiArwqDCoMKgwqDCoMKgwqDCoCAqLwo+PiArwqDCoMKgwqDC oMKgwqAgcHRlcCA9IGNvbnRwdGVfYWxpZ25fZG93bihwdGVwKTsKPj4gK8KgwqDCoMKgwqDCoMKg IHN0YXJ0X2FkZHIgPSBhZGRyID0gQUxJR05fRE9XTihhZGRyLCBDT05UX1BURV9TSVpFKTsKPj4g Kwo+PiArwqDCoMKgwqDCoMKgwqAgZm9yIChpID0gMDsgaSA8IENPTlRfUFRFUzsgaSsrLCBwdGVw KyssIGFkZHIgKz0gUEFHRV9TSVpFKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBfX3B0ZXBf c2V0X2FjY2Vzc19mbGFncyh2bWEsIGFkZHIsIHB0ZXAsIGVudHJ5LCAwKTsKPiAKPiAKPiBlbnRy eSB3YXMgcHRlX21rbm9uY29udCgpIGluIHB0ZXBfc2V0X2FjY2Vzc19mbGFncygpIHNvIGhlcmUg eW91IGxvc2UgdGhlCj4gY29udHB0ZSByYW5nZSwgaXMgdGhhdCBpbnRlbnRpb25hbD8gT3IgYW0g SSBtaXN0YWtlbj8KCmVudHJ5IGRvZXNuJ3QgaGF2ZSBQVEVfQ09OVCBiaXQgc2V0LCB0aGF0J3Mg Y29ycmVjdC4gSSBpbnRlbnRpb25hbGx5IHN0cmlwIHRoYXQKYml0IGF0IHRoZSBpbnRlcmZhY2Ug Ym91bmRhcnksIGJlY2F1c2UgaXQgaXMgdGhlIGltcGxlbWVudGF0aW9uJ3Mgam9iIHRvIGRlY2lk ZQp3aGV0aGVyIGl0cyBhIGNvbnRwdGUgYmxvY2ssIG5vdCB0aGUgY2FsbGVyJ3MuIEJ1dCB0aGVy ZSBhcmUgc2l0dWF0aW9ucyB3aGVyZQp0aGUgY2FsbGVyIGNhbiBlbmQgdXAgd2l0aCBhIHB0ZSB0 aGF0IGhhcyBQVEVfQ09OVCBzZXQgKGJ5IGhhdmluZyBkb25lIGEKcHJldmlvdXMgcHRlcF9nZXQo KSBmb3IgZXhhbXBsZSkgYW5kIHRoZW4gaXQgZm9yd2FyZHMgdGhlIHB0ZSB0byBhIHNldHRlci4g U28Kc3RyaXBwaW5nIGl0IGlzIHJlcXVpcmVkOyBJdCB3b3VsZCBwcm9iYWJseSBiZSBjbGVhbmVy IHRvIHN0cmlwIGl0IGJlZm9yZQpyZXR1cm5pbmcgaXQgZnJvbSBwdGVwX2dldCgpLCBidXQgdGhh dCB3b3VsZCBiZSBwcm9ibGVtYXRpYyBmb3IgcHRlX2xlYWZfc2l6ZSgpCndoaWNoIGlzIGNhbGxl ZCBmcm9tIHBlcmZfZ2V0X3BndGFibGVfc2l6ZSgpLgoKSW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2Us IF9fcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKCkgb25seSBtb2RpZmllcyB0aGUgUFRFJ3MKYWNjZXNz IGZsYWdzLCBzbyBDT05UX1BURSB3aWxsIHJlbWFpbiBhcyBpdCBpcyBpbiB0aGUgcGFnZSB0YWJs ZS4gVGhlIGZhY3QgdGhhdAplbnRyeSBoYXMgaXQgY2xlYXJlZCBpcyBub3QgYSBwcm9ibGVtLgoK VGhhbmtzLApSeWFuCgoKPiAKPiAKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKGRpcnR5KQo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBfX2ZsdXNoX3RsYl9yYW5nZSh2bWEsIHN0YXJ0X2Fk ZHIsIGFkZHIsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgUEFHRV9TSVpFLCB0cnVlLCAzKTsKPj4gK8KgwqDCoCB9IGVsc2Ugewo+PiAr wqDCoMKgwqDCoMKgwqAgX19jb250cHRlX3RyeV91bmZvbGQodm1hLT52bV9tbSwgYWRkciwgcHRl cCwgb3JpZ19wdGUpOwo+PiArwqDCoMKgwqDCoMKgwqAgX19wdGVwX3NldF9hY2Nlc3NfZmxhZ3Mo dm1hLCBhZGRyLCBwdGVwLCBlbnRyeSwgZGlydHkpOwo+PiArwqDCoMKgwqDCoMKgwqAgY29udHB0 ZV90cnlfZm9sZCh2bWEtPnZtX21tLCBhZGRyLCBwdGVwLCBlbnRyeSk7Cj4+ICvCoMKgwqAgfQo+ PiArCj4+ICvCoMKgwqAgcmV0dXJuIDE7Cj4+ICt9Cj4+ICtFWFBPUlRfU1lNQk9MKGNvbnRwdGVf cHRlcF9zZXRfYWNjZXNzX2ZsYWdzKTsKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0t a2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==