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 12A6CC47077 for ; Tue, 16 Jan 2024 14:45:49 +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=jHCwVvdXrLM39w9wdrw3q/PFB7Jk5pED8DXxk4eeHCI=; b=ik+a2mNnB7tsiZ k/paZJfyHunCrvQnLpeNJ+xIEzAnMkJ1ELSoUlj2VbglC+WXrh3jgqBhwc/0ApAecXJZofekgG9fo cac3GGjo22edcTXkQ60fAMX8w3VjpH0Ux9ziVKtbgr8st0buw4BL/1abfOyvV/Zk+SGN2Z/67nyJk vZuLEC99gPcoQ5UIuArqZDBXfsFui6XSOPzjMqoUGED37R9KWe1ZkgO+BcxWPwVD+HTp9Q+VAXzYQ lbiZhmJ2sDhVuIedhbGYclmmF4+m7trjxr/JYbcpBD3cESX0bf1I2w+kAW8BXrvu8YjQLk3Lnkise +gDEY8as3KxgiebNlX4Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rPkgi-00CJnv-3D; Tue, 16 Jan 2024 14:45:13 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rPkga-00CJlk-0r for linux-arm-kernel@lists.infradead.org; Tue, 16 Jan 2024 14:45:11 +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 0D8A32F4; Tue, 16 Jan 2024 06:45:45 -0800 (PST) Received: from [10.1.38.190] (XHFQ2J9959.cambridge.arm.com [10.1.38.190]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 9210E3F5A1; Tue, 16 Jan 2024 06:44:52 -0800 (PST) Message-ID: <2fd4d11e-aea8-41f7-9ed1-0ec9e54f86a2@arm.com> Date: Tue, 16 Jan 2024 14:44:50 +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> <25843552-2841-4f83-9026-81c64e1ed228@ghiti.fr> From: Ryan Roberts In-Reply-To: <25843552-2841-4f83-9026-81c64e1ed228@ghiti.fr> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240116_064504_709522_C0801FB6 X-CRM114-Status: GOOD ( 25.93 ) 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 T24gMTUvMDEvMjAyNCAyMToyMywgQWxleGFuZHJlIEdoaXRpIHdyb3RlOgo+IE9uIDE1LzAxLzIw MjQgMTc6MjcsIFJ5YW4gUm9iZXJ0cyB3cm90ZToKPj4gT24gMTUvMDEvMjAyNCAxNToxNCwgQWxl eGFuZHJlIEdoaXRpIHdyb3RlOgo+Pj4gSGkgUnlhbiwKPj4+Cj4+PiBPbiAxOC8xMi8yMDIzIDEx OjUwLCBSeWFuIFJvYmVydHMgd3JvdGU6Cj4+Pj4gV2l0aCB0aGUgcHRlcCBBUEkgc3VmZmljaWVu dGx5IHJlZmFjdG9yZWQsIHdlIGNhbiBub3cgaW50cm9kdWNlIGEgbmV3Cj4+Pj4gImNvbnRwdGUi IEFQSSBsYXllciwgd2hpY2ggdHJhbnNwYXJlbnRseSBtYW5hZ2VzIHRoZSBQVEVfQ09OVCBiaXQg Zm9yCj4+Pj4gdXNlciBtYXBwaW5ncy4gV2hlbmV2ZXIgaXQgZGV0ZWN0cyBhIHNldCBvZiBQVEVz IHRoYXQgbWVldCB0aGUKPj4+PiByZXF1aXJlbWVudHMgZm9yIGEgY29udGlndW91cyByYW5nZSwg dGhlIFBURXMgYXJlIHJlLXBhaW50ZWQgd2l0aCB0aGUKPj4+PiBQVEVfQ09OVCBiaXQuIFVzZSBv ZiBjb250cHRlIG1hcHBpbmdzIGlzIGludGVuZGVkIHRvIGJlIHRyYW5zcGFyZW50IHRvCj4+Pj4g dGhlIGNvcmUtbW0sIHdoaWNoIGNvbnRpbnVlcyB0byBpbnRlcmFjdCB3aXRoIGluZGl2aWR1YWwg cHRlcy4KPj4+Pgo+Pj4+IFNpbmNlIGEgY29udHB0ZSBibG9jayBvbmx5IGhhcyBhIHNpbmdsZSBh Y2Nlc3MgYW5kIGRpcnR5IGJpdCwgdGhlCj4+Pj4gc2VtYW50aWMgaGVyZSBjaGFuZ2VzIHNsaWdo dGx5OyB3aGVuIGdldHRpbmcgYSBwdGUgKGUuZy4gcHRlcF9nZXQoKSkKPj4+PiB0aGF0IGlzIHBh cnQgb2YgYSBjb250cHRlIG1hcHBpbmcsIHRoZSBhY2Nlc3MgYW5kIGRpcnR5IGluZm9ybWF0aW9u IGFyZQo+Pj4+IHB1bGxlZCBmcm9tIHRoZSBibG9jayAoc28gYWxsIHB0ZXMgaW4gdGhlIGJsb2Nr IHJldHVybiB0aGUgc2FtZQo+Pj4+IGFjY2Vzcy9kaXJ0eSBpbmZvKS4gV2hlbiBjaGFuZ2luZyB0 aGUgYWNjZXNzL2RpcnR5IGluZm8gb24gYSBwdGUgKGUuZy4KPj4+PiBwdGVwX3NldF9hY2Nlc3Nf ZmxhZ3MoKSkgdGhhdCBpcyBwYXJ0IG9mIGEgY29udHB0ZSBtYXBwaW5nLCB0aGlzIGNoYW5nZQo+ Pj4+IHdpbGwgYWZmZWN0IHRoZSB3aG9sZSBjb250cHRlIGJsb2NrLiBUaGlzIGlzIHdvcmtzIGZp bmUgaW4gcHJhY3RpY2UKPj4+PiBzaW5jZSB3ZSBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xl IGZvbGlvIGlzIG1hcHBlZCBieSBhIGNvbnRwdGUKPj4+PiBibG9jaywgYW5kIHRoZSBjb3JlLW1t IHRyYWNrcyBhY2Nlc3MvZGlydHkgaW5mb3JtYXRpb24gcGVyIGZvbGlvLgo+Pj4+Cj4+Pj4gVGhp cyBpbml0aWFsIGNoYW5nZSBwcm92aWRlcyBhIGJhc2VsaW5lIHRoYXQgY2FuIGJlIG9wdGltaXpl ZCBpbiBmdXR1cmUKPj4+PiBjb21taXRzLiBUaGF0IHNhaWQsIGZvbGQvdW5mb2xkIG9wZXJhdGlv bnMgKHdoaWNoIGltcGx5IHRsYgo+Pj4+IGludmFsaWRhdGlvbikgYXJlIGF2b2lkZWQgd2hlcmUg cG9zc2libGUgd2l0aCBhIGZldyB0cmlja3MgZm9yCj4+Pj4gYWNjZXNzL2RpcnR5IGJpdCBtYW5h Z2VtZW50LiBXcml0ZS1wcm90ZWN0IG1vZGlmaWNhdGlvbnMgZm9yIGNvbnRwdGUKPj4+PiBtYXBw aW5ncyBhcmUgY3VycmVudGx5IG5vbi1vcHRpbWFsLCBhbmQgaW5jdXJlIGEgcmVncmVzc2lvbiBp biBmb3JrKCkKPj4+PiBwZXJmb3JtYW5jZS4gVGhpcyB3aWxsIGJlIGFkZHJlc3NlZCBpbiBmb2xs b3ctdXAgY2hhbmdlcy4KPj4+Pgo+Pj4+IEluIG9yZGVyIGZvciB0aGUgcHVibGljIGZ1bmN0aW9u cywgd2hpY2ggdXNlZCB0byBiZSBwdXJlIGlubGluZSwgdG8KPj4+PiBjb250aW51ZSB0byBiZSBj YWxsYWJsZSBieSBtb2R1bGVzLCBleHBvcnQgYWxsIHRoZSBjb250cHRlXyogc3ltYm9scwo+Pj4+ IHRoYXQgYXJlIG5vdyBjYWxsZWQgYnkgdGhvc2UgcHVibGljIGlubGluZSBmdW5jdGlvbnMuCj4+ Pj4KPj4+PiBUaGUgZmVhdHVyZSBpcyBlbmFibGVkL2Rpc2FibGVkIHdpdGggdGhlIEFSTTY0X0NP TlRQVEUgS2NvbmZpZyBwYXJhbWV0ZXIKPj4+PiBhdCBidWlsZCB0aW1lLiBJdCBkZWZhdWx0cyB0 byBlbmFibGVkIGFzIGxvbmcgYXMgaXRzIGRlcGVuZGVuY3ksCj4+Pj4gVFJBTlNQQVJFTlRfSFVH RVBBR0UgaXMgYWxzbyBlbmFibGVkLiBUaGUgY29yZS1tbSBkZXBlbmRzIHVwb24KPj4+PiBUUkFO U1BBUkVOVF9IVUdFUEFHRSB0byBiZSBhYmxlIHRvIGFsbG9jYXRlIGxhcmdlIGZvbGlvcywgc28g aWYgaXRzIG5vdAo+Pj4+IGVuYWJsZWQsIHRoZW4gdGhlcmUgaXMgbm8gY2hhbmNlIG9mIG1lZXRp bmcgdGhlIHBoeXNpY2FsIGNvbnRpZ3VpdHkKPj4+PiByZXF1aXJlbWVudCBmb3IgY29udHB0ZSBt YXBwaW5ncy4KPj4+Pgo+Pj4+IFRlc3RlZC1ieTogSm9obiBIdWJiYXJkIDxqaHViYmFyZEBudmlk aWEuY29tPgo+Pj4+IFNpZ25lZC1vZmYtYnk6IFJ5YW4gUm9iZXJ0cyA8cnlhbi5yb2JlcnRzQGFy bS5jb20+Cj4+Pj4gLS0tCj4+Pj4gwqDCoCBhcmNoL2FybTY0L0tjb25maWfCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHzCoCAxMCArLQo+Pj4+IMKgwqAgYXJjaC9hcm02NC9pbmNsdWRlL2Fz bS9wZ3RhYmxlLmggfCAxODQgKysrKysrKysrKysrKysrCj4+Pj4gwqDCoCBhcmNoL2FybTY0L21t L01ha2VmaWxlwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqAgMSArCj4+Pj4gwqDCoCBhcmNoL2Fy bTY0L21tL2NvbnRwdGUuY8KgwqDCoMKgwqDCoMKgwqDCoCB8IDM4OCArKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrCj4+Pj4gwqDCoCA0IGZpbGVzIGNoYW5nZWQsIDU4MiBpbnNlcnRpb25z KCspLCAxIGRlbGV0aW9uKC0pCj4+Pj4gwqDCoCBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02 NC9tbS9jb250cHRlLmMKPj4+Pgo+Pj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcg Yi9hcmNoL2FybTY0L0tjb25maWcKPj4+PiBpbmRleCA3YjA3MWEwMDQyNWQuLmRlNzZlNDg0ZmYz YSAxMDA2NDQKPj4+PiAtLS0gYS9hcmNoL2FybTY0L0tjb25maWcKPj4+PiArKysgYi9hcmNoL2Fy bTY0L0tjb25maWcKPj4+PiBAQCAtMjIwOSw2ICsyMjA5LDE1IEBAIGNvbmZpZyBVTldJTkRfUEFU Q0hfUEFDX0lOVE9fU0NTCj4+Pj4gwqDCoMKgwqDCoMKgIHNlbGVjdCBVTldJTkRfVEFCTEVTCj4+ Pj4gwqDCoMKgwqDCoMKgIHNlbGVjdCBEWU5BTUlDX1NDUwo+Pj4+IMKgwqAgK2NvbmZpZyBBUk02 NF9DT05UUFRFCj4+Pj4gK8KgwqDCoCBib29sICJDb250aWd1b3VzIFBURSBtYXBwaW5ncyBmb3Ig dXNlciBtZW1vcnkiIGlmIEVYUEVSVAo+Pj4+ICvCoMKgwqAgZGVwZW5kcyBvbiBUUkFOU1BBUkVO VF9IVUdFUEFHRQo+Pj4+ICvCoMKgwqAgZGVmYXVsdCB5Cj4+Pj4gK8KgwqDCoCBoZWxwCj4+Pj4g K8KgwqDCoMKgwqAgV2hlbiBlbmFibGVkLCB1c2VyIG1hcHBpbmdzIGFyZSBjb25maWd1cmVkIHVz aW5nIHRoZSBQVEUgY29udGlndW91cwo+Pj4+ICvCoMKgwqDCoMKgIGJpdCwgZm9yIGFueSBtYXBw aW5ncyB0aGF0IG1lZXQgdGhlIHNpemUgYW5kIGFsaWdubWVudCByZXF1aXJlbWVudHMuCj4+Pj4g K8KgwqDCoMKgwqAgVGhpcyByZWR1Y2VzIFRMQiBwcmVzc3VyZSBhbmQgaW1wcm92ZXMgcGVyZm9y bWFuY2UuCj4+Pj4gKwo+Pj4+IMKgwqAgZW5kbWVudSAjICJLZXJuZWwgRmVhdHVyZXMiCj4+Pj4g wqDCoCDCoCBtZW51ICJCb290IG9wdGlvbnMiCj4+Pj4gQEAgLTIzMTgsNCArMjMyNywzIEBAIGVu ZG1lbnUgIyAiQ1BVIFBvd2VyIE1hbmFnZW1lbnQiCj4+Pj4gwqDCoCBzb3VyY2UgImRyaXZlcnMv YWNwaS9LY29uZmlnIgo+Pj4+IMKgwqAgwqAgc291cmNlICJhcmNoL2FybTY0L2t2bS9LY29uZmln Igo+Pj4+IC0KPj4+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxl LmgKPj4+PiBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oCj4+Pj4gaW5kZXggNjkz MGMxNGYwNjJmLi5lNjQxMjA0NTIzMDEgMTAwNjQ0Cj4+Pj4gLS0tIGEvYXJjaC9hcm02NC9pbmNs dWRlL2FzbS9wZ3RhYmxlLmgKPj4+PiArKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFi bGUuaAo+Pj4+IEBAIC0xMzMsNiArMTMzLDEwIEBAIHN0YXRpYyBpbmxpbmUgcHRldmFsX3QgX19w aHlzX3RvX3B0ZV92YWwocGh5c19hZGRyX3QgcGh5cykKPj4+PiDCoMKgwqAgKi8KPj4+PiDCoMKg ICNkZWZpbmUgcHRlX3ZhbGlkX25vdF91c2VyKHB0ZSkgXAo+Pj4+IMKgwqDCoMKgwqDCoCAoKHB0 ZV92YWwocHRlKSAmIChQVEVfVkFMSUQgfCBQVEVfVVNFUiB8IFBURV9VWE4pKSA9PSAoUFRFX1ZB TElEIHwKPj4+PiBQVEVfVVhOKSkKPj4+PiArLyoKPj4+PiArICogUmV0dXJucyB0cnVlIGlmIHRo ZSBwdGUgaXMgdmFsaWQgYW5kIGhhcyB0aGUgY29udGlndW91cyBiaXQgc2V0Lgo+Pj4+ICsgKi8K Pj4+PiArI2RlZmluZSBwdGVfdmFsaWRfY29udChwdGUpwqDCoMKgIChwdGVfdmFsaWQocHRlKSAm JiBwdGVfY29udChwdGUpKQo+Pj4+IMKgwqAgLyoKPj4+PiDCoMKgwqAgKiBDb3VsZCB0aGUgcHRl IGJlIHByZXNlbnQgaW4gdGhlIFRMQj8gV2UgbXVzdCBjaGVjayBtbV90bGJfZmx1c2hfcGVuZGlu Zwo+Pj4+IMKgwqDCoCAqIHNvIHRoYXQgd2UgZG9uJ3QgZXJyb25lb3VzbHkgcmV0dXJuIGZhbHNl IGZvciBwYWdlcyB0aGF0IGhhdmUgYmVlbgo+Pj4+IEBAIC0xMTE2LDYgKzExMjAsMTg0IEBAIGV4 dGVybiB2b2lkIHB0ZXBfbW9kaWZ5X3Byb3RfY29tbWl0KHN0cnVjdAo+Pj4+IHZtX2FyZWFfc3Ry dWN0ICp2bWEsCj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCwKPj4+PiDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwdGVfdCBvbGRfcHRlLCBwdGVfdCBuZXdfcHRl KTsKPj4+PiDCoMKgICsjaWZkZWYgQ09ORklHX0FSTTY0X0NPTlRQVEUKPj4+PiArCj4+Pj4gKy8q Cj4+Pj4gKyAqIFRoZSBjb250cHRlIEFQSXMgYXJlIHVzZWQgdG8gdHJhbnNwYXJlbnRseSBtYW5h Z2UgdGhlIGNvbnRpZ3VvdXMgYml0IGluCj4+Pj4gcHRlcwo+Pj4+ICsgKiB3aGVyZSBpdCBpcyBw b3NzaWJsZSBhbmQgbWFrZXMgc2Vuc2UgdG8gZG8gc28uIFRoZSBQVEVfQ09OVCBiaXQgaXMKPj4+ PiBjb25zaWRlcmVkCj4+Pj4gKyAqIGEgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2Yg dGhlIHB1YmxpYyBwdGVwIEFQSSAoc2VlIGJlbG93KS4KPj4+PiArICovCj4+Pj4gK2V4dGVybiB2 b2lkIF9fY29udHB0ZV90cnlfZm9sZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9u ZyBhZGRyLAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHRlX3QgKnB0ZXAs IHB0ZV90IHB0ZSk7Cj4+Pj4gK2V4dGVybiB2b2lkIF9fY29udHB0ZV90cnlfdW5mb2xkKHN0cnVj dCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCj4+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKTsKPj4+PiArZXh0ZXJuIHB0 ZV90IGNvbnRwdGVfcHRlcF9nZXQocHRlX3QgKnB0ZXAsIHB0ZV90IG9yaWdfcHRlKTsKPj4+PiAr ZXh0ZXJuIHB0ZV90IGNvbnRwdGVfcHRlcF9nZXRfbG9ja2xlc3MocHRlX3QgKm9yaWdfcHRlcCk7 Cj4+Pj4gK2V4dGVybiB2b2lkIGNvbnRwdGVfc2V0X3B0ZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0s IHVuc2lnbmVkIGxvbmcgYWRkciwKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUsIHVuc2lnbmVkIGludCBucik7Cj4+Pj4gK2V4dGVybiBp bnQgY29udHB0ZV9wdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVj dCAqdm1hLAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9u ZyBhZGRyLCBwdGVfdCAqcHRlcCk7Cj4+Pj4gK2V4dGVybiBpbnQgY29udHB0ZV9wdGVwX2NsZWFy X2ZsdXNoX3lvdW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAo+Pj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCk7Cj4+ Pj4gK2V4dGVybiBpbnQgY29udHB0ZV9wdGVwX3NldF9hY2Nlc3NfZmxhZ3Moc3RydWN0IHZtX2Fy ZWFfc3RydWN0ICp2bWEsCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNp Z25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwLAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgcHRlX3QgZW50cnksIGludCBkaXJ0eSk7Cj4+Pj4gKwo+Pj4+ICtzdGF0aWMgaW5s aW5lIHZvaWQgY29udHB0ZV90cnlfZm9sZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQg bG9uZyBhZGRyLAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBw dGVfdCAqcHRlcCwgcHRlX3QgcHRlKQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCAvKgo+Pj4+ICvCoMKg wqDCoCAqIE9ubHkgYm90aGVyIHRyeWluZyBpZiBib3RoIHRoZSB2aXJ0dWFsIGFuZCBwaHlzaWNh bCBhZGRyZXNzZXMgYXJlCj4+Pj4gK8KgwqDCoMKgICogYWxpZ25lZCBhbmQgY29ycmVzcG9uZCB0 byB0aGUgbGFzdCBlbnRyeSBpbiBhIGNvbnRpZyByYW5nZS4gVGhlIGNvcmUKPj4+PiArwqDCoMKg wqAgKiBjb2RlIG1vc3RseSBtb2RpZmllcyByYW5nZXMgZnJvbSBsb3cgdG8gaGlnaCwgc28gdGhp cyBpcyB0aGUgbGlrZWx5Cj4+Pj4gK8KgwqDCoMKgICogdGhlIGxhc3QgbW9kaWZpY2F0aW9uIGlu IHRoZSBjb250aWcgcmFuZ2UsIHNvIGEgZ29vZCB0aW1lIHRvIGZvbGQuCj4+Pj4gK8KgwqDCoMKg ICogV2UgY2FuJ3QgZm9sZCBzcGVjaWFsIG1hcHBpbmdzLCBiZWNhdXNlIHRoZXJlIGlzIG5vIGFz c29jaWF0ZWQgZm9saW8uCj4+Pj4gK8KgwqDCoMKgICovCj4+Pj4gKwo+Pj4+ICvCoMKgwqAgY29u c3QgdW5zaWduZWQgbG9uZyBjb250bWFzayA9IENPTlRfUFRFUyAtIDE7Cj4+Pj4gK8KgwqDCoCBi b29sIHZhbGlnbiA9ICgoKHVuc2lnbmVkIGxvbmcpcHRlcCA+PiAzKSAmIGNvbnRtYXNrKSA9PSBj b250bWFzazsKPj4+PiArwqDCoMKgIGJvb2wgcGFsaWduID0gKHB0ZV9wZm4ocHRlKSAmIGNvbnRt YXNrKSA9PSBjb250bWFzazsKPj4+PiArCj4+Pj4gK8KgwqDCoCBpZiAodmFsaWduICYmIHBhbGln biAmJgo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBwdGVfdmFsaWQocHRlKSAmJiAhcHRlX2NvbnQocHRl KSAmJiAhcHRlX3NwZWNpYWwocHRlKSkKPj4+PiArwqDCoMKgwqDCoMKgwqAgX19jb250cHRlX3Ry eV9mb2xkKG1tLCBhZGRyLCBwdGVwLCBwdGUpOwo+Pj4+ICt9Cj4+Pj4gKwo+Pj4+ICtzdGF0aWMg aW5saW5lIHZvaWQgY29udHB0ZV90cnlfdW5mb2xkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNp Z25lZCBsb25nCj4+Pj4gYWRkciwKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSkKPj4+PiArewo+Pj4+ICvCoMKgwqAgaWYg KHB0ZV92YWxpZF9jb250KHB0ZSkpCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIF9fY29udHB0ZV90cnlf dW5mb2xkKG1tLCBhZGRyLCBwdGVwLCBwdGUpOwo+Pj4+ICt9Cj4+Pj4gKwo+Pj4+ICsvKgo+Pj4+ ICsgKiBUaGUgYmVsb3cgZnVuY3Rpb25zIGNvbnN0aXR1dGUgdGhlIHB1YmxpYyBBUEkgdGhhdCBh cm02NCBwcmVzZW50cyB0byB0aGUKPj4+PiArICogY29yZS1tbSB0byBtYW5pcHVsYXRlIFBURSBl bnRyaWVzIHdpdGhpbiB0aGVpciBwYWdlIHRhYmxlcyAob3IgYXQgbGVhc3QKPj4+PiB0aGlzCj4+ Pj4gKyAqIGlzIHRoZSBzdWJzZXQgb2YgdGhlIEFQSSB0aGF0IGFybTY0IG5lZWRzIHRvIGltcGxl bWVudCkuIFRoZXNlIHB1YmxpYwo+Pj4+ICsgKiB2ZXJzaW9ucyB3aWxsIGF1dG9tYXRpY2FsbHkg YW5kIHRyYW5zcGFyZW50bHkgYXBwbHkgdGhlIGNvbnRpZ3VvdXMgYml0Cj4+Pj4gd2hlcmUKPj4+ PiArICogaXQgbWFrZXMgc2Vuc2UgdG8gZG8gc28uIFRoZXJlZm9yZSBhbnkgdXNlcnMgdGhhdCBh cmUgY29udGlnLWF3YXJlIChlLmcuCj4+Pj4gKyAqIGh1Z2V0bGIsIGtlcm5lbCBtYXBwZXIpIHNo b3VsZCBOT1QgdXNlIHRoZXNlIEFQSXMsIGJ1dCBpbnN0ZWFkIHVzZSB0aGUKPj4+PiArICogcHJp dmF0ZSB2ZXJzaW9ucywgd2hpY2ggYXJlIHByZWZpeGVkIHdpdGggZG91YmxlIHVuZGVyc2NvcmUu IEFsbCBvZiB0aGVzZQo+Pj4+ICsgKiBBUElzIGV4Y2VwdCBmb3IgcHRlcF9nZXRfbG9ja2xlc3Mo KSBhcmUgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIHdpdGggdGhlIFBUTAo+Pj4+ICsgKiBoZWxkLgo+ Pj4+ICsgKi8KPj4+PiArCj4+Pj4gKyNkZWZpbmUgcHRlcF9nZXQgcHRlcF9nZXQKPj4+PiArc3Rh dGljIGlubGluZSBwdGVfdCBwdGVwX2dldChwdGVfdCAqcHRlcCkKPj4+PiArewo+Pj4+ICvCoMKg wqAgcHRlX3QgcHRlID0gX19wdGVwX2dldChwdGVwKTsKPj4+PiArCj4+Pj4gK8KgwqDCoCBpZiAo IXB0ZV92YWxpZF9jb250KHB0ZSkpCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBwdGU7Cj4+ Pj4gKwo+Pj4+ICvCoMKgwqAgcmV0dXJuIGNvbnRwdGVfcHRlcF9nZXQocHRlcCwgcHRlKTsKPj4+ PiArfQo+Pj4+ICsKPj4+PiArI2RlZmluZSBwdGVwX2dldF9sb2NrbGVzcyBwdGVwX2dldF9sb2Nr bGVzcwo+Pj4+ICtzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZXBfZ2V0X2xvY2tsZXNzKHB0ZV90ICpw dGVwKQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCBwdGVfdCBwdGUgPSBfX3B0ZXBfZ2V0KHB0ZXApOwo+ Pj4+ICsKPj4+PiArwqDCoMKgIGlmICghcHRlX3ZhbGlkX2NvbnQocHRlKSkKPj4+PiArwqDCoMKg wqDCoMKgwqAgcmV0dXJuIHB0ZTsKPj4+PiArCj4+Pj4gK8KgwqDCoCByZXR1cm4gY29udHB0ZV9w dGVwX2dldF9sb2NrbGVzcyhwdGVwKTsKPj4+PiArfQo+Pj4+ICsKPj4+PiArc3RhdGljIGlubGlu ZSB2b2lkIHNldF9wdGUocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSkKPj4+PiArewo+Pj4+ICvCoMKg wqAgLyoKPj4+PiArwqDCoMKgwqAgKiBXZSBkb24ndCBoYXZlIHRoZSBtbSBvciB2YWRkciBzbyBj YW5ub3QgdW5mb2xkIG9yIGZvbGQgY29udGlnIGVudHJpZXMKPj4+PiArwqDCoMKgwqAgKiAoc2lu Y2UgaXQgcmVxdWlyZXMgdGxiIG1haW50ZW5hbmNlKS4gc2V0X3B0ZSgpIGlzIG5vdCB1c2VkIGlu IGNvcmUKPj4+PiArwqDCoMKgwqAgKiBjb2RlLCBzbyB0aGlzIHNob3VsZCBuZXZlciBldmVuIGJl IGNhbGxlZC4gUmVnYXJkbGVzcyBkbyBvdXIgYmVzdCB0bwo+Pj4+ICvCoMKgwqDCoCAqIHNlcnZp Y2UgYW55IGNhbGwgYW5kIGVtaXQgYSB3YXJuaW5nIGlmIHRoZXJlIGlzIGFueSBhdHRlbXB0IHRv IHNldCBhCj4+Pj4gK8KgwqDCoMKgICogcHRlIG9uIHRvcCBvZiBhbiBleGlzdGluZyBjb250aWcg cmFuZ2UuCj4+Pj4gK8KgwqDCoMKgICovCj4+Pj4gK8KgwqDCoCBwdGVfdCBvcmlnX3B0ZSA9IF9f cHRlcF9nZXQocHRlcCk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgV0FSTl9PTl9PTkNFKHB0ZV92YWxp ZF9jb250KG9yaWdfcHRlKSk7Cj4+Pj4gK8KgwqDCoCBfX3NldF9wdGUocHRlcCwgcHRlX21rbm9u Y29udChwdGUpKTsKPj4+PiArfQo+Pj4+ICsKPj4+PiArI2RlZmluZSBzZXRfcHRlcyBzZXRfcHRl cwo+Pj4+ICtzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3B0ZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0s IHVuc2lnbmVkIGxvbmcgYWRkciwKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUsIHVuc2lnbmVkIGludCBucikKPj4+PiArewo+Pj4+ICvC oMKgwqAgcHRlID0gcHRlX21rbm9uY29udChwdGUpOwo+Pj4+ICsKPj4+PiArwqDCoMKgIGlmIChu ciA9PSAxKSB7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGNvbnRwdGVfdHJ5X3VuZm9sZChtbSwgYWRk ciwgcHRlcCwgX19wdGVwX2dldChwdGVwKSk7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIF9fc2V0X3B0 ZXMobW0sIGFkZHIsIHB0ZXAsIHB0ZSwgMSk7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGNvbnRwdGVf dHJ5X2ZvbGQobW0sIGFkZHIsIHB0ZXAsIHB0ZSk7Cj4+Pj4gK8KgwqDCoCB9IGVsc2UKPj4+PiAr wqDCoMKgwqDCoMKgwqAgY29udHB0ZV9zZXRfcHRlcyhtbSwgYWRkciwgcHRlcCwgcHRlLCBucik7 Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVfY2xlYXIoc3RydWN0 IG1tX3N0cnVjdCAqbW0sCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNp Z25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCBjb250cHRl X3RyeV91bmZvbGQobW0sIGFkZHIsIHB0ZXAsIF9fcHRlcF9nZXQocHRlcCkpOwo+Pj4+ICvCoMKg wqAgX19wdGVfY2xlYXIobW0sIGFkZHIsIHB0ZXApOwo+Pj4+ICt9Cj4+Pj4gKwo+Pj4+ICsjZGVm aW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgo+Pj4+ICtzdGF0aWMgaW5saW5lIHB0 ZV90IHB0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwKPj4+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXAp Cj4+Pj4gK3sKPj4+PiArwqDCoMKgIGNvbnRwdGVfdHJ5X3VuZm9sZChtbSwgYWRkciwgcHRlcCwg X19wdGVwX2dldChwdGVwKSk7Cj4+Pj4gK8KgwqDCoCByZXR1cm4gX19wdGVwX2dldF9hbmRfY2xl YXIobW0sIGFkZHIsIHB0ZXApOwo+Pj4+ICt9Cj4+Pj4gKwo+Pj4+ICsjZGVmaW5lIF9fSEFWRV9B UkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKPj4+PiArc3RhdGljIGlubGluZSBpbnQgcHRl cF90ZXN0X2FuZF9jbGVhcl95b3VuZyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKPj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3Qg KnB0ZXApCj4+Pj4gK3sKPj4+PiArwqDCoMKgIHB0ZV90IG9yaWdfcHRlID0gX19wdGVwX2dldChw dGVwKTsKPj4+PiArCj4+Pj4gK8KgwqDCoCBpZiAoIXB0ZV92YWxpZF9jb250KG9yaWdfcHRlKSkK Pj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIF9fcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyh2 bWEsIGFkZHIsIHB0ZXApOwo+Pj4+ICsKPj4+PiArwqDCoMKgIHJldHVybiBjb250cHRlX3B0ZXBf dGVzdF9hbmRfY2xlYXJfeW91bmcodm1hLCBhZGRyLCBwdGVwKTsKPj4+PiArfQo+Pj4+ICsKPj4+ PiArI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0NMRUFSX1lPVU5HX0ZMVVNICj4+Pj4gK3N0YXRp YyBpbmxpbmUgaW50IHB0ZXBfY2xlYXJfZmx1c2hfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0 ICp2bWEsCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25n IGFkZHIsIHB0ZV90ICpwdGVwKQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCBwdGVfdCBvcmlnX3B0ZSA9 IF9fcHRlcF9nZXQocHRlcCk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgaWYgKCFwdGVfdmFsaWRfY29u dChvcmlnX3B0ZSkpCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBfX3B0ZXBfY2xlYXJfZmx1 c2hfeW91bmcodm1hLCBhZGRyLCBwdGVwKTsKPj4+PiArCj4+Pj4gK8KgwqDCoCByZXR1cm4gY29u dHB0ZV9wdGVwX2NsZWFyX2ZsdXNoX3lvdW5nKHZtYSwgYWRkciwgcHRlcCk7Cj4+Pj4gK30KPj4+ PiArCj4+Pj4gKyNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCj4+Pj4gK3N0 YXRpYyBpbmxpbmUgdm9pZCBwdGVwX3NldF93cnByb3RlY3Qoc3RydWN0IG1tX3N0cnVjdCAqbW0s Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIGFkZHIs IHB0ZV90ICpwdGVwKQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCBjb250cHRlX3RyeV91bmZvbGQobW0s IGFkZHIsIHB0ZXAsIF9fcHRlcF9nZXQocHRlcCkpOwo+Pj4+ICvCoMKgwqAgX19wdGVwX3NldF93 cnByb3RlY3QobW0sIGFkZHIsIHB0ZXApOwo+Pj4+ICvCoMKgwqAgY29udHB0ZV90cnlfZm9sZCht bSwgYWRkciwgcHRlcCwgX19wdGVwX2dldChwdGVwKSk7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gKyNk ZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfQUNDRVNTX0ZMQUdTCj4+Pj4gK3N0YXRpYyBpbmxp bmUgaW50IHB0ZXBfc2V0X2FjY2Vzc19mbGFncyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwK Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgYWRkciwg cHRlX3QgKnB0ZXAsCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwdGVfdCBl bnRyeSwgaW50IGRpcnR5KQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCBwdGVfdCBvcmlnX3B0ZSA9IF9f cHRlcF9nZXQocHRlcCk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgZW50cnkgPSBwdGVfbWtub25jb250 KGVudHJ5KTsKPj4+PiArCj4+Pj4gK8KgwqDCoCBpZiAoIXB0ZV92YWxpZF9jb250KG9yaWdfcHRl KSkKPj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIF9fcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHZt YSwgYWRkciwgcHRlcCwgZW50cnksIGRpcnR5KTsKPj4+PiArCj4+Pj4gK8KgwqDCoCByZXR1cm4g Y29udHB0ZV9wdGVwX3NldF9hY2Nlc3NfZmxhZ3Modm1hLCBhZGRyLCBwdGVwLCBlbnRyeSwgZGly dHkpOwo+Pj4+ICt9Cj4+Pj4gKwo+Pj4+ICsjZWxzZSAvKiBDT05GSUdfQVJNNjRfQ09OVFBURSAq Lwo+Pj4+ICsKPj4+PiDCoMKgICNkZWZpbmUgcHRlcF9nZXTCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgX19wdGVwX2dldAo+Pj4+IMKgwqAgI2RlZmluZSBzZXRfcHRlwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgX19zZXRfcHRlCj4+Pj4gwqDCoCAjZGVmaW5lIHNl dF9wdGVzwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIF9fc2V0X3B0ZXMKPj4+PiBAQCAt MTEzMSw2ICsxMzEzLDggQEAgZXh0ZXJuIHZvaWQgcHRlcF9tb2RpZnlfcHJvdF9jb21taXQoc3Ry dWN0Cj4+Pj4gdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKPj4+PiDCoMKgICNkZWZpbmUgX19IQVZFX0FS Q0hfUFRFUF9TRVRfQUNDRVNTX0ZMQUdTCj4+Pj4gwqDCoCAjZGVmaW5lIHB0ZXBfc2V0X2FjY2Vz c19mbGFnc8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgX19wdGVwX3NldF9hY2Nlc3NfZmxhZ3MKPj4+ PiDCoMKgICsjZW5kaWYgLyogQ09ORklHX0FSTTY0X0NPTlRQVEUgKi8KPj4+PiArCj4+Pj4gwqDC oCAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwo+Pj4+IMKgwqAgwqAgI2VuZGlmIC8qIF9fQVNN X1BHVEFCTEVfSCAqLwo+Pj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL01ha2VmaWxlIGIv YXJjaC9hcm02NC9tbS9NYWtlZmlsZQo+Pj4+IGluZGV4IGRiZDFiYzk1OTY3ZC4uNjA0NTQyNTY5 NDViIDEwMDY0NAo+Pj4+IC0tLSBhL2FyY2gvYXJtNjQvbW0vTWFrZWZpbGUKPj4+PiArKysgYi9h cmNoL2FybTY0L21tL01ha2VmaWxlCj4+Pj4gQEAgLTMsNiArMyw3IEBAIG9iai15wqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIDo9IGRtYS1tYXBwaW5nLm8gZXh0YWJsZS5vIGZhdWx0Lm8K Pj4+PiBpbml0Lm8gXAo+Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBjYWNoZS5vIGNvcHlwYWdlLm8gZmx1c2gubyBcCj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlvcmVtYXAubyBtbWFwLm8gcGdkLm8gbW11Lm8gXAo+ Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250ZXh0Lm8g cHJvYy5vIHBhZ2VhdHRyLm8gZml4bWFwLm8KPj4+PiArb2JqLSQoQ09ORklHX0FSTTY0X0NPTlRQ VEUpwqDCoMKgICs9IGNvbnRwdGUubwo+Pj4+IMKgwqAgb2JqLSQoQ09ORklHX0hVR0VUTEJfUEFH RSnCoMKgwqAgKz0gaHVnZXRsYnBhZ2Uubwo+Pj4+IMKgwqAgb2JqLSQoQ09ORklHX1BURFVNUF9D T1JFKcKgwqDCoCArPSBwdGR1bXAubwo+Pj4+IMKgwqAgb2JqLSQoQ09ORklHX1BURFVNUF9ERUJV R0ZTKcKgwqDCoCArPSBwdGR1bXBfZGVidWdmcy5vCj4+Pj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJt NjQvbW0vY29udHB0ZS5jIGIvYXJjaC9hcm02NC9tbS9jb250cHRlLmMKPj4+PiBuZXcgZmlsZSBt b2RlIDEwMDY0NAo+Pj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uNjljMzY3NDlkZDk4Cj4+Pj4gLS0t IC9kZXYvbnVsbAo+Pj4+ICsrKyBiL2FyY2gvYXJtNjQvbW0vY29udHB0ZS5jCj4+Pj4gQEAgLTAs MCArMSwzODggQEAKPj4+PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25s eQo+Pj4+ICsvKgo+Pj4+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMjMgQVJNIEx0ZC4KPj4+PiArICov Cj4+Pj4gKwo+Pj4+ICsjaW5jbHVkZSA8bGludXgvbW0uaD4KPj4+PiArI2luY2x1ZGUgPGxpbnV4 L2V4cG9ydC5oPgo+Pj4+ICsjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+Cj4+Pj4gKwo+Pj4+ICtz dGF0aWMgaW5saW5lIGJvb2wgbW1faXNfdXNlcihzdHJ1Y3QgbW1fc3RydWN0ICptbSkKPj4+PiAr ewo+Pj4+ICvCoMKgwqAgLyoKPj4+PiArwqDCoMKgwqAgKiBEb24ndCBhdHRlbXB0IHRvIGFwcGx5 IHRoZSBjb250aWcgYml0IHRvIGtlcm5lbCBtYXBwaW5ncywgYmVjYXVzZQo+Pj4+ICvCoMKgwqDC oCAqIGR5bmFtaWNhbGx5IGFkZGluZy9yZW1vdmluZyB0aGUgY29udGlnIGJpdCBjYW4gY2F1c2Ug cGFnZSBmYXVsdHMuCj4+Pj4gK8KgwqDCoMKgICogVGhlc2UgcmFjaW5nIGZhdWx0cyBhcmUgb2sg Zm9yIHVzZXIgc3BhY2UsIHNpbmNlIHRoZXkgZ2V0IHNlcmlhbGl6ZWQKPj4+PiArwqDCoMKgwqAg KiBvbiB0aGUgUFRMLiBCdXQga2VybmVsIG1hcHBpbmdzIGNhbid0IHRvbGVyYXRlIGZhdWx0cy4K Pj4+PiArwqDCoMKgwqAgKi8KPj4+PiArwqDCoMKgIHJldHVybiBtbSAhPSAmaW5pdF9tbTsKPj4+ PiArfQo+Pj4+ICsKPj4+PiArc3RhdGljIGlubGluZSBwdGVfdCAqY29udHB0ZV9hbGlnbl9kb3du KHB0ZV90ICpwdGVwKQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCByZXR1cm4gKHB0ZV90ICopKEFMSUdO X0RPV04oKHVuc2lnbmVkIGxvbmcpcHRlcCA+PiAzLCBDT05UX1BURVMpIDw8IDMpOwo+Pj4+ICt9 Cj4+Pj4gKwo+Pj4+ICtzdGF0aWMgdm9pZCBwdGVwX2NsZWFyX2ZsdXNoX3JhbmdlKHN0cnVjdCBt bV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBwdGVfdCAqcHRlcCwgaW50IG5yKQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCBz dHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3Qgdm1hID0gVExCX0ZMVVNIX1ZNQShtbSwgMCk7Cj4+Pj4gK8Kg wqDCoCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIgPSBhZGRyOwo+Pj4+ICvCoMKgwqAgaW50IGk7 Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IG5yOyBpKyssIHB0ZXArKywgYWRk ciArPSBQQUdFX1NJWkUpCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIF9fcHRlX2NsZWFyKG1tLCBhZGRy LCBwdGVwKTsKPj4+PiArCj4+Pj4gK8KgwqDCoCBfX2ZsdXNoX3RsYl9yYW5nZSgmdm1hLCBzdGFy dF9hZGRyLCBhZGRyLCBQQUdFX1NJWkUsIHRydWUsIDMpOwo+Pj4+ICt9Cj4+Pj4gKwo+Pj4+ICtz dGF0aWMgYm9vbCBwdGVwX2FueV92YWxpZChwdGVfdCAqcHRlcCwgaW50IG5yKQo+Pj4+ICt7Cj4+ Pj4gK8KgwqDCoCBpbnQgaTsKPj4+PiArCj4+Pj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgbnI7 IGkrKywgcHRlcCsrKSB7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChwdGVfdmFsaWQoX19wdGVw X2dldChwdGVwKSkpCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHRydWU7Cj4+ Pj4gK8KgwqDCoCB9Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgcmV0dXJuIGZhbHNlOwo+Pj4+ICt9Cj4+ Pj4gKwo+Pj4+ICtzdGF0aWMgdm9pZCBjb250cHRlX2NvbnZlcnQoc3RydWN0IG1tX3N0cnVjdCAq bW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUpCj4+Pj4gK3sKPj4+PiArwqDCoMKgIHN0cnVjdCB2 bV9hcmVhX3N0cnVjdCB2bWEgPSBUTEJfRkxVU0hfVk1BKG1tLCAwKTsKPj4+PiArwqDCoMKgIHVu c2lnbmVkIGxvbmcgc3RhcnRfYWRkcjsKPj4+PiArwqDCoMKgIHB0ZV90ICpzdGFydF9wdGVwOwo+ Pj4+ICvCoMKgwqAgaW50IGk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgc3RhcnRfcHRlcCA9IHB0ZXAg PSBjb250cHRlX2FsaWduX2Rvd24ocHRlcCk7Cj4+Pj4gK8KgwqDCoCBzdGFydF9hZGRyID0gYWRk ciA9IEFMSUdOX0RPV04oYWRkciwgQ09OVF9QVEVfU0laRSk7Cj4+Pj4gK8KgwqDCoCBwdGUgPSBw Zm5fcHRlKEFMSUdOX0RPV04ocHRlX3BmbihwdGUpLCBDT05UX1BURVMpLCBwdGVfcGdwcm90KHB0 ZSkpOwo+Pj4+ICsKPj4+PiArwqDCoMKgIGZvciAoaSA9IDA7IGkgPCBDT05UX1BURVM7IGkrKywg cHRlcCsrLCBhZGRyICs9IFBBR0VfU0laRSkgewo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBwdGVfdCBw dGVudCA9IF9fcHRlcF9nZXRfYW5kX2NsZWFyKG1tLCBhZGRyLCBwdGVwKTsKPj4+PiArCj4+Pj4g K8KgwqDCoMKgwqDCoMKgIGlmIChwdGVfZGlydHkocHRlbnQpKQo+Pj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHB0ZSA9IHB0ZV9ta2RpcnR5KHB0ZSk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqDCoMKg wqDCoCBpZiAocHRlX3lvdW5nKHB0ZW50KSkKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBw dGUgPSBwdGVfbWt5b3VuZyhwdGUpOwo+Pj4+ICvCoMKgwqAgfQo+Pj4+ICsKPj4+PiArwqDCoMKg IF9fZmx1c2hfdGxiX3JhbmdlKCZ2bWEsIHN0YXJ0X2FkZHIsIGFkZHIsIFBBR0VfU0laRSwgdHJ1 ZSwgMyk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgX19zZXRfcHRlcyhtbSwgc3RhcnRfYWRkciwgc3Rh cnRfcHRlcCwgcHRlLCBDT05UX1BURVMpOwo+Pj4+ICt9Cj4+Pj4gKwo+Pj4+ICt2b2lkIF9fY29u dHB0ZV90cnlfZm9sZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAo+ Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUpCj4+Pj4g K3sKPj4+PiArwqDCoMKgIC8qCj4+Pj4gK8KgwqDCoMKgICogV2UgaGF2ZSBhbHJlYWR5IGNoZWNr ZWQgdGhhdCB0aGUgdmlydHVhbCBhbmQgcHlzaWNhbCBhZGRyZXNzZXMgYXJlCj4+Pj4gK8KgwqDC oMKgICogY29ycmVjdGx5IGFsaWduZWQgZm9yIGEgY29udHB0ZSBtYXBwaW5nIGluIGNvbnRwdGVf dHJ5X2ZvbGQoKSBzbyB0aGUKPj4+PiArwqDCoMKgwqAgKiByZW1haW5pbmcgY2hlY2tzIGFyZSB0 byBlbnN1cmUgdGhhdCB0aGUgY29udHB0ZSByYW5nZSBpcyBmdWxseQo+Pj4+ICvCoMKgwqDCoCAq IGNvdmVyZWQgYnkgYSBzaW5nbGUgZm9saW8sIGFuZCBlbnN1cmUgdGhhdCBhbGwgdGhlIHB0ZXMg YXJlIHZhbGlkCj4+Pj4gK8KgwqDCoMKgICogd2l0aCBjb250aWd1b3VzIFBGTnMgYW5kIG1hdGNo aW5nIHByb3RzLiBXZSBpZ25vcmUgdGhlIHN0YXRlIG9mIHRoZQo+Pj4+ICvCoMKgwqDCoCAqIGFj Y2VzcyBhbmQgZGlydHkgYml0cyBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjaWRpbmcgaWYgaXRzIGEg Y29udGlndW91cwo+Pj4+ICvCoMKgwqDCoCAqIHJhbmdlOyB0aGUgZm9sZGluZyBwcm9jZXNzIHdp bGwgZ2VuZXJhdGUgYSBzaW5nbGUgY29udHB0ZSBlbnRyeSB3aGljaAo+Pj4+ICvCoMKgwqDCoCAq IGhhcyBhIHNpbmdsZSBhY2Nlc3MgYW5kIGRpcnR5IGJpdC4gVGhvc2UgMiBiaXRzIGFyZSB0aGUg bG9naWNhbCBPUiBvZgo+Pj4+ICvCoMKgwqDCoCAqIHRoZWlyIHJlc3BlY3RpdmUgYml0cyBpbiB0 aGUgY29uc3RpdHVlbnQgcHRlIGVudHJpZXMuIEluIG9yZGVyIHRvCj4+Pj4gK8KgwqDCoMKgICog ZW5zdXJlIHRoZSBjb250cHRlIHJhbmdlIGlzIGNvdmVyZWQgYnkgYSBzaW5nbGUgZm9saW8sIHdl IG11c3QKPj4+PiArwqDCoMKgwqAgKiByZWNvdmVyIHRoZSBmb2xpbyBmcm9tIHRoZSBwZm4sIGJ1 dCBzcGVjaWFsIG1hcHBpbmdzIGRvbid0IGhhdmUgYQo+Pj4+ICvCoMKgwqDCoCAqIGZvbGlvIGJh Y2tpbmcgdGhlbS4gRm9ydHVuYXRlbHkgY29udHB0ZV90cnlfZm9sZCgpIGFscmVhZHkgY2hlY2tl ZAo+Pj4+ICvCoMKgwqDCoCAqIHRoYXQgdGhlIHB0ZSBpcyBub3Qgc3BlY2lhbCAtIHdlIG5ldmVy IHRyeSB0byBmb2xkIHNwZWNpYWwgbWFwcGluZ3MuCj4+Pj4gK8KgwqDCoMKgICogTm90ZSB3ZSBj YW4ndCB1c2Ugdm1fbm9ybWFsX3BhZ2UoKSBmb3IgdGhpcyBzaW5jZSB3ZSBkb24ndCBoYXZlIHRo ZQo+Pj4+ICvCoMKgwqDCoCAqIHZtYS4KPj4+PiArwqDCoMKgwqAgKi8KPj4+PiArCj4+Pj4gK8Kg wqDCoCB1bnNpZ25lZCBsb25nIGZvbGlvX3NhZGRyOwo+Pj4+ICvCoMKgwqAgdW5zaWduZWQgbG9u ZyBmb2xpb19lYWRkcjsKPj4+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgY29udF9zYWRkcjsKPj4+ PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgY29udF9lYWRkcjsKPj4+PiArwqDCoMKgIHN0cnVjdCBm b2xpbyAqZm9saW87Cj4+Pj4gK8KgwqDCoCBzdHJ1Y3QgcGFnZSAqcGFnZTsKPj4+PiArwqDCoMKg IHVuc2lnbmVkIGxvbmcgcGZuOwo+Pj4+ICvCoMKgwqAgcHRlX3QgKm9yaWdfcHRlcDsKPj4+PiAr wqDCoMKgIHBncHJvdF90IHByb3Q7Cj4+Pj4gK8KgwqDCoCBwdGVfdCBzdWJwdGU7Cj4+Pj4gK8Kg wqDCoCBpbnQgaTsKPj4+PiArCj4+Pj4gK8KgwqDCoCBpZiAoIW1tX2lzX3VzZXIobW0pKQo+Pj4+ ICvCoMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgcGFnZSA9IHB0ZV9w YWdlKHB0ZSk7Cj4+Pj4gK8KgwqDCoCBmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7Cj4+Pj4gK8Kg wqDCoCBmb2xpb19zYWRkciA9IGFkZHIgLSAocGFnZSAtICZmb2xpby0+cGFnZSkgKiBQQUdFX1NJ WkU7Cj4+Pj4gK8KgwqDCoCBmb2xpb19lYWRkciA9IGZvbGlvX3NhZGRyICsgZm9saW9fbnJfcGFn ZXMoZm9saW8pICogUEFHRV9TSVpFOwo+Pj4+ICvCoMKgwqAgY29udF9zYWRkciA9IEFMSUdOX0RP V04oYWRkciwgQ09OVF9QVEVfU0laRSk7Cj4+Pj4gK8KgwqDCoCBjb250X2VhZGRyID0gY29udF9z YWRkciArIENPTlRfUFRFX1NJWkU7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgaWYgKGZvbGlvX3NhZGRy ID4gY29udF9zYWRkciB8fCBmb2xpb19lYWRkciA8IGNvbnRfZWFkZHIpCj4+Pj4gK8KgwqDCoMKg wqDCoMKgIHJldHVybjsKPj4+PiArCj4+Pj4gK8KgwqDCoCBwZm4gPSBwdGVfcGZuKHB0ZSkgLSAo KGFkZHIgLSBjb250X3NhZGRyKSA+PiBQQUdFX1NISUZUKTsKPj4+PiArwqDCoMKgIHByb3QgPSBw dGVfcGdwcm90KHB0ZV9ta29sZChwdGVfbWtjbGVhbihwdGUpKSk7Cj4+Pj4gK8KgwqDCoCBvcmln X3B0ZXAgPSBwdGVwOwo+Pj4+ICvCoMKgwqAgcHRlcCA9IGNvbnRwdGVfYWxpZ25fZG93bihwdGVw KTsKPj4+PiArCj4+Pj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgQ09OVF9QVEVTOyBpKyssIHB0 ZXArKywgcGZuKyspIHsKPj4+PiArwqDCoMKgwqDCoMKgwqAgc3VicHRlID0gX19wdGVwX2dldChw dGVwKTsKPj4+PiArwqDCoMKgwqDCoMKgwqAgc3VicHRlID0gcHRlX21rb2xkKHB0ZV9ta2NsZWFu KHN1YnB0ZSkpOwo+Pj4+ICsKPj4+PiArwqDCoMKgwqDCoMKgwqAgaWYgKCFwdGVfdmFsaWQoc3Vi cHRlKSB8fAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHB0ZV9wZm4oc3VicHRlKSAhPSBw Zm4gfHwKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwZ3Byb3RfdmFsKHB0ZV9wZ3Byb3Qo c3VicHRlKSkgIT0gcGdwcm90X3ZhbChwcm90KSkKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCByZXR1cm47Cj4+Pj4gK8KgwqDCoCB9Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgcHRlID0gcHRlX21r Y29udChwdGUpOwo+Pj4+ICvCoMKgwqAgY29udHB0ZV9jb252ZXJ0KG1tLCBhZGRyLCBvcmlnX3B0 ZXAsIHB0ZSk7Cj4+Pj4gK30KPj4+PiArRVhQT1JUX1NZTUJPTChfX2NvbnRwdGVfdHJ5X2ZvbGQp Owo+Pj4+ICsKPj4+PiArdm9pZCBfX2NvbnRwdGVfdHJ5X3VuZm9sZChzdHJ1Y3QgbW1fc3RydWN0 ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHB0 ZV90ICpwdGVwLCBwdGVfdCBwdGUpCj4+Pj4gK3sKPj4+PiArwqDCoMKgIC8qCj4+Pj4gK8KgwqDC oMKgICogV2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGUgcHRlcyBhcmUgY29udGlndW91 cyBpbgo+Pj4+ICvCoMKgwqDCoCAqIGNvbnRwdGVfdHJ5X3VuZm9sZCgpLCBzbyBqdXN0IGNoZWNr IHRoYXQgdGhlIG1tIGlzIHVzZXIgc3BhY2UuCj4+Pj4gK8KgwqDCoMKgICovCj4+Pj4gKwo+Pj4+ ICvCoMKgwqAgaWYgKCFtbV9pc191c2VyKG1tKSkKPj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJu Owo+Pj4+ICsKPj4+PiArwqDCoMKgIHB0ZSA9IHB0ZV9ta25vbmNvbnQocHRlKTsKPj4+PiArwqDC oMKgIGNvbnRwdGVfY29udmVydChtbSwgYWRkciwgcHRlcCwgcHRlKTsKPj4+PiArfQo+Pj4+ICtF WFBPUlRfU1lNQk9MKF9fY29udHB0ZV90cnlfdW5mb2xkKTsKPj4+PiArCj4+Pj4gK3B0ZV90IGNv bnRwdGVfcHRlcF9nZXQocHRlX3QgKnB0ZXAsIHB0ZV90IG9yaWdfcHRlKQo+Pj4+ICt7Cj4+Pj4g K8KgwqDCoCAvKgo+Pj4+ICvCoMKgwqDCoCAqIEdhdGhlciBhY2Nlc3MvZGlydHkgYml0cywgd2hp Y2ggbWF5IGJlIHBvcHVsYXRlZCBpbiBhbnkgb2YgdGhlIHB0ZXMKPj4+PiArwqDCoMKgwqAgKiBv ZiB0aGUgY29udGlnIHJhbmdlLiBXZSBhcmUgZ3VhcnJhbnRlZWQgdG8gYmUgaG9sZGluZyB0aGUg UFRMLCBzbyBhbnkKPj4+PiArwqDCoMKgwqAgKiBjb250aWd1b3VzIHJhbmdlIGNhbm5vdCBiZSB1 bmZvbGRlZCBvciBvdGhlcndpc2UgbW9kaWZpZWQgdW5kZXIgb3VyCj4+Pj4gK8KgwqDCoMKgICog ZmVldC4KPj4+PiArwqDCoMKgwqAgKi8KPj4+PiArCj4+Pj4gK8KgwqDCoCBwdGVfdCBwdGU7Cj4+ Pj4gK8KgwqDCoCBpbnQgaTsKPj4+PiArCj4+Pj4gK8KgwqDCoCBwdGVwID0gY29udHB0ZV9hbGln bl9kb3duKHB0ZXApOwo+Pj4+ICsKPj4+PiArwqDCoMKgIGZvciAoaSA9IDA7IGkgPCBDT05UX1BU RVM7IGkrKywgcHRlcCsrKSB7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHB0ZSA9IF9fcHRlcF9nZXQo cHRlcCk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAocHRlX2RpcnR5KHB0ZSkpCj4+ Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgb3JpZ19wdGUgPSBwdGVfbWtkaXJ0eShvcmlnX3B0 ZSk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAocHRlX3lvdW5nKHB0ZSkpCj4+Pj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgb3JpZ19wdGUgPSBwdGVfbWt5b3VuZyhvcmlnX3B0ZSk7 Cj4+Pj4gK8KgwqDCoCB9Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgcmV0dXJuIG9yaWdfcHRlOwo+Pj4+ ICt9Cj4+Pj4gK0VYUE9SVF9TWU1CT0woY29udHB0ZV9wdGVwX2dldCk7Cj4+Pj4gKwo+Pj4+ICtw dGVfdCBjb250cHRlX3B0ZXBfZ2V0X2xvY2tsZXNzKHB0ZV90ICpvcmlnX3B0ZXApCj4+Pj4gK3sK Pj4+PiArwqDCoMKgIC8qCj4+Pj4gK8KgwqDCoMKgICogR2F0aGVyIGFjY2Vzcy9kaXJ0eSBiaXRz LCB3aGljaCBtYXkgYmUgcG9wdWxhdGVkIGluIGFueSBvZiB0aGUgcHRlcwo+Pj4+ICvCoMKgwqDC oCAqIG9mIHRoZSBjb250aWcgcmFuZ2UuIFdlIG1heSBub3QgYmUgaG9sZGluZyB0aGUgUFRMLCBz byBhbnkgY29udGlndW91cwo+Pj4+ICvCoMKgwqDCoCAqIHJhbmdlIG1heSBiZSB1bmZvbGRlZC9t b2RpZmllZC9yZWZvbGRlZCB1bmRlciBvdXIgZmVldC4gVGhlcmVmb3JlIHdlCj4+Pj4gK8KgwqDC oMKgICogZW5zdXJlIHdlIHJlYWQgYSBfY29uc2lzdGVudF8gY29udHB0ZSByYW5nZSBieSBjaGVj a2luZyB0aGF0IGFsbCBwdGVzCj4+Pj4gK8KgwqDCoMKgICogaW4gdGhlIHJhbmdlIGFyZSB2YWxp ZCBhbmQgaGF2ZSBDT05UX1BURSBzZXQsIHRoYXQgYWxsIHBmbnMgYXJlCj4+Pj4gK8KgwqDCoMKg ICogY29udGlndW91cyBhbmQgdGhhdCBhbGwgcGdwcm90cyBhcmUgdGhlIHNhbWUgKGlnbm9yaW5n IGFjY2Vzcy9kaXJ0eSkuCj4+Pj4gK8KgwqDCoMKgICogSWYgd2UgZmluZCBhIHB0ZSB0aGF0IGlz IG5vdCBjb25zaXN0ZW50LCB0aGVuIHdlIG11c3QgYmUgcmFjaW5nIHdpdGgKPj4+PiArwqDCoMKg wqAgKiBhbiB1cGRhdGUgc28gc3RhcnQgYWdhaW4uIElmIHRoZSB0YXJnZXQgcHRlIGRvZXMgbm90 IGhhdmUgQ09OVF9QVEUKPj4+PiArwqDCoMKgwqAgKiBzZXQgdGhlbiB0aGF0IGlzIGNvbnNpZGVy ZWQgY29uc2lzdGVudCBvbiBpdHMgb3duIGJlY2F1c2UgaXQgaXMgbm90Cj4+Pj4gK8KgwqDCoMKg ICogcGFydCBvZiBhIGNvbnRwdGUgcmFuZ2UuCj4+Pj4gK8KgwqDCoMKgICovCj4+Pj4gKwo+Pj4+ ICvCoMKgwqAgcGdwcm90X3Qgb3JpZ19wcm90Owo+Pj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyBw Zm47Cj4+Pj4gK8KgwqDCoCBwdGVfdCBvcmlnX3B0ZTsKPj4+PiArwqDCoMKgIHBncHJvdF90IHBy b3Q7Cj4+Pj4gK8KgwqDCoCBwdGVfdCAqcHRlcDsKPj4+PiArwqDCoMKgIHB0ZV90IHB0ZTsKPj4+ PiArwqDCoMKgIGludCBpOwo+Pj4+ICsKPj4+PiArcmV0cnk6Cj4+Pj4gK8KgwqDCoCBvcmlnX3B0 ZSA9IF9fcHRlcF9nZXQob3JpZ19wdGVwKTsKPj4+PiArCj4+Pj4gK8KgwqDCoCBpZiAoIXB0ZV92 YWxpZF9jb250KG9yaWdfcHRlKSkKPj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIG9yaWdfcHRl Owo+Pj4+ICsKPj4+PiArwqDCoMKgIG9yaWdfcHJvdCA9IHB0ZV9wZ3Byb3QocHRlX21rb2xkKHB0 ZV9ta2NsZWFuKG9yaWdfcHRlKSkpOwo+Pj4+ICvCoMKgwqAgcHRlcCA9IGNvbnRwdGVfYWxpZ25f ZG93bihvcmlnX3B0ZXApOwo+Pj4+ICvCoMKgwqAgcGZuID0gcHRlX3BmbihvcmlnX3B0ZSkgLSAo b3JpZ19wdGVwIC0gcHRlcCk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IENP TlRfUFRFUzsgaSsrLCBwdGVwKyssIHBmbisrKSB7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHB0ZSA9 IF9fcHRlcF9nZXQocHRlcCk7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHByb3QgPSBwdGVfcGdwcm90 KHB0ZV9ta29sZChwdGVfbWtjbGVhbihwdGUpKSk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqDCoMKgwqDC oCBpZiAoIXB0ZV92YWxpZF9jb250KHB0ZSkgfHwKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqAg cHRlX3BmbihwdGUpICE9IHBmbiB8fAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCBwZ3Byb3Rf dmFsKHByb3QpICE9IHBncHJvdF92YWwob3JpZ19wcm90KSkKPj4+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBnb3RvIHJldHJ5Owo+Pj4+ICsKPj4+PiArwqDCoMKgwqDCoMKgwqAgaWYgKHB0ZV9k aXJ0eShwdGUpKQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG9yaWdfcHRlID0gcHRlX21r ZGlydHkob3JpZ19wdGUpOwo+Pj4+ICsKPj4+PiArwqDCoMKgwqDCoMKgwqAgaWYgKHB0ZV95b3Vu ZyhwdGUpKQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG9yaWdfcHRlID0gcHRlX21reW91 bmcob3JpZ19wdGUpOwo+Pj4+ICvCoMKgwqAgfQo+Pj4+ICsKPj4+PiArwqDCoMKgIHJldHVybiBv cmlnX3B0ZTsKPj4+PiArfQo+Pj4+ICtFWFBPUlRfU1lNQk9MKGNvbnRwdGVfcHRlcF9nZXRfbG9j a2xlc3MpOwo+Pj4+ICsKPj4+PiArdm9pZCBjb250cHRlX3NldF9wdGVzKHN0cnVjdCBtbV9zdHJ1 Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUsIHVuc2lnbmVkIGludCBucikK Pj4+PiArewo+Pj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyBuZXh0Owo+Pj4+ICvCoMKgwqAgdW5z aWduZWQgbG9uZyBlbmQ7Cj4+Pj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIHBmbjsKPj4+PiArwqDC oMKgIHBncHJvdF90IHByb3Q7Cj4+Pj4gK8KgwqDCoCBwdGVfdCBvcmlnX3B0ZTsKPj4+PiArCj4+ Pj4gK8KgwqDCoCBpZiAoIW1tX2lzX3VzZXIobW0pKQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1 cm4gX19zZXRfcHRlcyhtbSwgYWRkciwgcHRlcCwgcHRlLCBucik7Cj4+Pj4gKwo+Pj4+ICvCoMKg wqAgZW5kID0gYWRkciArIChuciA8PCBQQUdFX1NISUZUKTsKPj4+PiArwqDCoMKgIHBmbiA9IHB0 ZV9wZm4ocHRlKTsKPj4+PiArwqDCoMKgIHByb3QgPSBwdGVfcGdwcm90KHB0ZSk7Cj4+Pj4gKwo+ Pj4+ICvCoMKgwqAgZG8gewo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBuZXh0ID0gcHRlX2NvbnRfYWRk cl9lbmQoYWRkciwgZW5kKTsKPj4+PiArwqDCoMKgwqDCoMKgwqAgbnIgPSAobmV4dCAtIGFkZHIp ID4+IFBBR0VfU0hJRlQ7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHB0ZSA9IHBmbl9wdGUocGZuLCBw cm90KTsKPj4+PiArCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmICgoKGFkZHIgfCBuZXh0IHwgKHBm biA8PCBQQUdFX1NISUZUKSkgJiB+Q09OVF9QVEVfTUFTSykgPT0gMCkKPj4+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBwdGUgPSBwdGVfbWtjb250KHB0ZSk7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKg IGVsc2UKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwdGUgPSBwdGVfbWtub25jb250KHB0 ZSk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqDCoMKgwqDCoCAvKgo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKg ICogSWYgb3BlcmF0aW5nIG9uIGEgcGFydGlhbCBjb250aWd1b3VzIHJhbmdlIHRoZW4gd2UgbXVz dCBmaXJzdAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgICogdW5mb2xkIHRoZSBjb250aWd1b3VzIHJh bmdlIGlmIGl0IHdhcyBwcmV2aW91c2x5IGZvbGRlZC4KPj4+PiArwqDCoMKgwqDCoMKgwqDCoCAq IE90aGVyd2lzZSB3ZSBjb3VsZCBlbmQgdXAgd2l0aCBvdmVybGFwcGluZyB0bGIgZW50cmllcy4K Pj4+PiArwqDCoMKgwqDCoMKgwqDCoCAqLwo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAobnIgIT0g Q09OVF9QVEVTKQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnRwdGVfdHJ5X3VuZm9s ZChtbSwgYWRkciwgcHRlcCwgX19wdGVwX2dldChwdGVwKSk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqDC oMKgwqDCoCAvKgo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgICogSWYgd2UgYXJlIHJlcGxhY2luZyBw dGVzIHRoYXQgd2VyZSBjb250aWd1b3VzIG9yIGlmIHRoZSBuZXcKPj4+PiArwqDCoMKgwqDCoMKg wqDCoCAqIHB0ZXMgYXJlIGNvbnRpZ3VvdXMgYW5kIGFueSBvZiB0aGUgcHRlcyBiZWluZyByZXBs YWNlZCBhcmUKPj4+PiArwqDCoMKgwqDCoMKgwqDCoCAqIHZhbGlkLCB3ZSBuZWVkIHRvIGNsZWFy IGFuZCBmbHVzaCB0aGUgcmFuZ2UgdG8gcHJldmVudAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgICog b3ZlcmxhcHBpbmcgdGxiIGVudHJpZXMuCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqAgKi8KPj4+PiAr wqDCoMKgwqDCoMKgwqAgb3JpZ19wdGUgPSBfX3B0ZXBfZ2V0KHB0ZXApOwo+Pj4+ICvCoMKgwqDC oMKgwqDCoCBpZiAocHRlX3ZhbGlkX2NvbnQob3JpZ19wdGUpIHx8Cj4+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgKHB0ZV9jb250KHB0ZSkgJiYgcHRlcF9hbnlfdmFsaWQocHRlcCwgbnIpKSkK Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwdGVwX2NsZWFyX2ZsdXNoX3JhbmdlKG1tLCBh ZGRyLCBwdGVwLCBucik7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBfX3NldF9wdGVzKG1t LCBhZGRyLCBwdGVwLCBwdGUsIG5yKTsKPj4+PiArCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGFkZHIg PSBuZXh0Owo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBwdGVwICs9IG5yOwo+Pj4+ICvCoMKgwqDCoMKg wqDCoCBwZm4gKz0gbnI7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgfSB3aGlsZSAoYWRkciAhPSBlbmQp Owo+Pj4+ICt9Cj4+Pj4gK0VYUE9SVF9TWU1CT0woY29udHB0ZV9zZXRfcHRlcyk7Cj4+Pj4gKwo+ Pj4+ICtpbnQgY29udHB0ZV9wdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHN0cnVjdCB2bV9hcmVh X3N0cnVjdCAqdm1hLAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCAv Kgo+Pj4+ICvCoMKgwqDCoCAqIHB0ZXBfY2xlYXJfZmx1c2hfeW91bmcoKSB0ZWNobmljYWxseSBy ZXF1aXJlcyB1cyB0byBjbGVhciB0aGUgYWNjZXNzCj4+Pj4gK8KgwqDCoMKgICogZmxhZyBmb3Ig YSBfc2luZ2xlXyBwdGUuIEhvd2V2ZXIsIHRoZSBjb3JlLW1tIGNvZGUgYWN0dWFsbHkgdHJhY2tz Cj4+Pj4gK8KgwqDCoMKgICogYWNjZXNzL2RpcnR5IHBlciBmb2xpbywgbm90IHBlciBwYWdlLiBB bmQgc2luY2Ugd2Ugb25seSBjcmVhdGUgYQo+Pj4+ICvCoMKgwqDCoCAqIGNvbnRpZyByYW5nZSB3 aGVuIHRoZSByYW5nZSBpcyBjb3ZlcmVkIGJ5IGEgc2luZ2xlIGZvbGlvLCB3ZSBjYW4gZ2V0Cj4+ Pj4gK8KgwqDCoMKgICogYXdheSB3aXRoIGNsZWFyaW5nIHlvdW5nIGZvciB0aGUgd2hvbGUgY29u dGlnIHJhbmdlIGhlcmUsIHNvIHdlIGF2b2lkCj4+Pj4gK8KgwqDCoMKgICogaGF2aW5nIHRvIHVu Zm9sZC4KPj4+PiArwqDCoMKgwqAgKi8KPj4+PiArCj4+Pj4gK8KgwqDCoCBpbnQgeW91bmcgPSAw Owo+Pj4+ICvCoMKgwqAgaW50IGk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgcHRlcCA9IGNvbnRwdGVf YWxpZ25fZG93bihwdGVwKTsKPj4+PiArwqDCoMKgIGFkZHIgPSBBTElHTl9ET1dOKGFkZHIsIENP TlRfUFRFX1NJWkUpOwo+Pj4+ICsKPj4+PiArwqDCoMKgIGZvciAoaSA9IDA7IGkgPCBDT05UX1BU RVM7IGkrKywgcHRlcCsrLCBhZGRyICs9IFBBR0VfU0laRSkKPj4+PiArwqDCoMKgwqDCoMKgwqAg eW91bmcgfD0gX19wdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHZtYSwgYWRkciwgcHRlcCk7Cj4+ Pj4gKwo+Pj4+ICvCoMKgwqAgcmV0dXJuIHlvdW5nOwo+Pj4+ICt9Cj4+Pj4gK0VYUE9SVF9TWU1C T0woY29udHB0ZV9wdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKTsKPj4+PiArCj4+Pj4gK2ludCBj b250cHRlX3B0ZXBfY2xlYXJfZmx1c2hfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEs Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxv bmcgYWRkciwgcHRlX3QgKnB0ZXApCj4+Pj4gK3sKPj4+PiArwqDCoMKgIGludCB5b3VuZzsKPj4+ PiArCj4+Pj4gK8KgwqDCoCB5b3VuZyA9IGNvbnRwdGVfcHRlcF90ZXN0X2FuZF9jbGVhcl95b3Vu Zyh2bWEsIGFkZHIsIHB0ZXApOwo+Pj4+ICsKPj4+PiArwqDCoMKgIGlmICh5b3VuZykgewo+Pj4+ ICvCoMKgwqDCoMKgwqDCoCAvKgo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgICogU2VlIGNvbW1lbnQg aW4gX19wdGVwX2NsZWFyX2ZsdXNoX3lvdW5nKCk7IHNhbWUgcmF0aW9uYWxlIGZvcgo+Pj4+ICvC oMKgwqDCoMKgwqDCoMKgICogZWxpZGluZyB0aGUgdHJhaWxpbmcgRFNCIGFwcGxpZXMgaGVyZS4K Pj4+PiArwqDCoMKgwqDCoMKgwqDCoCAqLwo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBhZGRyID0gQUxJ R05fRE9XTihhZGRyLCBDT05UX1BURV9TSVpFKTsKPj4+PiArwqDCoMKgwqDCoMKgwqAgX19mbHVz aF90bGJfcmFuZ2Vfbm9zeW5jKHZtYSwgYWRkciwgYWRkciArIENPTlRfUFRFX1NJWkUsCj4+Pj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgUEFHRV9TSVpFLCB0cnVl LCAzKTsKPj4+PiArwqDCoMKgIH0KPj4+PiArCj4+Pj4gK8KgwqDCoCByZXR1cm4geW91bmc7Cj4+ Pj4gK30KPj4+PiArRVhQT1JUX1NZTUJPTChjb250cHRlX3B0ZXBfY2xlYXJfZmx1c2hfeW91bmcp Owo+Pj4+ICsKPj4+PiAraW50IGNvbnRwdGVfcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHN0cnVjdCB2 bV9hcmVhX3N0cnVjdCAqdm1hLAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwLAo+Pj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwdGVfdCBlbnRyeSwgaW50IGRpcnR5KQo+Pj4+ ICt7Cj4+Pj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHI7Cj4+Pj4gK8KgwqDCoCBw dGVfdCBvcmlnX3B0ZTsKPj4+PiArwqDCoMKgIGludCBpOwo+Pj4+ICsKPj4+PiArwqDCoMKgIC8q Cj4+Pj4gK8KgwqDCoMKgICogR2F0aGVyIHRoZSBhY2Nlc3MvZGlydHkgYml0cyBmb3IgdGhlIGNv bnRpZ3VvdXMgcmFuZ2UuIElmIG5vdGhpbmcgaGFzCj4+Pj4gK8KgwqDCoMKgICogY2hhbmdlZCwg aXRzIGEgbm9vcC4KPj4+PiArwqDCoMKgwqAgKi8KPj4+PiArwqDCoMKgIG9yaWdfcHRlID0gcHRl X21rbm9uY29udChwdGVwX2dldChwdGVwKSk7Cj4+Pj4gK8KgwqDCoCBpZiAocHRlX3ZhbChvcmln X3B0ZSkgPT0gcHRlX3ZhbChlbnRyeSkpCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+ Pj4+ICsKPj4+PiArwqDCoMKgIC8qCj4+Pj4gK8KgwqDCoMKgICogV2UgY2FuIGZpeCB1cCBhY2Nl c3MvZGlydHkgYml0cyB3aXRob3V0IGhhdmluZyB0byB1bmZvbGQvZm9sZCB0aGUKPj4+PiArwqDC oMKgwqAgKiBjb250aWcgcmFuZ2UuIEJ1dCBpZiB0aGUgd3JpdGUgYml0IGlzIGNoYW5naW5nLCB3 ZSBuZWVkIHRvIGdvIHRocm91Z2gKPj4+PiArwqDCoMKgwqAgKiB0aGUgZnVsbCB1bmZvbGQvZm9s ZCBjeWNsZS4KPj4+PiArwqDCoMKgwqAgKi8KPj4+PiArwqDCoMKgIGlmIChwdGVfd3JpdGUob3Jp Z19wdGUpID09IHB0ZV93cml0ZShlbnRyeSkpIHsKPj4+PiArwqDCoMKgwqDCoMKgwqAgLyoKPj4+ PiArwqDCoMKgwqDCoMKgwqDCoCAqIEZvciBIVyBhY2Nlc3MgbWFuYWdlbWVudCwgd2UgdGVjaG5p Y2FsbHkgb25seSBuZWVkIHRvIHVwZGF0ZQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgICogdGhlIGZs YWcgb24gYSBzaW5nbGUgcHRlIGluIHRoZSByYW5nZS4gQnV0IGZvciBTVyBhY2Nlc3MKPj4+PiAr wqDCoMKgwqDCoMKgwqDCoCAqIG1hbmFnZW1lbnQsIHdlIG5lZWQgdG8gdXBkYXRlIGFsbCB0aGUg cHRlcyB0byBwcmV2ZW50IGV4dHJhCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqAgKiBmYXVsdHMuIEF2 b2lkIHBlci1wYWdlIHRsYiBmbHVzaCBpbiBfX3B0ZXBfc2V0X2FjY2Vzc19mbGFncygpCj4+Pj4g K8KgwqDCoMKgwqDCoMKgwqAgKiBhbmQgaW5zdGVhZCBmbHVzaCB0aGUgd2hvbGUgcmFuZ2UgYXQg dGhlIGVuZC4KPj4+PiArwqDCoMKgwqDCoMKgwqDCoCAqLwo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBw dGVwID0gY29udHB0ZV9hbGlnbl9kb3duKHB0ZXApOwo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBzdGFy dF9hZGRyID0gYWRkciA9IEFMSUdOX0RPV04oYWRkciwgQ09OVF9QVEVfU0laRSk7Cj4+Pj4gKwo+ Pj4+ICvCoMKgwqDCoMKgwqDCoCBmb3IgKGkgPSAwOyBpIDwgQ09OVF9QVEVTOyBpKyssIHB0ZXAr KywgYWRkciArPSBQQUdFX1NJWkUpCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgX19wdGVw X3NldF9hY2Nlc3NfZmxhZ3Modm1hLCBhZGRyLCBwdGVwLCBlbnRyeSwgMCk7Cj4+Pgo+Pj4gZW50 cnkgd2FzIHB0ZV9ta25vbmNvbnQoKSBpbiBwdGVwX3NldF9hY2Nlc3NfZmxhZ3MoKSBzbyBoZXJl IHlvdSBsb3NlIHRoZQo+Pj4gY29udHB0ZSByYW5nZSwgaXMgdGhhdCBpbnRlbnRpb25hbD8gT3Ig YW0gSSBtaXN0YWtlbj8KPj4gZW50cnkgZG9lc24ndCBoYXZlIFBURV9DT05UIGJpdCBzZXQsIHRo YXQncyBjb3JyZWN0LiBJIGludGVudGlvbmFsbHkgc3RyaXAgdGhhdAo+PiBiaXQgYXQgdGhlIGlu dGVyZmFjZSBib3VuZGFyeSwgYmVjYXVzZSBpdCBpcyB0aGUgaW1wbGVtZW50YXRpb24ncyBqb2Ig dG8gZGVjaWRlCj4+IHdoZXRoZXIgaXRzIGEgY29udHB0ZSBibG9jaywgbm90IHRoZSBjYWxsZXIn cy4gQnV0IHRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlCj4+IHRoZSBjYWxsZXIgY2FuIGVuZCB1 cCB3aXRoIGEgcHRlIHRoYXQgaGFzIFBURV9DT05UIHNldCAoYnkgaGF2aW5nIGRvbmUgYQo+PiBw cmV2aW91cyBwdGVwX2dldCgpIGZvciBleGFtcGxlKSBhbmQgdGhlbiBpdCBmb3J3YXJkcyB0aGUg cHRlIHRvIGEgc2V0dGVyLiBTbwo+PiBzdHJpcHBpbmcgaXQgaXMgcmVxdWlyZWQ7IEl0IHdvdWxk IHByb2JhYmx5IGJlIGNsZWFuZXIgdG8gc3RyaXAgaXQgYmVmb3JlCj4+IHJldHVybmluZyBpdCBm cm9tIHB0ZXBfZ2V0KCksIGJ1dCB0aGF0IHdvdWxkIGJlIHByb2JsZW1hdGljIGZvciBwdGVfbGVh Zl9zaXplKCkKPj4gd2hpY2ggaXMgY2FsbGVkIGZyb20gcGVyZl9nZXRfcGd0YWJsZV9zaXplKCku Cj4+Cj4+IEluIHRoaXMgcGFydGljdWxhciBjYXNlLCBfX3B0ZXBfc2V0X2FjY2Vzc19mbGFncygp IG9ubHkgbW9kaWZpZXMgdGhlIFBURSdzCj4+IGFjY2VzcyBmbGFncywgc28gQ09OVF9QVEUgd2ls bCByZW1haW4gYXMgaXQgaXMgaW4gdGhlIHBhZ2UgdGFibGUuIFRoZSBmYWN0IHRoYXQKPj4gZW50 cnkgaGFzIGl0IGNsZWFyZWQgaXMgbm90IGEgcHJvYmxlbS4KPiAKPiAKPiBJIHNlZSwgSSBoYWQg bm90IGNoZWNrZWQgdGhlIGFybTY0IGltcGxlbWVudGF0aW9uIG9mIHB0ZXBfc2V0X2FjY2Vzc19m bGFncygpLgo+IEZvciBjb250ZXh0LCBJJ23CoG1lcmdpbmcgdGhlIGFybTY0IGNvbnRwdGUgc3Vw cG9ydCB3aXRoIHRoZSByaXNjdiBuYXBvdCBzdXBwb3J0LAo+IHRoZSBpbXBsZW1lbnRhdGlvbiBi ZWluZyBxdWl0ZSBzaW1pbGFyIChhbHRob3VnaCByaXNjdiBpcyBhIGJpdCBkaWZmZXJlbnQgYXMg aXQKPiB1c2VzIGJpdHMgZnJvbSB0aGUgcGZuIHRvIGFkdmVydGlzZSB0aGUgbnVtYmVyIG9mIGNv bnRpZ3VvdXMgcHRlcykuCj4gCj4gQW55d2F5LMKgIG91ciBpbXBsZW1lbnRhdGlvbiBvZiBwdGVw X3NldF9hY2Nlc3NfZmxhZ3MoKSBhY3R1YWxseSBzZXRzIHRoZSBwdGVwCj4gd2l0aCBlbnRyeSwg c28gd2Ugd291bGQgYWN0dWFsbHkgbG9zZSB0aGUgY29udCBiaXQuIEkgd291bGQgc2ltcGx5IGRv IHRoZQo+IGZvbGxvd2luZyAoSSB3aWxsIGluIG15IHBhdGNoc2V0LCBubyBuZWVkIGZvciB5b3Ug dG8gd29ycnkgYWJvdXQgdGhpcyk6Cj4gCj4gX19wdGVwX3NldF9hY2Nlc3NfZmxhZ3Modm1hLCBh ZGRyLCBwdGVwLCBwdGVfbWtjb250KGVudHJ5KSwgMCk7Cj4gCj4gTGV0IG1lIGtub3cgaWYgeW91 IHRoaW5rIHRoaXMgaXMgbm90IHJpZ2h0LAoKSSdtIG5vdCBmYW1pbGlhciB3aXRoIHJpc2N2IEhX IHNwZWNzIG9yIHRoZSBMaW51eCBpbXBsZW1lbnRhdGlvbiwgc28gaXRzIGhhcmQKZm9yIG1lIHRv IHNheSBmb3Igc3VyZS4gSWYgeW91ciBfX3B0ZXBfc2V0X2FjY2Vzc19mbGFncygpIGltcGxlbWVu dGF0aW9uIGlzCndyaXRpbmcgYWxsIG9mIGVudHJ5IHRvIHRoZSBQVEUsIHRoZW4gaXQgbG9va3Mg bGlrZSBpdHMgcHJvYmFibHkgd3JvbmcgdG8gbWUgLQp5b3Ugd2lsbCBiZSB3cml0aW5nIHRoZSBz YW1lIFBGTiB0byBldmVyeSBQVEUgaW4gdGhlIGNvbnRwdGUgYmxvY2suIENlcnRhaW5seSBvbgpB cm0gdGhhdCB3b3VsZCBiZSB3cm9uZy4KCk9uIEFybSwgX19wdGVwX3NldF9hY2Nlc3NfZmxhZ3Mo KSBpcyBqdXN0IGZvbGRpbmcgdGhlIGFjY2VzcyBmbGFncyBpbiBlbnRyeSBpbnRvCnRoZSBQVEUg d2l0aG91dCBjaGFuZ2luZyBhbnl0aGluZyBlbHNlLiBUaGF0J3MgbmVlZGVkIGluIG9yZGVyIHRv IGRlYWwgd2l0aApyYWNpbmcgSFcgdXBkYXRlcyBvZiB0aGUgYWNjZXNzL2RpcnR5IGJpdHMuCgpU aGFua3MsClJ5YW4KCgo+IAo+IFRoYW5rcywKPiAKPiBBbGV4Cj4gCj4gCj4+Cj4+IFRoYW5rcywK Pj4gUnlhbgo+Pgo+Pgo+Pj4KPj4+PiArCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChkaXJ0eSkK Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBfX2ZsdXNoX3RsYl9yYW5nZSh2bWEsIHN0YXJ0 X2FkZHIsIGFkZHIsCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBQQUdFX1NJWkUsIHRydWUsIDMpOwo+Pj4+ICvCoMKgwqAgfSBlbHNl IHsKPj4+PiArwqDCoMKgwqDCoMKgwqAgX19jb250cHRlX3RyeV91bmZvbGQodm1hLT52bV9tbSwg YWRkciwgcHRlcCwgb3JpZ19wdGUpOwo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBfX3B0ZXBfc2V0X2Fj Y2Vzc19mbGFncyh2bWEsIGFkZHIsIHB0ZXAsIGVudHJ5LCBkaXJ0eSk7Cj4+Pj4gK8KgwqDCoMKg wqDCoMKgIGNvbnRwdGVfdHJ5X2ZvbGQodm1hLT52bV9tbSwgYWRkciwgcHRlcCwgZW50cnkpOwo+ Pj4+ICvCoMKgwqAgfQo+Pj4+ICsKPj4+PiArwqDCoMKgIHJldHVybiAxOwo+Pj4+ICt9Cj4+Pj4g K0VYUE9SVF9TWU1CT0woY29udHB0ZV9wdGVwX3NldF9hY2Nlc3NfZmxhZ3MpOwoKCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwg bWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8v bGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK