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 6DF94C3DA6E for ; Wed, 20 Dec 2023 10:42:34 +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=Q65TxtN1mgdraLsvFZjSiheFq/s373cGvE/yj7V/vL4=; b=EgZpz4KIvYSb5P btQkogBSffu5TXDQ0yt/VHnwpenaU4I5k8Hsq32xeJ/qpYgAjmM7GHpGYzC7qujNknO0su1JIUZWI QOeGov297Qt43geVM8fx22FxfKIFLQO1S/e9dwTw5nonOOKJoEbF5FVipAh7GI8lSo2uWOWVvrpIK mMmRTJIlw677UGV5HEdR9QZmMFqzWRTq3sBBfvjILglg0WTt2yKjoiQPIBbtSUdXDL/DA++PnkRfj k48SjJvpEWknrJqrW7k5C6nfJwcTJ4nBYWrkWlKqk9ic8cxuf+S9C1UbtTU6TUxf64spvWGGfY57X DotdtZL+SZy0ffNhc7Qw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rFu1X-00GyAP-22; Wed, 20 Dec 2023 10:41:59 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rFu1T-00Gy8U-0c for linux-arm-kernel@lists.infradead.org; Wed, 20 Dec 2023 10:41:57 +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 0D9A21FB; Wed, 20 Dec 2023 02:42:37 -0800 (PST) Received: from [10.57.75.247] (unknown [10.57.75.247]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 1B55F3F5A1; Wed, 20 Dec 2023 02:41:47 -0800 (PST) Message-ID: Date: Wed, 20 Dec 2023 10:41:46 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v4 02/16] mm: Batch-copy PTE ranges during fork() Content-Language: en-GB To: David Hildenbrand , 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 , 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-3-ryan.roberts@arm.com> <0bef5423-6eea-446b-8854-980e9c23a948@redhat.com> <7c0236ad-01f3-437f-8b04-125d69e90dc0@redhat.com> <9a58b1a2-2c13-4fa0-8ffa-2b3d9655f1b6@arm.com> <28968568-f920-47ac-b6fd-87528ffd8f77@redhat.com> <10b0b562-c1c0-4a66-9aeb-a6bff5c218f6@arm.com> <8f8023cb-3c31-4ead-a9e6-03a10e9490c6@redhat.com> From: Ryan Roberts In-Reply-To: <8f8023cb-3c31-4ead-a9e6-03a10e9490c6@redhat.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231220_024155_327459_2C90838C X-CRM114-Status: GOOD ( 50.02 ) 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 T24gMjAvMTIvMjAyMyAxMDoxNiwgRGF2aWQgSGlsZGVuYnJhbmQgd3JvdGU6Cj4gT24gMjAuMTIu MjMgMTE6MTEsIFJ5YW4gUm9iZXJ0cyB3cm90ZToKPj4gT24gMjAvMTIvMjAyMyAwOTo1NCwgRGF2 aWQgSGlsZGVuYnJhbmQgd3JvdGU6Cj4+PiBPbiAyMC4xMi4yMyAxMDo1MSwgUnlhbiBSb2JlcnRz IHdyb3RlOgo+Pj4+IE9uIDIwLzEyLzIwMjMgMDk6MTcsIERhdmlkIEhpbGRlbmJyYW5kIHdyb3Rl Ogo+Pj4+PiBPbiAxOS4xMi4yMyAxODo0MiwgUnlhbiBSb2JlcnRzIHdyb3RlOgo+Pj4+Pj4gT24g MTkvMTIvMjAyMyAxNzoyMiwgRGF2aWQgSGlsZGVuYnJhbmQgd3JvdGU6Cj4+Pj4+Pj4gT24gMTku MTIuMjMgMDk6MzAsIFJ5YW4gUm9iZXJ0cyB3cm90ZToKPj4+Pj4+Pj4gT24gMTgvMTIvMjAyMyAx Nzo0NywgRGF2aWQgSGlsZGVuYnJhbmQgd3JvdGU6Cj4+Pj4+Pj4+PiBPbiAxOC4xMi4yMyAxMTo1 MCwgUnlhbiBSb2JlcnRzIHdyb3RlOgo+Pj4+Pj4+Pj4+IENvbnZlcnQgY29weV9wdGVfcmFuZ2Uo KSB0byBjb3B5IGEgYmF0Y2ggb2YgcHRlcyBpbiBvbmUgZ28uIEEgZ2l2ZW4KPj4+Pj4+Pj4+PiBi YXRjaCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhcmNoaXRlY3R1cmUgd2l0aCB0aGUgbmV3IGhlbHBl ciwKPj4+Pj4+Pj4+PiBwdGVfYmF0Y2hfcmVtYWluaW5nKCksIGFuZCBtYXBzIGEgcGh5c2ljYWxs eSBjb250aWd1b3VzIGJsb2NrIG9mIG1lbW9yeSwKPj4+Pj4+Pj4+PiBhbGwgYmVsb25naW5nIHRv IHRoZSBzYW1lIGZvbGlvLiBBIHB0ZSBiYXRjaCBpcyB0aGVuIHdyaXRlLXByb3RlY3RlZCBpbgo+ Pj4+Pj4+Pj4+IG9uZSBnbyBpbiB0aGUgcGFyZW50IHVzaW5nIHRoZSBuZXcgaGVscGVyLCBwdGVw X3NldF93cnByb3RlY3RzKCkgYW5kIGlzCj4+Pj4+Pj4+Pj4gc2V0IGluIG9uZSBnbyBpbiB0aGUg Y2hpbGQgdXNpbmcgdGhlIG5ldyBoZWxwZXIsIHNldF9wdGVzX2Z1bGwoKS4KPj4+Pj4+Pj4+Pgo+ Pj4+Pj4+Pj4+IFRoZSBwcmltYXJ5IG1vdGl2YXRpb24gZm9yIHRoaXMgY2hhbmdlIGlzIHRvIHJl ZHVjZSB0aGUgbnVtYmVyIG9mIHRsYgo+Pj4+Pj4+Pj4+IG1haW50ZW5hbmNlIG9wZXJhdGlvbnMg dGhhdCB0aGUgYXJtNjQgYmFja2VuZCBoYXMgdG8gcGVyZm9ybSBkdXJpbmcKPj4+Pj4+Pj4+PiBm b3JrLCBhcyBpdCBpcyBhYm91dCB0byBhZGQgdHJhbnNwYXJlbnQgc3VwcG9ydCBmb3IgdGhlICJj b250aWd1b3VzIGJpdCIKPj4+Pj4+Pj4+PiBpbiBpdHMgcHRlcy4gQnkgd3JpdGUtcHJvdGVjdGlu ZyB0aGUgcGFyZW50IHVzaW5nIHRoZSBuZXcKPj4+Pj4+Pj4+PiBwdGVwX3NldF93cnByb3RlY3Rz KCkgKG5vdGUgdGhlICdzJyBhdCB0aGUgZW5kKSBmdW5jdGlvbiwgdGhlIGJhY2tlbmQKPj4+Pj4+ Pj4+PiBjYW4gYXZvaWQgaGF2aW5nIHRvIHVuZm9sZCBjb250aWcgcmFuZ2VzIG9mIFBURXMsIHdo aWNoIGlzIGV4cGVuc2l2ZSwKPj4+Pj4+Pj4+PiB3aGVuIGFsbCBwdGVzIGluIHRoZSByYW5nZSBh cmUgYmVpbmcgd3JpdGUtcHJvdGVjdGVkLiBTaW1pbGFybHksIGJ5Cj4+Pj4+Pj4+Pj4gdXNpbmcg c2V0X3B0ZXNfZnVsbCgpIHJhdGhlciB0aGFuIHNldF9wdGVfYXQoKSB0byBzZXQgdXAgcHRlcyBp biB0aGUKPj4+Pj4+Pj4+PiBjaGlsZCwgdGhlIGJhY2tlbmQgZG9lcyBub3QgbmVlZCB0byBmb2xk IGEgY29udGlndW91cyByYW5nZSBvbmNlIHRoZXkKPj4+Pj4+Pj4+PiBhcmUgYWxsIHBvcHVsYXRl ZCAtIHRoZXkgY2FuIGJlIGluaXRpYWxseSBwb3B1bGF0ZWQgYXMgYSBjb250aWd1b3VzCj4+Pj4+ Pj4+Pj4gcmFuZ2UgaW4gdGhlIGZpcnN0IHBsYWNlLgo+Pj4+Pj4+Pj4+Cj4+Pj4+Pj4+Pj4gVGhp cyBjb2RlIGlzIHZlcnkgcGVyZm9ybWFuY2Ugc2Vuc2l0aXZlLCBhbmQgYSBzaWduaWZpY2FudCBh bW91bnQgb2YKPj4+Pj4+Pj4+PiBlZmZvcnQgaGFzIGJlZW4gcHV0IGludG8gbm90IHJlZ3Jlc3Np bmcgcGVyZm9ybWFuY2UgZm9yIHRoZSBvcmRlci0wCj4+Pj4+Pj4+Pj4gZm9saW8gY2FzZS4gQnkg ZGVmYXVsdCwgcHRlX2JhdGNoX3JlbWFpbmluZygpIGlzIGNvbXBpbGUgY29uc3RhbnQgMSwKPj4+ Pj4+Pj4+PiB3aGljaCBlbmFibGVzIHRoZSBjb21waWxlciB0byBzaW1wbGlmeSB0aGUgZXh0cmEg bG9vcHMgdGhhdCBhcmUgYWRkZWQKPj4+Pj4+Pj4+PiBmb3IgYmF0Y2hpbmcgYW5kIHByb2R1Y2Ug Y29kZSB0aGF0IGlzIGVxdWl2YWxlbnQgKGFuZCBlcXVhbGx5Cj4+Pj4+Pj4+Pj4gcGVyZm9ybWFu dCkgYXMgdGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uLgo+Pj4+Pj4+Pj4+Cj4+Pj4+Pj4+Pj4g VGhpcyBjaGFuZ2UgYWRkcmVzc2VzIHRoZSBjb3JlLW1tIHJlZmFjdG9yaW5nIG9ubHkgYW5kIGEg c2VwYXJhdGUgY2hhbmdlCj4+Pj4+Pj4+Pj4gd2lsbCBpbXBsZW1lbnQgcHRlX2JhdGNoX3JlbWFp bmluZygpLCBwdGVwX3NldF93cnByb3RlY3RzKCkgYW5kCj4+Pj4+Pj4+Pj4gc2V0X3B0ZXNfZnVs bCgpIGluIHRoZSBhcm02NCBiYWNrZW5kIHRvIHJlYWxpemUgdGhlIHBlcmZvcm1hbmNlCj4+Pj4+ Pj4+Pj4gaW1wcm92ZW1lbnQgYXMgcGFydCBvZiB0aGUgd29yayB0byBlbmFibGUgY29udHB0ZSBt YXBwaW5ncy4KPj4+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4+IFRvIGVuc3VyZSB0aGUgYXJtNjQgaXMgcGVy Zm9ybWFudCBvbmNlIGltcGxlbWVudGVkLCB0aGlzIGNoYW5nZSBpcyB2ZXJ5Cj4+Pj4+Pj4+Pj4g Y2FyZWZ1bCB0byBvbmx5IGNhbGwgcHRlcF9nZXQoKSBvbmNlIHBlciBwdGUgYmF0Y2guCj4+Pj4+ Pj4+Pj4KPj4+Pj4+Pj4+PiBUaGUgZm9sbG93aW5nIG1pY3JvYmVuY2htYXJrIHJlc3VsdHMgZGVt b25zdGF0ZSB0aGF0IHRoZXJlIGlzIG5vCj4+Pj4+Pj4+Pj4gc2lnbmlmaWNhbnQgcGVyZm9ybWFu Y2UgY2hhbmdlIGFmdGVyIHRoaXMgcGF0Y2guIEZvcmsgaXMgY2FsbGVkIGluIGEKPj4+Pj4+Pj4+ PiB0aWdodCBsb29wIGluIGEgcHJvY2VzcyB3aXRoIDFHIG9mIHBvcHVsYXRlZCBtZW1vcnkgYW5k IHRoZSB0aW1lIGZvciB0aGUKPj4+Pj4+Pj4+PiBmdW5jdGlvbiB0byBleGVjdXRlIGlzIG1lYXN1 cmVkLiAxMDAgaXRlcmF0aW9ucyBwZXIgcnVuLCA4IHJ1bnMKPj4+Pj4+Pj4+PiBwZXJmb3JtZWQg b24gYm90aCBBcHBsZSBNMiAoVk0pIGFuZCBBbXBlcmUgQWx0cmEgKGJhcmUgbWV0YWwpLiBUZXN0 cwo+Pj4+Pj4+Pj4+IHBlcmZvcm1lZCBmb3IgY2FzZSB3aGVyZSAxRyBtZW1vcnkgaXMgY29tcHJp c2VkIG9mIG9yZGVyLTAgZm9saW9zIGFuZAo+Pj4+Pj4+Pj4+IGNhc2Ugd2hlcmUgY29tcHJpc2Vk IG9mIHB0ZS1tYXBwZWQgb3JkZXItOSBmb2xpb3MuIE5lZ2F0aXZlIGlzIGZhc3RlciwKPj4+Pj4+ Pj4+PiBwb3NpdGl2ZSBpcyBzbG93ZXIsIGNvbXBhcmVkIHRvIGJhc2VsaW5lIHVwb24gd2hpY2gg dGhlIHNlcmllcyBpcyBiYXNlZDoKPj4+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4+IHwgQXBwbGUgTTIgVk3C oMKgIHwgb3JkZXItMCAocHRlLW1hcCkgfCBvcmRlci05IChwdGUtbWFwKSB8Cj4+Pj4+Pj4+Pj4g fCBmb3JrwqDCoMKgwqDCoMKgwqDCoMKgIHwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0t LS0tLS0tLS18Cj4+Pj4+Pj4+Pj4gfCBtaWNyb2JlbmNowqDCoMKgIHzCoMKgwqAgbWVhbiB8wqDC oCBzdGRldiB8wqDCoMKgIG1lYW4gfMKgwqAgc3RkZXYgfAo+Pj4+Pj4+Pj4+IHwtLS0tLS0tLS0t LS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfAo+Pj4+Pj4+Pj4+ IHwgYmFzZWxpbmXCoMKgwqDCoMKgIHzCoMKgwqAgMC4wJSB8wqDCoMKgIDEuMSUgfMKgwqDCoCAw LjAlIHzCoMKgwqAgMS4yJSB8Cj4+Pj4+Pj4+Pj4gfCBhZnRlci1jaGFuZ2XCoCB8wqDCoCAtMS4w JSB8wqDCoMKgIDIuMCUgfMKgwqAgLTAuMSUgfMKgwqDCoCAxLjElIHwKPj4+Pj4+Pj4+Pgo+Pj4+ Pj4+Pj4+IHwgQW1wZXJlIEFsdHJhwqAgfCBvcmRlci0wIChwdGUtbWFwKSB8IG9yZGVyLTkgKHB0 ZS1tYXApIHwKPj4+Pj4+Pj4+PiB8IGZvcmvCoMKgwqDCoMKgwqDCoMKgwqAgfC0tLS0tLS0tLS0t LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwKPj4+Pj4+Pj4+PiB8IG1pY3JvYmVuY2jCoMKg wqAgfMKgwqDCoCBtZWFuIHzCoMKgIHN0ZGV2IHzCoMKgwqAgbWVhbiB8wqDCoCBzdGRldiB8Cj4+ Pj4+Pj4+Pj4gfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwt LS0tLS0tLS18Cj4+Pj4+Pj4+Pj4gfCBiYXNlbGluZcKgwqDCoMKgwqAgfMKgwqDCoCAwLjAlIHzC oMKgwqAgMS4wJSB8wqDCoMKgIDAuMCUgfMKgwqDCoCAwLjElIHwKPj4+Pj4+Pj4+PiB8IGFmdGVy LWNoYW5nZcKgIHzCoMKgIC0wLjElIHzCoMKgwqAgMS4yJSB8wqDCoCAtMC4xJSB8wqDCoMKgIDAu MSUgfAo+Pj4+Pj4+Pj4+Cj4+Pj4+Pj4+Pj4gVGVzdGVkLWJ5OiBKb2huIEh1YmJhcmQgPGpodWJi YXJkQG52aWRpYS5jb20+Cj4+Pj4+Pj4+Pj4gUmV2aWV3ZWQtYnk6IEFsaXN0YWlyIFBvcHBsZSA8 YXBvcHBsZUBudmlkaWEuY29tPgo+Pj4+Pj4+Pj4+IFNpZ25lZC1vZmYtYnk6IFJ5YW4gUm9iZXJ0 cyA8cnlhbi5yb2JlcnRzQGFybS5jb20+Cj4+Pj4+Pj4+Pj4gLS0tCj4+Pj4+Pj4+Pj4gwqDCoMKg wqDCoCBpbmNsdWRlL2xpbnV4L3BndGFibGUuaCB8IDgwICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrCj4+Pj4+Pj4+Pj4gwqDCoMKgwqDCoCBtbS9tZW1vcnkuY8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB8IDkyCj4+Pj4+Pj4+Pj4gKysrKysrKysrKysrKysrKysrKysrKysrKyst LS0tLS0tLS0tLS0tLS0KPj4+Pj4+Pj4+PiDCoMKgwqDCoMKgIDIgZmlsZXMgY2hhbmdlZCwgMTM5 IGluc2VydGlvbnMoKyksIDMzIGRlbGV0aW9ucygtKQo+Pj4+Pj4+Pj4+Cj4+Pj4+Pj4+Pj4gZGlm ZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGd0YWJsZS5oIGIvaW5jbHVkZS9saW51eC9wZ3RhYmxl LmgKPj4+Pj4+Pj4+PiBpbmRleCBhZjc2MzljM2IwYTMuLmRiOTNmYjgxNDY1YSAxMDA2NDQKPj4+ Pj4+Pj4+PiAtLS0gYS9pbmNsdWRlL2xpbnV4L3BndGFibGUuaAo+Pj4+Pj4+Pj4+ICsrKyBiL2lu Y2x1ZGUvbGludXgvcGd0YWJsZS5oCj4+Pj4+Pj4+Pj4gQEAgLTIwNSw2ICsyMDUsMjcgQEAgc3Rh dGljIGlubGluZSBpbnQgcG1kX3lvdW5nKHBtZF90IHBtZCkKPj4+Pj4+Pj4+PiDCoMKgwqDCoMKg ICNkZWZpbmUgYXJjaF9mbHVzaF9sYXp5X21tdV9tb2RlKCnCoMKgwqAgZG8ge30gd2hpbGUgKDAp Cj4+Pj4+Pj4+Pj4gwqDCoMKgwqDCoCAjZW5kaWYKPj4+Pj4+Pj4+PiDCoMKgwqDCoMKgICsjaWZu ZGVmIHB0ZV9iYXRjaF9yZW1haW5pbmcKPj4+Pj4+Pj4+PiArLyoqCj4+Pj4+Pj4+Pj4gKyAqIHB0 ZV9iYXRjaF9yZW1haW5pbmcgLSBOdW1iZXIgb2YgcGFnZXMgZnJvbSBhZGRyIHRvIG5leHQgYmF0 Y2gKPj4+Pj4+Pj4+PiBib3VuZGFyeS4KPj4+Pj4+Pj4+PiArICogQHB0ZTogUGFnZSB0YWJsZSBl bnRyeSBmb3IgdGhlIGZpcnN0IHBhZ2UuCj4+Pj4+Pj4+Pj4gKyAqIEBhZGRyOiBBZGRyZXNzIG9m IHRoZSBmaXJzdCBwYWdlLgo+Pj4+Pj4+Pj4+ICsgKiBAZW5kOiBCYXRjaCBjZWlsaW5nIChlLmcu IGVuZCBvZiB2bWEpLgo+Pj4+Pj4+Pj4+ICsgKgo+Pj4+Pj4+Pj4+ICsgKiBTb21lIGFyY2hpdGVj dHVyZXMgKGFybTY0KSBjYW4gZWZmaWNpZW50bHkgbW9kaWZ5IGEgY29udGlndW91cwo+Pj4+Pj4+ Pj4+IGJhdGNoIG9mCj4+Pj4+Pj4+Pj4gcHRlcy4KPj4+Pj4+Pj4+PiArICogSW4gc3VjaCBjYXNl cywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mIHBhZ2VzIHRv Cj4+Pj4+Pj4+Pj4gdGhlIGVuZAo+Pj4+Pj4+Pj4+ICsgKiBvZiB0aGUgY3VycmVudCBiYXRjaCwg YXMgZGVmaW5lZCBieSBhZGRyLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbgo+Pj4+Pj4+Pj4+IGl0 ZXJhdGluZwo+Pj4+Pj4+Pj4+ICsgKiBvdmVyIHB0ZXMuCj4+Pj4+Pj4+Pj4gKyAqCj4+Pj4+Pj4+ Pj4gKyAqIE1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhcmNoaXRlY3R1cmUsIGVsc2UgYmF0Y2gg c2l6ZSBpcyBhbHdheXMgMS4KPj4+Pj4+Pj4+PiArICovCj4+Pj4+Pj4+Pj4gK3N0YXRpYyBpbmxp bmUgdW5zaWduZWQgaW50IHB0ZV9iYXRjaF9yZW1haW5pbmcocHRlX3QgcHRlLCB1bnNpZ25lZCBs b25nCj4+Pj4+Pj4+Pj4gYWRkciwKPj4+Pj4+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIGVuZCkKPj4+Pj4+Pj4+PiArewo+ Pj4+Pj4+Pj4+ICvCoMKgwqAgcmV0dXJuIDE7Cj4+Pj4+Pj4+Pj4gK30KPj4+Pj4+Pj4+PiArI2Vu ZGlmCj4+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4gSXQncyBhIHNoYW1lIHdlIG5vdyBsb3NlIHRoZSBvcHRp bWl6YXRpb24gZm9yIGFsbCBvdGhlciBhcmNodGllY3R1cmVzLgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+ IFdhcyB0aGVyZSBubyB3YXkgdG8gaGF2ZSBzb21lIGJhc2ljIGJhdGNoaW5nIG1lY2hhbmlzbSB0 aGF0IGRvZXNuJ3QKPj4+Pj4+Pj4+IHJlcXVpcmUKPj4+Pj4+Pj4+IGFyY2gKPj4+Pj4+Pj4+IHNw ZWNpZmljcz8KPj4+Pj4+Pj4KPj4+Pj4+Pj4gSSB0cmllZCBhIGJ1bmNoIG9mIHRoaW5ncyBidXQg dWx0aW1hdGVseSB0aGUgd2F5IEkndmUgZG9uZSBpdCB3YXMgdGhlIG9ubHkKPj4+Pj4+Pj4gd2F5 Cj4+Pj4+Pj4+IHRvIHJlZHVjZSB0aGUgb3JkZXItMCBmb3JrIHJlZ3Jlc3Npb24gdG8gMC4KPj4+ Pj4+Pj4KPj4+Pj4+Pj4gTXkgb3JpZ2luYWwgdjMgcG9zdGluZyB3YXMgY29zdGluZyA1JSBleHRy YSBhbmQgZXZlbiBteSBmaXJzdCBhdHRlbXB0IGF0IGFuCj4+Pj4+Pj4+IGFyY2gtc3BlY2lmaWMg dmVyc2lvbiB0aGF0IGRpZG4ndCByZXNvbHZlIHRvIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IDEK Pj4+Pj4+Pj4gc3RpbGwKPj4+Pj4+Pj4gY29zdCBhbiBleHRyYSAzJS4KPj4+Pj4+Pj4KPj4+Pj4+ Pj4KPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiBJJ2QgaGF2ZSB0aG91Z2h0IHRoYXQgc29tZXRoaW5nIHZl cnkgYmFzaWMgd291bGQgaGF2ZSB3b3JrZWQgbGlrZToKPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiAqIENo ZWNrIGlmIFBURSBpcyB0aGUgc2FtZSB3aGVuIHNldHRpbmcgdGhlIFBGTiB0byAwLgo+Pj4+Pj4+ Pj4gKiBDaGVjayB0aGF0IFBGTiBpcyBjb25zZWN1dGl2ZQo+Pj4+Pj4+Pj4gKiBDaGVjayB0aGF0 IGFsbCBQRk5zIGJlbG9uZyB0byB0aGUgc2FtZSBmb2xpbwo+Pj4+Pj4+Pgo+Pj4+Pj4+PiBJIGhh dmVuJ3QgdHJpZWQgdGhpcyBleGFjdCBhcHByb2FjaCwgYnV0IEknZCBiZSBzdXJwcmlzZWQgaWYg SSBjYW4gZ2V0IHRoZQo+Pj4+Pj4+PiByZWdyZXNzaW9uIHVuZGVyIDQlIHdpdGggdGhpcy4gRnVy dGhlciBhbG9uZyB0aGUgc2VyaWVzIEkgc3BlbnQgYSBsb3Qgb2YKPj4+Pj4+Pj4gdGltZQo+Pj4+ Pj4+PiBoYXZpbmcgdG8gZmlkZGxlIHdpdGggdGhlIGFybTY0IGltcGxlbWVudGF0aW9uOyBldmVy eSBjb25kaXRpb25hbCBhbmQgZXZlcnkKPj4+Pj4+Pj4gbWVtb3J5IHJlYWQgKGV2ZW4gd2hlbiBp biBjYWNoZSkgd2FzIGEgcHJvYmxlbS4gVGhlcmUgaXMganVzdCBzbyBsaXR0bGUgaW4KPj4+Pj4+ Pj4gdGhlCj4+Pj4+Pj4+IGlubmVyIGxvb3AgdGhhdCBldmVyeSBpbnN0cnVjdGlvbiBtYXR0ZXJz LiAoQXQgbGVhc3Qgb24gQW1wZXJlIEFsdHJhIGFuZAo+Pj4+Pj4+PiBBcHBsZQo+Pj4+Pj4+PiBN MikuCj4+Pj4+Pj4+Cj4+Pj4+Pj4+IE9mIGNvdXJzZSBpZiB5b3UncmUgd2lsbGluZyB0byBwYXkg dGhhdCA0LTUlIGZvciBvcmRlci0wIHRoZW4gdGhlCj4+Pj4+Pj4+IGJlbmVmaXQgdG8KPj4+Pj4+ Pj4gb3JkZXItOSBpcyBhcm91bmQgMTAlIGluIG15IG1lYXN1cmVtZW50cy4gUGVyc29uYWxseSB0 aG91Z2gsIEknZCBwcmVmZXIgdG8KPj4+Pj4+Pj4gcGxheQo+Pj4+Pj4+PiBzYWZlIGFuZCBlbnN1 cmUgdGhlIGNvbW1vbiBvcmRlci0wIGNhc2UgZG9lc24ndCByZWdyZXNzLCBhcyB5b3UgcHJldmlv dXNseQo+Pj4+Pj4+PiBzdWdnZXN0ZWQuCj4+Pj4+Pj4+Cj4+Pj4+Pj4KPj4+Pj4+PiBJIGp1c3Qg aGFja2VkIHNvbWV0aGluZyB1cCwgb24gdG9wIG9mIG15IGJlbG92ZWQgcm1hcCBjbGVhbnVwL2Jh dGNoaW5nCj4+Pj4+Pj4gc2VyaWVzLiBJCj4+Pj4+Pj4gaW1wbGVtZW50ZWQgdmVyeSBnZW5lcmlj IGFuZCBzaW1wbGUgYmF0Y2hpbmcgZm9yIGxhcmdlIGZvbGlvcyAoYWxsIFBURSBiaXRzCj4+Pj4+ Pj4gZXhjZXB0IHRoZSBQRk4gaGF2ZSB0byBtYXRjaCkuCj4+Pj4+Pj4KPj4+Pj4+PiBTb21lIHZl cnkgcXVpY2sgdGVzdGluZyAoZG9uJ3QgdHJ1c3QgZWFjaCBsYXN0ICUgKSBvbiBJbnRlbChSKSBY ZW9uKFIpCj4+Pj4+Pj4gU2lsdmVyCj4+Pj4+Pj4gNDIxMFIgQ1BVLgo+Pj4+Pj4+Cj4+Pj4+Pj4g b3JkZXItMDogMC4wMTQyMTAgLT4gMC4wMTM5NjkKPj4+Pj4+Pgo+Pj4+Pj4+IC0+IEFyb3VuZCAx LjcgJSBmYXN0ZXIKPj4+Pj4+Pgo+Pj4+Pj4+IG9yZGVyLTk6IDAuMDE0MzczIC0+IDAuMDA5MTQ5 Cj4+Pj4+Pj4KPj4+Pj4+PiAtPiBBcm91bmQgMzYuMyAlIGZhc3Rlcgo+Pj4+Pj4KPj4+Pj4+IFdl bGwgSSBndWVzcyB0aGF0IHNob3dzIG1lIDopCj4+Pj4+Pgo+Pj4+Pj4gSSdsbCBkbyBhIHJldmll dyBhbmQgcnVuIHRoZSB0ZXN0cyBvbiBteSBIVyB0byBzZWUgaWYgaXQgY29uY3Vycy4KPj4+Pj4K Pj4+Pj4KPj4+Pj4gSSBwdXNoZWQgYSBzaW1wbGUgY29tcGlsZSBmaXh1cCAod2UgbmVlZCBwdGVf bmV4dF9wZm4oKSkuCj4+Pj4KPj4+PiBJJ3ZlIGp1c3QgYmVlbiB0cnlpbmcgdG8gY29tcGlsZSBh bmQgbm90aWNlZCB0aGlzLiBXaWxsIHRha2UgYSBsb29rIGF0IHlvdXIKPj4+PiB1cGRhdGUuCj4+ Pj4KPj4+PiBCdXQgdXBvbiByZXZpZXcsIEkndmUgbm90aWNlZCB0aGUgcGFydCB0aGF0IEkgdGhp bmsgbWFrZXMgdGhpcyBkaWZmaWN1bHQgZm9yCj4+Pj4gYXJtNjQgd2l0aCB0aGUgY29udHB0ZSBv cHRpbWl6YXRpb247IFlvdSBhcmUgY2FsbGluZyBwdGVwX2dldCgpIGZvciBldmVyeQo+Pj4+IHB0 ZSBpbgo+Pj4+IHRoZSBiYXRjaC4gV2hpbGUgdGhpcyBpcyBmdW5jdGlvbmFsbHkgY29ycmVjdCwg b25jZSBhcm02NCBoYXMgdGhlIGNvbnRwdGUKPj4+PiBjaGFuZ2VzLCBpdHMgcHRlcF9nZXQoKSBo YXMgdG8gcmVhZCBldmVyeSBwdGUgaW4gdGhlIGNvbnRwdGUgYmxvY2sgaW4gb3JkZXIgdG8KPj4+ PiBnYXRoZXIgdGhlIGFjY2VzcyBhbmQgZGlydHkgYml0cy4gU28gaWYgeW91ciBiYXRjaGluZyBm dW5jdGlvbiBlbmRzIHVwIHdlYWxraW5nCj4+Pj4gYSAxNiBlbnRyeSBjb250cHRlIGJsb2NrLCB0 aGF0IHdpbGwgY2F1c2UgMTYgeCAxNiByZWFkcywgd2hpY2gga2lsbHMKPj4+PiBwZXJmb3JtYW5j ZS4gVGhhdCdzIHdoeSBJIGFkZGVkIHRoZSBhcmNoLXNwZWNpZmljIHB0ZV9iYXRjaF9yZW1haW5p bmcoKQo+Pj4+IGZ1bmN0aW9uOyB0aGlzIGFsbG93cyB0aGUgY29yZS1tbSB0byBza2lwIHRvIHRo ZSBlbmQgb2YgdGhlIGNvbnRwdGUgYmxvY2sgYW5kCj4+Pj4gYXZvaWQgcHRlcF9nZXQoKSBmb3Ig dGhlIDE1IHRhaWwgcHRlcy4gU28gd2UgZW5kIHVwIHdpdGggMTYgUkVBRF9PTkNFKClzCj4+Pj4g aW5zdGVhZAo+Pj4+IG9mIDI1Ni4KPj4+Pgo+Pj4+IEkgY29uc2lkZXJlZCBtYWtpbmcgYSBwdGVw X2dldF9ub3lvdW5nZGlydHkoKSB2YXJpYW50LCB3aGljaCB3b3VsZCBhdm9pZCB0aGUKPj4+PiBi aXQKPj4+PiBnYXRoZXJpbmcuIEJ1dCB3ZSBoYXZlIGEgc2ltaWxhciBwcm9ibGVtIGluIHphcF9w dGVfcmFuZ2UoKSBhbmQgdGhhdCBmdW5jdGlvbgo+Pj4+IG5lZWRzIHRoZSBkaXJ0eSBiaXQgdG8g dXBkYXRlIHRoZSBmb2xpby4gU28gaXQgZG9lc24ndCB3b3JrIHRoZXJlLiAoc2VlIHBhdGNoIDMK Pj4+PiBpbiBteSBzZXJpZXMpLgo+Pj4+Cj4+Pj4gSSBndWVzcyB5b3UgYXJlIGdvaW5nIHRvIHNh eSB0aGF0IHdlIHNob3VsZCBjb21iaW5lIGJvdGggYXBwcm9hY2hlcywgc28gdGhhdAo+Pj4+IHlv dXIgYmF0Y2hpbmcgbG9vcCBjYW4gc2tpcCBmb3J3YXJkIGFuIGFyY2gtcHJvdmlkZWQgbnVtYmVy IG9mIHB0ZXM/IFRoYXQgd291bGQKPj4+PiBjZXJ0YWlubHkgd29yaywgYnV0IGZlZWxzIGxpa2Ug YW4gb3J0aG9nb25hbCBjaGFuZ2UgdG8gd2hhdCBJJ20gdHJ5aW5nIHRvCj4+Pj4gYWNoaWV2ZSA6 KS4gQW55d2F5LCBJJ2xsIHNwZW5kIHNvbWUgdGltZSBwbGF5aW5nIHdpdGggaXQgdG9kYXkuCj4+ Pgo+Pj4gWW91IGNhbiBvdmVyd3JpdGUgdGhlIGZ1bmN0aW9uIG9yIGFkZCBzcGVjaWFsLWNhc2lu ZyBpbnRlcm5hbGx5LCB5ZXMuCj4+Pgo+Pj4gUmlnaHQgbm93LCB5b3VyIHBhdGNoIGlzIGNhbGxl ZCAibW06IEJhdGNoLWNvcHkgUFRFIHJhbmdlcyBkdXJpbmcgZm9yaygpIiBhbmQgaXQKPj4+IGRv ZXNuJ3QgZG8gYW55IG9mIHRoYXQgYmVzaWRlcyBwcmVwYXJpbmcgZm9yIHNvbWUgYXJtNjQgd29y ay4KPj4+Cj4+Cj4+IFdlbGwgaXQgYWxsb3dzIGFuIGFyY2ggdG8gb3B0LWluIHRvIGJhdGNoaW5n LiBCdXQgSSBzZWUgeW91ciBwb2ludC4KPj4KPj4gSG93IGRvIHlvdSB3YW50IHRvIGhhbmRsZSB5 b3VyIHBhdGNoZXM/IERvIHlvdSB3YW50IHRvIGNsZWFuIHRoZW0gdXAgYW5kIEknbGwKPj4gYmFz ZSBteSBzdHVmZiBvbiB0b3A/IE9yIGRvIHlvdSB3YW50IG1lIHRvIHRha2UgdGhlbSBhbmQgc29y dCBpdCBhbGwgb3V0Pwo+IAo+IFdoYXRldmVyIHlvdSBwcmVmZXIsIGl0IHdhcyBtb3N0bHkgYSBx dWljayBwcm90b3R5cGUgdG8gc2VlIGlmIHdlIGNhbiBhY2hpZXZlCj4gZGVjZW50IHBlcmZvcm1h bmNlLgoKSSdtIGFib3V0IHRvIHJ1biBpdCBvbiBBbHRyYSBhbmQgTTIuIEJ1dCBJIGFzc3VtZSBp dCB3aWxsIHNob3cgc2ltaWxhciByZXN1bHRzLgoKPiAKPiBJIGNhbiBmaXh1cCB0aGUgYXJjaCB0 aGluZ2llcyAobW9zdCBzaG91bGQgYmUgZWFzeSwgc29tZSBtaWdodCByZXF1aXJlIGEgY3VzdG9t Cj4gcHRlX25leHRfcGZuKCkpIAoKV2VsbCBpZiB5b3UncmUgaGFwcHkgdG8gZG8gdGhhdCwgZ3Jl YXQhIEknbSBrZWVuIHRvIGdldCB0aGUgY29udHB0ZSBzdHVmZiBpbnRvCnY2LjkgaWYgYXQgYWxs IHBvc3NpYmxlLCBhbmQgSSdtIGNvbmNpb3VzIHRoYXQgSSdtIGludHJvZHVjaW5nIG1vcmUgZGVw ZW5kZW5jaWVzCm9uIHlvdS4gQW5kIGl0cyBhYm91dCB0byBiZSBob2xpZGF5IHNlYXNvbi4uLgoK PiBhbmQgeW91IGNhbiBmb2N1cyBvbiBnZXR0aW5nIGNvbnQtcHRlIHNvcnRlZCBvdXQgb24gdG9w IFtJCj4gYXNzdW1lIHRoYXQncyB3aGF0IHlvdSB3YW50IHRvIHdvcmsgb24gOikgXS4KClRoYXQn cyBjZXJ0YWlubHkgd2hhdCBJJ20gZm9jdXNzZWQgb24uIEJ1dCBJJ20gaGFwcHkgdG8gZG8gd2hh dGV2ZXIgaXMgcmVxdWlyZWQKdG8gZ2V0IGl0IG92ZXIgdGhlIGxpbmUuIEkgZ3Vlc3MgSSdsbCBz dGFydCBieSBmaW5pc2hpbmcgbXkgcmV2aWV3IG9mIHlvdXIgdjEKcm1hcCBzdHVmZi4KCj4gCj4+ Cj4+IEFzIEkgc2VlIGl0IGF0IHRoZSBtb21lbnQsIEkgd291bGQga2VlcCB5b3VyIGZvbGlvX3B0 ZV9iYXRjaCgpIGFsd2F5cyBjb3JlLCBidXQKPj4gaW4gc3Vic2VxdWVudCBwYXRjaCwgaGF2ZSBp dCB1c2UgcHRlX2JhdGNoX3JlbWFpbmluZygpICh0aGUgYXJjaCBmdW5jdGlvbiBJIGhhdmUKPj4g aW4gbXkgc2VyaWVzLCB3aGljaCBkZWZhdWx0cyB0byBvbmUpLiAKPiAKPiBKdXN0IGRvdWJsZS1j aGVja2luZywgaG93IHdvdWxkIGl0IHVzZSBwdGVfYmF0Y2hfcmVtYWluaW5nKCkgPwoKSSB0aGlu ayBzb21ldGhpbmcgbGlrZSB0aGlzIHdvdWxkIGRvIGl0ICh1bnRlc3RlZCk6CgpzdGF0aWMgaW5s aW5lIGludCBmb2xpb19wdGVfYmF0Y2goc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9u ZyBhZGRyLAoJCXB0ZV90ICpzdGFydF9wdGVwLCBwdGVfdCBwdGUsIGludCBtYXhfbnIpCnsKCXVu c2lnbmVkIGxvbmcgZm9saW9fZW5kX3BmbiA9IGZvbGlvX3Bmbihmb2xpbykgKyBmb2xpb19ucl9w YWdlcyhmb2xpbyk7CglwdGVfdCBleHBlY3RlZF9wdGUgPSBwdGVfbmV4dF9wZm4ocHRlKTsKCXB0 ZV90ICpwdGVwID0gc3RhcnRfcHRlcDsKCWludCBucjsKCglmb3IgKDs7KSB7CgkJbnIgPSBtaW4o bWF4X25yLCBwdGVfYmF0Y2hfcmVtYWluaW5nKCkpOwoJCXB0ZXAgKz0gbnI7CgkJbWF4X25yIC09 IG5yOwoKCQlpZiAobWF4X25yID09IDApCgkJCWJyZWFrOwoKCQlwdGUgPSBwdGVwX2dldChwdGVw KTsKCgkJLyogRG8gYWxsIFBURSBiaXRzIG1hdGNoLCBhbmQgdGhlIFBGTiBpcyBjb25zZWN1dGl2 ZT8gKi8KCQlpZiAoIXB0ZV9zYW1lKHB0ZSwgZXhwZWN0ZWRfcHRlKSkKCQkJYnJlYWs7CgoJCS8q CgkJICogU3RvcCBpbW1lZGlhdGVseSBvbmNlIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZm9s aW8uIEluCgkJICogY29ybmVyIGNhc2VzIHRoZSBuZXh0IFBGTiBtaWdodCBmYWxsIGludG8gYSBk aWZmZXJlbnQKCQkgKiBmb2xpby4KCQkgKi8KCQlpZiAocHRlX3BmbihwdGUpID09IGZvbGlvX2Vu ZF9wZm4gLSAxKQoJCQlicmVhazsKCgkJZXhwZWN0ZWRfcHRlID0gcHRlX25leHRfcGZuKGV4cGVj dGVkX3B0ZSk7Cgl9CgoJcmV0dXJuIHB0ZXAgLSBzdGFydF9wdGVwOwp9CgpPZiBjb3Vyc2UsIGlm IHdlIGhhdmUgdGhlIGNvbmNlcHQgb2YgYSAicHRlIGJhdGNoIiBpbiB0aGUgY29yZS1tbSwgdGhl biB3ZSBtaWdodAp3YW50IHRvIGNhbGwgdGhlIGFyY2gncyB0aGluZyBzb21ldGhpbmcgZGlmZmVy ZW50OyBwdGUgc3Bhbj8gcHRlIGNvbnQ/IHB0ZSBjb250CmJhdGNoPyAuLi4KCgo+IAo+PiBUaGVu IGRvIGEgc2ltaWxhciB0aGluZyB0byB3aGF0IHlvdSBoYXZlCj4+IGRvbmUgZm9yIGZvcmsgaW4g emFwX3B0ZV9yYW5nZSgpIC0gYWxzbyB1c2luZyBmb2xpb19wdGVfYmF0Y2goKS4gVGhlbiBsYXkg bXkKPj4gc2VyaWVzIG9uIHRvcC4KPiAKPiBZZXMsIHdlIHNob3VsZCBwcm9iYWJseSB0cnkgdG8g aGFuZGxlIHRoZSB6YXBwaW5nIHBhcnQgc2ltaWxhcmx5OiBtYWtlIGl0Cj4gYmVuZWZpdCBhbGwg YXJjaHMgZmlyc3QsIHRoZW4gc3BlY2lhbC1jYXNlIG9uIGNvbnQtcHRlLiBJIGNhbiBoZWxwIHRo ZXJlIGFzIHdlbGwuCgpPSyBncmVhdC4KCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0t a2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==