Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vnWMb-008JWh-2m for pgsql-hackers@arkaria.postgresql.org; Wed, 04 Feb 2026 06:27:46 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vnWMa-009WmS-2p for pgsql-hackers@arkaria.postgresql.org; Wed, 04 Feb 2026 06:27:44 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vnWMa-009WmK-1h for pgsql-hackers@lists.postgresql.org; Wed, 04 Feb 2026 06:27:44 +0000 Received: from mail-vs1-xe33.google.com ([2607:f8b0:4864:20::e33]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vnWMX-00000000ytH-3Fuh for pgsql-hackers@lists.postgresql.org; Wed, 04 Feb 2026 06:27:44 +0000 Received: by mail-vs1-xe33.google.com with SMTP id ada2fe7eead31-5f547823192so2181154137.0 for ; Tue, 03 Feb 2026 22:27:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1770186460; cv=none; d=google.com; s=arc-20240605; b=bNFT1Eq3YY48Z7+027lM9lte53ovl/XJ2kXb9MABs5wYRunIZgggRKY4LdCkjYeKR+ Aki4rMqfYelWGIVMrdDEpu15ovbf5cJ1EFKPOyjog9/LtyEC33IxKX7OX48XFvvT504p KkQYihgya0Fbaz4QGyvuwmZuA33Q1sXre1yiFVZk/hi8/AWcc8D+dHqHTcVrfyCRb4t9 PBhYxWEGcMBmJgOrmQ3tKYz+0yLgdaUCyyVNCTn+ao/MoWheMon8AAAEozlRpmyQld3T iJNMNZMXasL6wsua6MnvGcmcQDcAzSrSeoqR6JQNu+C6JELHa7nFZdfJJJScSkcl4lDR 500g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=T/PUTmJlo23zF/VjI3Z8QfAbSvMF+EmLWJ+vzrpyPzs=; fh=tvS4T4+oR2J2hxK5aNJGfORVVBBvqUJPnvm76ijROZw=; b=XzCKFXfRZgoBJNJJOJKF8eV7Wf+XFHFPz2nEo835ZRx5f2dZZuEXYOS5e9FK0hV0IO RAu0Yfm15yjIE/cA1d6AkEJAXjAVtj3CsV3Y3zOQEfrPEIyWiHfWoreHWIX+rLC5U7FJ SAjWWnqG7p80ITLL2miLyQ2MTYaqs1eME5Jrh3hfS/GAw2cE4NiL6xyH53LLcONkgYj7 HfyC8gpQu1YpnFSMJ+pYWsdF6eQwBKbWDmNVXqJceRz4q/JBbAbeDhD0s/b3AEfWJjAB +NXnL6+JqP7y4AsKbx0YfaNMqraMZ5FIJthaKTf4+upBPV/UWPWrv1tIMHZBE7vr4T4d HM4w==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770186460; x=1770791260; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=T/PUTmJlo23zF/VjI3Z8QfAbSvMF+EmLWJ+vzrpyPzs=; b=IkNqYMg3kTnK+rG7/PUzoLqR0beGIveB9gb6/Aozm6AVGQGgSvWqvzpplP+ZfKXk50 thrLa1Yo2umojF5LnBDlPH5jJ7FqgUfV01vL06IyNx3pCoBAAD/Z6Fk6u92Hb08vUvjW 6chicJ/+vNBhZ7CjORma1WqNhxNn+cR6N1c7xH4ghOM6VgTCn8hrG8uYz9yXoeKp0M8r ot+yWARMH7TKhKMmPv/ExjNRv3XI0tREH/gxQccisy4JY6AXzl4FhOGG1OLLkPEI4Tou 1TkXQ0TeDF5wxjezVJw4JcyrUvr8bDsBMUuFZbt/uLMwPWVX4z517dh6VvZGzIIl63t8 1t9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770186460; x=1770791260; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=T/PUTmJlo23zF/VjI3Z8QfAbSvMF+EmLWJ+vzrpyPzs=; b=fSrVIy5hH/Gam6NeWIn76vMQIAoRxjwYYjN+fyw5S0tZZDAH1wT0og3aryDmZx0H7u jFEHRZyLZbMaOFu39H6kT+qNFoiZqBP6CHXpfNtiGp0Zo99TBSTZrIXNJEgSo89Jrj86 k11uUDe13PL/D/9b1e5xLf5FqES9YO9YZULi+jobJ8ARlpRYEbCrBNVhjadUXefeX+MZ TUEiG90FtLugLzE72ytTF2wVY1f/89OpX4QHcgODR74Zsq7O28sStVeGi/xaN0dZ3UYz wrtqgBXbk7p893rGRlh2KFlgaRg8Erv7FF7GyfYZ+yqTkH8ii/3uAAH6sRDbTFmVgH0L axuw== X-Gm-Message-State: AOJu0Ywp9wXB4vN7N9iZsYd3ukGgc05MLVH4ri5jJcxH5DJUrpArTZuz bmvJNYAGhcYRY+rKIp2whUjKyhjgantHewHsqa2eNpQfi61Z9nDbZYNN67k51FSsbQSJLXELGgy /rc/DuePmMaiUSDq5yWKr/R4TW7bb3I/1PFsgVbbUQQ== X-Gm-Gg: AZuq6aLbTLETC/7+JQcrL8MmSopb5nYb9BYYcweQE0Rbc6ADMMzXVJoluqDifv7ueAP 9OXhe0XPuB6GeAYGPZ/pDE29PbLOxryGbMm/yC1OYNCceCBraqBt0gadEAurgsh1v43YSc8X0A1 /2eSVFb4d7tCPpqcg2BhCBRaBAM5nFkdEWTTAoXJhU3H0sbJ6kTbR/5VMGg08Jp3N3wMv3Oa28b rG698F3KveO4WKecupM7GKkC4SukipwXOWDUGrSaG/EAeoTjbgP5QJg42CcS6tx5SP9zisvyb2X gVitRFky+P7hL/m6O/s8xXMmRUpz1TffDnEtuohIoBGQJwCsCt/3SQxoCF3hlYeBQG9wd4svIrV xNvM087xcJQnlEknNonszldxOA63b3RvPLPXG6WBcbvxvN7Fxs+/7GistzrhbBFvQ/38T20yRd6 4x5pKMDtqZag== X-Received: by 2002:a05:6102:3e8a:b0:5f8:e2d0:4b24 with SMTP id ada2fe7eead31-5f93945d4dfmr578902137.3.1770186460073; Tue, 03 Feb 2026 22:27:40 -0800 (PST) MIME-Version: 1.0 References: <202601311716.jeczqdjsmh57@alvherre.pgsql> In-Reply-To: <202601311716.jeczqdjsmh57@alvherre.pgsql> From: jian he Date: Wed, 4 Feb 2026 14:27:03 +0800 X-Gm-Features: AZwV_QiOtddGmR7Y7ytFqSLp1-PZlyj5KIlhttTYxHvlfi7_QlT6CMPdnJWxkZk Message-ID: Subject: Re: using index to speedup add not null constraints to a table To: =?UTF-8?Q?=C3=81lvaro_Herrera?= Cc: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="00000000000023b0b00649f9a749" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000023b0b00649f9a749 Content-Type: text/plain; charset="UTF-8" hi. Please check the attached v10. Turns out regress test is doable, I just need to SET client_min_messages TO DEBUG1; It is now implemented as a single static function, index_check_notnull, located in tablecmd.c. I believe I have addressed all of your other points as well. -- jian https://www.enterprisedb.com/ --00000000000023b0b00649f9a749 Content-Type: text/x-patch; charset="US-ASCII"; name="v10-0001-using-indexscan-to-speedup-add-not-null-constraints.patch" Content-Disposition: attachment; filename="v10-0001-using-indexscan-to-speedup-add-not-null-constraints.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ml7n9yn70 RnJvbSAyOWRmN2VmZGE3NzExODliMGYzZDFkNTk3NjJkNzQ4NTQ5ZmVmMDBjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBqaWFuIGhlIDxqaWFuLnVuaXZlcnNhbGl0eUBnbWFpbC5jb20+ CkRhdGU6IFdlZCwgNCBGZWIgMjAyNiAxMzo1Mzo0NCArMDgwMApTdWJqZWN0OiBbUEFUQ0ggdjEw IDEvMV0gdXNpbmcgaW5kZXhzY2FuIHRvIHNwZWVkdXAgYWRkIG5vdCBudWxsIGNvbnN0cmFpbnRz CgpUaGlzIHBhdGNoIHRyaWVzIHRvIHVzZSBpbmRleF9iZWdpbnNjYW4oKSAvIGluZGV4X2dldG5l eHQoKSAvIGluZGV4X2VuZHNjYW4oKQptZW50aW9uZWQgaW4gWzFdIHRvIHNwZWVkdXAgYWRkaW5n IG5vdC1udWxsIGNvbnN0cmFpbnRzIHRvIHRoZSBleGlzdGluZyB0YWJsZS4KClRoZSBtYWluIGxv Z2ljIGhhcHBlbnMgaW4gcGhhc2UzIEFUUmV3cml0ZVRhYmxlCjEuIGNvbGxlY3QgYWxsIG5vdC1u dWxsIGNvbnN0cmFpbnRzLgoyLiBGb3IgZWFjaCBub3QtbnVsbCBjb25zdHJhaW50LCBjaGVjayB3 aGV0aGVyIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBpbmRleAphdmFpbGFibGUgZm9yIHZhbGlk YXRpb24uIElmIG5vdCwgdGhlbiBjYW5ub3QgdXNlIGluZGV4c2NhbiBtZWNoYW5pc20gdG8gdmVy aWZ5IG5vdC1udWxsCmNvbnN0cmFpbnRzLgozLiBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25k aXRpb25zIGFyZSB0cnVlCiAgKiB0YWJsZSBzY2FuIG9yIHJld3JpdGUgaXMgcmVxdWlyZWQsCiAg KiB0YWJsZSB3YXNuJ3QgbG9ja2VkIHdpdGggYEFjY2Vzc0V4Y2x1c2l2ZUxvY2tgCiAgKiB0aGUg Tk9UIE5VTEwgY29uc3RyYWludCBhcHBsaWVzIHRvIGEgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1u CiB0aGVuIGluZGV4IHNjYW4gY2Fubm90IGJlIHVzZWQgZm9yIGZhc3QgdmFsaWRhdGlvbi4KSWYg YWxsIGNvbmRpdGlvbnMgYXJlIHNhdGlzZmllZCwgYXR0ZW1wdCB0byB1c2UgaW5kZXhzY2FuIHRv IHZlcmlmeSB3aGV0aGVyIHRoZQpjb2x1bW4gY29udGFpbnMgYW55IE5VTEwgdmFsdWVzLgoKY29u Y3VycmVuY3kgY29uY2VybjoKQUxURVIgVEFCTEUgU0VUIE5PVCBOVUxMIHdpbGwgdGFrZSBhbiBB Q0NFU1MgRVhDTFVTSVZFIGxvY2ssIHNvIHRoZXJlIGlzIGxlc3MKdmFyaWFudCBvZiByYWNpbmcg aXNzdWUgY2FuIG9jY3VyPyAgdG8gcHJvdmUgYWNjdXJhdGUsIEkgd3JvdGUgc29tZSBpc29sYXRp b24KdGVzdHMuIHNlZVsyXQoKcmVmZXJlbmNlczoKWzFdIGh0dHBzOi8vcG9zdGdyLmVzL20vQ0El MkJUZ21vYTVOS3o4aUdXXzl2N3d6JTNELSUyQnpRRnUlM0RFNFNab2FUYVUxem5MYUVYUllwLVEl NDBtYWlsLmdtYWlsLmNvbQpbMl0gaHR0cHM6Ly9wb3N0Z3IuZXMvbS85MDAwNTZEMS0zMkRGLTQ5 MjctODI1MS0zRTBDMERDNDA3RkQlNDBhbmFyYXplbC5kZQoKZGlzY3Vzc2lvbjogaHR0cHM6Ly9w b3N0Z3IuZXMvbS9DQUNKdWZ4RmlXPTRrMWlzPUYxSj1yLUN4MVJ1QnlYUVBVcldCMzMxVTQ3clNu R3oraHdAbWFpbC5nbWFpbC5jb20KY29tbWl0ZmVzdCBlbnRyeTogaHR0cHM6Ly9jb21taXRmZXN0 LnBvc3RncmVzcWwub3JnL3BhdGNoLzU0NDQKLS0tCiBzcmMvYmFja2VuZC9jb21tYW5kcy90YWJs ZWNtZHMuYyAgICAgICAgICB8IDI4NSArKysrKysrKysrKysrKysrKysrKystCiBzcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL2NvbnN0cmFpbnRzLm91dCB8ICA2NCArKysrKwogc3JjL3Rlc3QvcmVn cmVzcy9zcWwvY29uc3RyYWludHMuc3FsICAgICAgfCAgNDYgKysrKwogMyBmaWxlcyBjaGFuZ2Vk LCAzODkgaW5zZXJ0aW9ucygrKSwgNiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxlY21k cy5jCmluZGV4IGY5NzZjMGU1YzdlLi40OWRiYzY5MGU5MCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvY29tbWFuZHMvdGFibGVjbWRzLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVj bWRzLmMKQEAgLTIxMCwxNiArMjEwLDE5IEBAIHR5cGVkZWYgc3RydWN0IEFsdGVyZWRUYWJsZUlu Zm8KIAlMaXN0CSAgICpjaGFuZ2VkU3RhdGlzdGljc0RlZnM7CS8qIHN0cmluZyBkZWZpbml0aW9u cyBvZiBzYW1lICovCiB9IEFsdGVyZWRUYWJsZUluZm87CiAKLS8qIFN0cnVjdCBkZXNjcmliaW5n IG9uZSBuZXcgY29uc3RyYWludCB0byBjaGVjayBpbiBQaGFzZSAzIHNjYW4gKi8KLS8qIE5vdGU6 IG5ldyBub3QtbnVsbCBjb25zdHJhaW50cyBhcmUgaGFuZGxlZCBlbHNld2hlcmUgKi8KKy8qCisg KiBTdHJ1Y3QgZGVzY3JpYmluZyBvbmUgbmV3IGNvbnN0cmFpbnQgdG8gY2hlY2sgaW4gUGhhc2Ug MyBzY2FuLiBOb3RlOiBuZXcKKyAqIG5vdC1udWxsIGNvbnN0cmFpbnRzIGFyZSBoYW5kbGVkIGhl cmUgdG9vLgorKi8KIHR5cGVkZWYgc3RydWN0IE5ld0NvbnN0cmFpbnQKIHsKIAljaGFyCSAgICpu YW1lOwkJCS8qIENvbnN0cmFpbnQgbmFtZSwgb3IgTlVMTCBpZiBub25lICovCi0JQ29uc3RyVHlw ZQljb250eXBlOwkJLyogQ0hFQ0sgb3IgRk9SRUlHTiAqLworCUNvbnN0clR5cGUJY29udHlwZTsJ CS8qIENIRUNLIG9yIEZPUkVJR04gb3IgTk9UIE5VTEwgKi8KIAlPaWQJCQlyZWZyZWxpZDsJCS8q IFBLIHJlbCwgaWYgRk9SRUlHTiAqLwogCU9pZAkJCXJlZmluZGlkOwkJLyogT0lEIG9mIFBLJ3Mg aW5kZXgsIGlmIEZPUkVJR04gKi8KIAlib29sCQljb253aXRocGVyaW9kOwkvKiBXaGV0aGVyIHRo ZSBuZXcgRk9SRUlHTiBLRVkgdXNlcyBQRVJJT0QgKi8KIAlPaWQJCQljb25pZDsJCQkvKiBPSUQg b2YgcGdfY29uc3RyYWludCBlbnRyeSwgaWYgRk9SRUlHTiAqLworCWludAkJCWF0dG51bTsJCQkv KiBOT1QgTlVMTCBjb25zdHJhaW50IGF0dHJpYnV0ZSBudW1iZXIgKi8KIAlOb2RlCSAgICpxdWFs OwkJCS8qIENoZWNrIGV4cHIgb3IgQ09OU1RSX0ZPUkVJR04gQ29uc3RyYWludCAqLwogCUV4cHJT dGF0ZSAgKnF1YWxzdGF0ZTsJCS8qIEV4ZWN1dGlvbiBzdGF0ZSBmb3IgQ0hFQ0sgZXhwciAqLwog fSBOZXdDb25zdHJhaW50OwpAQCAtNzQ1LDYgKzc0OCw3IEBAIHN0YXRpYyB2b2lkIEFURXhlY01l cmdlUGFydGl0aW9ucyhMaXN0ICoqd3F1ZXVlLCBBbHRlcmVkVGFibGVJbmZvICp0YWIsIFJlbGF0 aW9uCiBzdGF0aWMgdm9pZCBBVEV4ZWNTcGxpdFBhcnRpdGlvbihMaXN0ICoqd3F1ZXVlLCBBbHRl cmVkVGFibGVJbmZvICp0YWIsCiAJCQkJCQkJCSBSZWxhdGlvbiByZWwsIFBhcnRpdGlvbkNtZCAq Y21kLAogCQkJCQkJCQkgQWx0ZXJUYWJsZVV0aWxpdHlDb250ZXh0ICpjb250ZXh0KTsKK3N0YXRp YyBib29sIGluZGV4X2NoZWNrX25vdG51bGwoUmVsYXRpb24gcmVsYXRpb24sIExpc3QgKm5vdG51 bGxfYXR0bnVtcyk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCQlEZWZpbmVSZWxhdGlvbgpAQCAtNjIxNyw2 ICs2MjIxLDkgQEAgQVRSZXdyaXRlVGFibGUoQWx0ZXJlZFRhYmxlSW5mbyAqdGFiLCBPaWQgT0lE TmV3SGVhcCkKIAkJCQluZWVkc2NhbiA9IHRydWU7CiAJCQkJY29uLT5xdWFsc3RhdGUgPSBFeGVj UHJlcGFyZUV4cHIoKEV4cHIgKikgZXhwYW5kX2dlbmVyYXRlZF9jb2x1bW5zX2luX2V4cHIoY29u LT5xdWFsLCBvbGRyZWwsIDEpLCBlc3RhdGUpOwogCQkJCWJyZWFrOworCQkJY2FzZSBDT05TVFJf Tk9UTlVMTDoKKwkJCQkvKiBOb3RoaW5nIHRvIGRvIGhlcmUgKi8KKwkJCQlicmVhazsKIAkJCWNh c2UgQ09OU1RSX0ZPUkVJR046CiAJCQkJLyogTm90aGluZyB0byBkbyBoZXJlICovCiAJCQkJYnJl YWs7CkBAIC02MjcwLDEwICs2Mjc3LDc4IEBAIEFUUmV3cml0ZVRhYmxlKEFsdGVyZWRUYWJsZUlu Zm8gKnRhYiwgT2lkIE9JRE5ld0hlYXApCiAJCQkJCQkJCQkJCQkJCXdob2xlYXR0LT5hdHRudW0p OwogCQkJfQogCQl9Ci0JCWlmIChub3RudWxsX2F0dHJzIHx8IG5vdG51bGxfdmlydHVhbF9hdHRy cykKLQkJCW5lZWRzY2FuID0gdHJ1ZTsKIAl9CiAKKwkvKgorCSAqIFRoZSBjb25kaXRpb25zIGZv ciB1c2luZyBpbmRleHNjYW4gbWVjaGFuaXNtIGZhc3QgdmVyaWZ5aW5nIG5vdC1udWxsCisJICog Y29uc3RyYWludHMgYXJlIHF1aXRlIHN0cmljdC4gQWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0 aW9ucyBtdXN0IGJlCisJICogbWV0LgorCSAqCisJICogMS4gQWx0ZXJlZFRhYmxlSW5mby0+dmVy aWZ5X25ld19ub3RudWxsIGlzIHRydWUuCisJICoKKwkgKiAyLiBJZiB0YWJsZSBzY2FuIChmb3Ig b3RoZXIgcmVhc29uLCBsaWtlIGNoZWNrIGNvbnN0cmFpbnQgdmVyaWZpY2F0aW9uKQorCSAqIG9y IHRhYmxlIHJld3JpdGUgaXMgZXhwZWN0ZWQgbGF0ZXIsIHVzaW5nIGluZGV4c2NhbiBpcyBqdXN0 IHdhc3RlcworCSAqIGN5Y2xlcy4KKwkgKgorCSAqIDMuIEluZGV4ZXMgY2Fubm90IGJlIGNyZWF0 ZWQgb24gdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1ucywgc28gZmFzdAorCSAqIGNoZWNraW5nIG5v dC1udWxsIGNvbnN0cmFpbnRzIGlzIG5vdCBhcHBsaWNhYmxlIHRvIHRoZW0uCisJICoKKwkgKiA0 LiBUaGlzIGFwcGxpZXMgdG8gcGxhaW4gcmVsYXRpb25zIG9ubHkuCisJICoKKwkgKiA1LiBUbyBw cmV2ZW50IHBvc3NpYmxlIGNvbmN1cnJlbmN5IGlzc3VlcywgdGhlIHRhYmxlIG11c3QgYWxyZWFk eSBiZQorCSAqIGxvY2tlZCB3aXRoIGFuIEFjY2Vzc0V4Y2x1c2l2ZUxvY2ssIHdoaWNoIGlzIHRo ZSBsb2NrIG9idGFpbmVkIGR1cmluZworCSAqIEFMVEVSIFRBQkxFIFNFVCBOT1QgTlVMTC4KKwkg Ki8KKwlpZiAoIW5lZWRzY2FuICYmCisJCW5ld3JlbCA9PSBOVUxMICYmCisJCXRhYi0+dmVyaWZ5 X25ld19ub3RudWxsICYmCisJCW5vdG51bGxfdmlydHVhbF9hdHRycyA9PSBOSUwgJiYKKwkJb2xk cmVsLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9SRUxBVElPTiAmJgorCQlDaGVja1JlbGF0 aW9uTG9ja2VkQnlNZShvbGRyZWwsIEFjY2Vzc0V4Y2x1c2l2ZUxvY2ssIGZhbHNlKSkKKwl7CisJ CUxpc3QJICAgKm5vdG51bGxfYXR0bnVtcyA9IE5JTDsKKworCQlBc3NlcnQoIXRhYi0+cmV3cml0 ZSk7CisKKwkJZm9yZWFjaChsLCB0YWItPmNvbnN0cmFpbnRzKQorCQl7CisJCQlGb3JtX3BnX2F0 dHJpYnV0ZSBhdHRyOworCQkJTmV3Q29uc3RyYWludCAqY29uID0gbGZpcnN0KGwpOworCisJCQkv KgorCQkJICogVGhpcyBtYXkgYmUgYSBGT1JFSUdOIEtFWSAoZXZlbiBpZiBub3QgYSBDSEVDSyBj b25zdHJhaW50KSwKKwkJCSAqIHRoZXJlZm9yZSB3ZSBjYW5ub3QganVzdCByYWlzZSBlcnJvciBm b3Igbm9uLU5PVC1OVUxMCisJCQkgKiBjb25zdHJhaW50LgorCQkJICovCisJCQlpZiAoY29uLT5j b250eXBlICE9IENPTlNUUl9OT1ROVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQlhdHRyID0gVHVw bGVEZXNjQXR0cihuZXdUdXBEZXNjLCBjb24tPmF0dG51bSAtIDEpOworCisJCQlpZiAoYXR0ci0+ YXR0aXNkcm9wcGVkKQorCQkJCWNvbnRpbnVlOworCisJCQlBc3NlcnQoYXR0ci0+YXR0bm90bnVs bCk7CisJCQlBc3NlcnQoYXR0ci0+YXR0bnVtID09IGNvbi0+YXR0bnVtKTsKKwkJCUFzc2VydChh dHRyLT5hdHRnZW5lcmF0ZWQgIT0gQVRUUklCVVRFX0dFTkVSQVRFRF9WSVJUVUFMKTsKKworCQkJ bm90bnVsbF9hdHRudW1zID0gbGlzdF9hcHBlbmRfdW5pcXVlX2ludChub3RudWxsX2F0dG51bXMs CisJCQkJCQkJCQkJCQkJIGF0dHItPmF0dG51bSk7CisJCX0KKworCQlpZiAobm90bnVsbF9hdHRu dW1zICE9IE5JTCkKKwkJeworCQkJaWYgKGluZGV4X2NoZWNrX25vdG51bGwob2xkcmVsLCBub3Ru dWxsX2F0dG51bXMpKQorCQkJCWVyZXBvcnQoREVCVUcxLAorCQkJCQkJZXJybXNnX2ludGVybmFs KCJhbGwgbmV3IG5vdC1udWxsIGNvbnN0cmFpbnRzIG9uIHJlbGF0aW9uIFwiJXNcIiBoYXZlIGJl ZW4gdmFsaWRhdGVkIGJ5IHVzaW5nIGluZGV4IHNjYW4iLAorCQkJCQkJCQkJCVJlbGF0aW9uR2V0 UmVsYXRpb25OYW1lKG9sZHJlbCkpKTsKKwkJCWVsc2UKKwkJCQluZWVkc2NhbiA9IHRydWU7CisJ CX0KKwl9CisJZWxzZSBpZiAobm90bnVsbF9hdHRycyB8fCBub3RudWxsX3ZpcnR1YWxfYXR0cnMp CisJCW5lZWRzY2FuID0gdHJ1ZTsKKwogCWlmIChuZXdyZWwgfHwgbmVlZHNjYW4pCiAJewogCQlF eHByQ29udGV4dCAqZWNvbnRleHQ7CkBAIC03OTQ5LDYgKzgwMjQsNyBAQCBBVEV4ZWNTZXROb3RO dWxsKExpc3QgKip3cXVldWUsIFJlbGF0aW9uIHJlbCwgY2hhciAqY29uTmFtZSwgY2hhciAqY29s TmFtZSwKIAlDb29rZWRDb25zdHJhaW50ICpjY29uOwogCUxpc3QJICAgKmNvb2tlZDsKIAlib29s CQlpc19ub19pbmhlcml0ID0gZmFsc2U7CisJQWx0ZXJlZFRhYmxlSW5mbyAqdGFiID0gQVRHZXRR dWV1ZUVudHJ5KHdxdWV1ZSwgcmVsKTs7CiAKIAkvKiBHdWFyZCBhZ2FpbnN0IHN0YWNrIG92ZXJm bG93IGR1ZSB0byBvdmVybHkgZGVlcCBpbmhlcml0YW5jZSB0cmVlLiAqLwogCWNoZWNrX3N0YWNr X2RlcHRoKCk7CkBAIC04MDc3LDYgKzgxNTMsMjUgQEAgQVRFeGVjU2V0Tm90TnVsbChMaXN0ICoq d3F1ZXVlLCBSZWxhdGlvbiByZWwsIGNoYXIgKmNvbk5hbWUsIGNoYXIgKmNvbE5hbWUsCiAJY29v a2VkID0gQWRkUmVsYXRpb25OZXdDb25zdHJhaW50cyhyZWwsIE5JTCwgbGlzdF9tYWtlMShjb25z dHJhaW50KSwKIAkJCQkJCQkJCSAgIGZhbHNlLCAhcmVjdXJzaW5nLCBmYWxzZSwgTlVMTCk7CiAJ Y2NvbiA9IGxpbml0aWFsKGNvb2tlZCk7CisKKwlBc3NlcnQoY2Nvbi0+Y29udHlwZSA9PSBDT05T VFJfTk9UTlVMTCk7CisKKwkvKgorCSAqIFdlIG1heSB1c2luZyBpbmRleHNjYW4gbWVjaGFuaXNt IHRvIHZlcnRpZnkgdGhpcyBub3QtbnVsbCBjb25zdHJhaW50IGluCisJICogUGhhc2UzLiAgQWRk IHRoaXMgdG8tYmUtdmFsaWRhdGVkIG5vdC1udWxsIGNvbnN0cmFpbnQgdG8gUGhhc2UgMydzCisJ ICogcXVldWUuCisJICovCisJaWYgKCFjY29uLT5za2lwX3ZhbGlkYXRpb24pCisJeworCQlOZXdD b25zdHJhaW50ICpuZXdjb24gPSBwYWxsb2MwX29iamVjdChOZXdDb25zdHJhaW50KTsKKworCQlu ZXdjb24tPm5hbWUgPSBjY29uLT5uYW1lOworCQluZXdjb24tPmNvbnR5cGUgPSBDT05TVFJfTk9U TlVMTDsKKwkJbmV3Y29uLT5hdHRudW0gPSBjY29uLT5hdHRudW07CisKKwkJdGFiLT5jb25zdHJh aW50cyA9IGxhcHBlbmQodGFiLT5jb25zdHJhaW50cywgbmV3Y29uKTsKKwl9CisKIAlPYmplY3RB ZGRyZXNzU2V0KGFkZHJlc3MsIENvbnN0cmFpbnRSZWxhdGlvbklkLCBjY29uLT5jb25vaWQpOwog CiAJSW52b2tlT2JqZWN0UG9zdEFsdGVySG9vayhSZWxhdGlvblJlbGF0aW9uSWQsCkBAIC05OTgz LDEzICsxMDA3OCwxNSBAQCBBVEFkZENoZWNrTk5Db25zdHJhaW50KExpc3QgKip3cXVldWUsIEFs dGVyZWRUYWJsZUluZm8gKnRhYiwgUmVsYXRpb24gcmVsLAogCXsKIAkJQ29va2VkQ29uc3RyYWlu dCAqY2NvbiA9IChDb29rZWRDb25zdHJhaW50ICopIGxmaXJzdChsY29uKTsKIAotCQlpZiAoIWNj b24tPnNraXBfdmFsaWRhdGlvbiAmJiBjY29uLT5jb250eXBlICE9IENPTlNUUl9OT1ROVUxMKQor CQlpZiAoIWNjb24tPnNraXBfdmFsaWRhdGlvbikKIAkJewogCQkJTmV3Q29uc3RyYWludCAqbmV3 Y29uOwogCiAJCQluZXdjb24gPSBwYWxsb2MwX29iamVjdChOZXdDb25zdHJhaW50KTsKIAkJCW5l d2Nvbi0+bmFtZSA9IGNjb24tPm5hbWU7CiAJCQluZXdjb24tPmNvbnR5cGUgPSBjY29uLT5jb250 eXBlOworCQkJaWYgKGNjb24tPmNvbnR5cGUgPT0gQ09OU1RSX05PVE5VTEwpCisJCQkJbmV3Y29u LT5hdHRudW0gPSBjY29uLT5hdHRudW07CiAJCQluZXdjb24tPnF1YWwgPSBjY29uLT5leHByOwog CiAJCQl0YWItPmNvbnN0cmFpbnRzID0gbGFwcGVuZCh0YWItPmNvbnN0cmFpbnRzLCBuZXdjb24p OwpAQCAtMTMyNTgsNiArMTMzNTUsNyBAQCBRdWV1ZU5OQ29uc3RyYWludFZhbGlkYXRpb24oTGlz dCAqKndxdWV1ZSwgUmVsYXRpb24gY29ucmVsLCBSZWxhdGlvbiByZWwsCiAJTGlzdAkgICAqY2hp bGRyZW4gPSBOSUw7CiAJQXR0ck51bWJlcglhdHRudW07CiAJY2hhcgkgICAqY29sbmFtZTsKKwlO ZXdDb25zdHJhaW50ICpuZXdjb247CiAKIAljb24gPSAoRm9ybV9wZ19jb25zdHJhaW50KSBHRVRT VFJVQ1QoY29udHVwbGUpOwogCUFzc2VydChjb24tPmNvbnR5cGUgPT0gQ09OU1RSQUlOVF9OT1RO VUxMKTsKQEAgLTEzMzIxLDcgKzEzNDE5LDE5IEBAIFF1ZXVlTk5Db25zdHJhaW50VmFsaWRhdGlv bihMaXN0ICoqd3F1ZXVlLCBSZWxhdGlvbiBjb25yZWwsIFJlbGF0aW9uIHJlbCwKIAkvKiBTZXQg YXR0bm90bnVsbCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgcXVldWVpbmcgYW5vdGhlciB2YWxpZGF0 aW9uICovCiAJc2V0X2F0dG5vdG51bGwoTlVMTCwgcmVsLCBhdHRudW0sIHRydWUsIGZhbHNlKTsK IAorCS8qCisJICogUXVldWUgdmFsaWRhdGlvbiBmb3IgcGhhc2UgMy4gQUxURVIgVEFCTEUgU0VU IE5PVCBOVUxMIGFkZHMgYSBOT1QgTlVMTAorCSAqIGNvbnN0cmFpbnQgdG8gQWx0ZXJlZFRhYmxl SW5mby0+Y29uc3RyYWludHMsIGZvciBjb25zaXN0ZW5jeSwgZG8gdGhlCisJICogc2FtZSBoZXJl LgorCSAqLworCW5ld2NvbiA9IHBhbGxvYzBfb2JqZWN0KE5ld0NvbnN0cmFpbnQpOworCW5ld2Nv bi0+bmFtZSA9IGNvbG5hbWU7CisJbmV3Y29uLT5jb250eXBlID0gQ09OU1RSX05PVE5VTEw7CisJ bmV3Y29uLT5hdHRudW0gPSBhdHRudW07CisKKwkvKiBGaW5kIG9yIGNyZWF0ZSB3b3JrIHF1ZXVl IGVudHJ5IGZvciB0aGlzIHRhYmxlICovCiAJdGFiID0gQVRHZXRRdWV1ZUVudHJ5KHdxdWV1ZSwg cmVsKTsKKwl0YWItPmNvbnN0cmFpbnRzID0gbGFwcGVuZCh0YWItPmNvbnN0cmFpbnRzLCBuZXdj b24pOwogCXRhYi0+dmVyaWZ5X25ld19ub3RudWxsID0gdHJ1ZTsKIAogCS8qCkBAIC0yMzM0MCwz ICsyMzQ1MCwxNjYgQEAgQVRFeGVjU3BsaXRQYXJ0aXRpb24oTGlzdCAqKndxdWV1ZSwgQWx0ZXJl ZFRhYmxlSW5mbyAqdGFiLCBSZWxhdGlvbiByZWwsCiAJLyogUmVzdG9yZSB0aGUgdXNlcmlkIGFu ZCBzZWN1cml0eSBjb250ZXh0LiAqLwogCVNldFVzZXJJZEFuZFNlY0NvbnRleHQoc2F2ZV91c2Vy aWQsIHNhdmVfc2VjX2NvbnRleHQpOwogfQorCisvKgorICogbm90bnVsbF9hdHRudW1zOiBsaXN0 IG9mIGF0dHJpYnV0ZSBudW1iZXJzIGZvciBhbGwgbmV3bHkgYWRkZWQgTk9UIE5VTEwKKyAqIGNv bnN0cmFpbnRzLgorICoKKyAqIEZvciBlYWNoIE5PVCBOVUxMIGF0dHJpYnV0ZSwgZmlyc3QgY2hl Y2sgd2hldGhlciB0aGUgcmVsYXRpb24gaGFzIGEgc3VpdGFibGUKKyAqIGluZGV4IHRvIGZldGNo IHRoYXQgYXR0cmlidXRlIGNvbnRlbnQuIElmIHNvLCB1c2luZyBpbmRleHNjYW4gdG8gdmVyaWZ5 IHRoYXQKKyAqIGF0dHJpYnV0ZSBjb250YWlucyBubyBOVUxMIHZhbHVlcy4KKyAqCisgKiBSZXR1 cm5pbmcgdHJ1ZSBpbmRpY2F0ZXMgdGhhdCBhbGwgbmV3IE5PVCBOVUxMIGNvbnN0cmFpbnRzIGhh dmUgYmVlbgorICogdmFsaWRhdGVkIGFuZCB0aGF0IG5vIGFkZGl0aW9uYWwgdGFibGUgc2NhbiBp cyByZXF1aXJlZC4KKyAqLworc3RhdGljIGJvb2wKK2luZGV4X2NoZWNrX25vdG51bGwoUmVsYXRp b24gcmVsYXRpb24sIExpc3QgKm5vdG51bGxfYXR0bnVtcykKK3sKKwlTeXNTY2FuRGVzYyBpbmRz Y2FuOworCVNjYW5LZXlEYXRhIHNrZXk7CisJSGVhcFR1cGxlCWh0dXA7CisJTGlzdAkgICAqaWR4 cyA9IE5JTDsKKwlMaXN0CSAgICphdHRudW1zID0gTklMOworCWJvb2wJCWFsbF9ub3RfbnVsbCA9 IHRydWU7CisJTGlzdENlbGwgICAqbGMsCisJCQkgICAqbGMyOworCisJUmVsYXRpb24JcGdfaW5k ZXggPSB0YWJsZV9vcGVuKEluZGV4UmVsYXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCS8q IFByZXBhcmUgdG8gc2NhbiBwZ19pbmRleCBmb3IgZW50cmllcyBoYXZpbmcgaW5kcmVsaWQgPSB0 aGlzIHJlbCAqLworCVNjYW5LZXlJbml0KCZza2V5LAorCQkJCUFudW1fcGdfaW5kZXhfaW5kcmVs aWQsCisJCQkJQlRFcXVhbFN0cmF0ZWd5TnVtYmVyLAorCQkJCUZfT0lERVEsCisJCQkJT2JqZWN0 SWRHZXREYXR1bShSZWxhdGlvbkdldFJlbGlkKHJlbGF0aW9uKSkpOworCisJaW5kc2NhbiA9IHN5 c3RhYmxlX2JlZ2luc2NhbihwZ19pbmRleCwgSW5kZXhJbmRyZWxpZEluZGV4SWQsIHRydWUsCisJ CQkJCQkJCSBOVUxMLCAxLCAmc2tleSk7CisKKwl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZChodHVw ID0gc3lzdGFibGVfZ2V0bmV4dChpbmRzY2FuKSkpCisJeworCQlGb3JtX3BnX2F0dHJpYnV0ZSBh dHRyOworCQlSZWxhdGlvbglpbmRleF9yZWw7CisKKwkJRm9ybV9wZ19pbmRleCBpbmRleCA9IChG b3JtX3BnX2luZGV4KSBHRVRTVFJVQ1QoaHR1cCk7CisKKwkJLyoKKwkJICogV2Ugb25seSB1c2Ug bm9uLWRlZmVycmVkLCB2YWxpZCwgYW5kIGFsaXZlIGJ0cmVlIGluZGV4IHRvIHZlcnRpZnkKKwkJ ICogbm90LW51bGwgY29uc3RyYWludHMKKwkJICovCisJCWlmICghaW5kZXgtPmluZGltbWVkaWF0 ZSB8fCAhaW5kZXgtPmluZGlzdmFsaWQgfHwgIWluZGV4LT5pbmRpc2xpdmUpCisJCQljb250aW51 ZTsKKworCQkvKiBjYW5ub3QgdXNlIGV4cHJlc3Npb24gaW5kZXggb3IgcGFydGlhbCBpbmRleCB0 b28gKi8KKwkJaWYgKCFoZWFwX2F0dGlzbnVsbChodHVwLCBBbnVtX3BnX2luZGV4X2luZGV4cHJz LCBOVUxMKSB8fAorCQkJIWhlYXBfYXR0aXNudWxsKGh0dXAsIEFudW1fcGdfaW5kZXhfaW5kcHJl ZCwgTlVMTCkpCisJCQljb250aW51ZTsKKworCQlpbmRleF9yZWwgPSBpbmRleF9vcGVuKGluZGV4 LT5pbmRleHJlbGlkLCBBY2Nlc3NTaGFyZUxvY2spOworCisJCWlmIChpbmRleF9yZWwtPnJkX3Jl bC0+cmVsYW0gIT0gQlRSRUVfQU1fT0lEKQorCQl7CisJCQlpbmRleF9jbG9zZShpbmRleF9yZWws IEFjY2Vzc1NoYXJlTG9jayk7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYXR0ciA9IFR1cGxl RGVzY0F0dHIoUmVsYXRpb25HZXREZXNjcihyZWxhdGlvbiksIChpbmRleC0+aW5ka2V5LnZhbHVl c1swXSAtIDEpKTsKKworCQlpZiAobGlzdF9tZW1iZXJfaW50KG5vdG51bGxfYXR0bnVtcywgYXR0 ci0+YXR0bnVtKSAmJgorCQkJIWxpc3RfbWVtYmVyX2ludChhdHRudW1zLCBhdHRyLT5hdHRudW0p KQorCQl7CisJCQlhdHRudW1zID0gbGFwcGVuZF9pbnQoYXR0bnVtcywgYXR0ci0+YXR0bnVtKTsK KwkJCWlkeHMgPSBsYXBwZW5kX29pZChpZHhzLCBpbmRleC0+aW5kZXhyZWxpZCk7CisJCX0KKwor CQlpbmRleF9jbG9zZShpbmRleF9yZWwsIE5vTG9jayk7CisJfQorCXN5c3RhYmxlX2VuZHNjYW4o aW5kc2Nhbik7CisJdGFibGVfY2xvc2UocGdfaW5kZXgsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwkv KgorCSAqIEVhY2ggTk9UIE5VTEwgY29uc3RyYWludCByZXF1aXJlcyBhIHN1aXRhYmxlIGluZGV4 IGZvciB2ZXJpZmljYXRpb24uIElmCisJICogbm8gc3VjaCBpbmRleCBleGlzdHMsIGZhbGwgYmFj ayB0byBhIHJlZ3VsYXIgdGFibGUgc2NhbiB0byB2ZXJpZnkgdGhlCisJICogY29uc3RyYWludHMu CisJICovCisJaWYgKGF0dG51bXMgPT0gTklMIHx8CisJCWxpc3RfbGVuZ3RoKG5vdG51bGxfYXR0 bnVtcykgIT0gbGlzdF9sZW5ndGgoYXR0bnVtcykpCisJCXJldHVybiBmYWxzZTsKKworCWZvcmVh Y2hfaW50KGF0dG5vLCBub3RudWxsX2F0dG51bXMpCisJeworCQlpZiAoIWxpc3RfbWVtYmVyX2lu dChhdHRudW1zLCBhdHRubykpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZm9yYm90aChsYywg YXR0bnVtcywgbGMyLCBpZHhzKQorCXsKKwkJU25hcHNob3REYXRhIERpcnR5U25hcHNob3Q7CisJ CUluZGV4U2NhbkRlc2MgaW5kZXhfc2NhbjsKKwkJU2NhbktleURhdGEgc2NhbmtleXNbSU5ERVhf TUFYX0tFWVNdOworCQlBdHRyTnVtYmVyCXNrX2F0dG5vID0gLTE7CisJCUF0dHJOdW1iZXIJYXR0 bm8gPSBsZmlyc3RfaW50KGxjKTsKKwkJT2lkCQkJaW5kZXhvaWQgPSBsZmlyc3Rfb2lkKGxjMik7 CisKKwkJUmVsYXRpb24JaWR4cmVsID0gaW5kZXhfb3BlbihpbmRleG9pZCwgTm9Mb2NrKTsKKwkJ SW5kZXhJbmZvICAqaW5kZXhJbmZvID0gQnVpbGRJbmRleEluZm8oaWR4cmVsKTsKKwkJaW50CQkJ aW5kbmtleWF0dHMgPSBJbmRleFJlbGF0aW9uR2V0TnVtYmVyT2ZLZXlBdHRyaWJ1dGVzKGlkeHJl bCk7CisKKwkJVHVwbGVUYWJsZVNsb3QgKmV4aXN0aW5nX3Nsb3QgPSB0YWJsZV9zbG90X2NyZWF0 ZShyZWxhdGlvbiwgTlVMTCk7CisKKwkJLyoKKwkJICogU2VhcmNoIHRoZSB0dXBsZXMgdGhhdCBh cmUgaW4gdGhlIGluZGV4IGZvciBhbnkgdmlvbGF0aW9ucywKKwkJICogaW5jbHVkaW5nIHR1cGxl cyB0aGF0IGFyZW4ndCB2aXNpYmxlIHlldC4KKwkJICovCisJCUluaXREaXJ0eVNuYXBzaG90KERp cnR5U25hcHNob3QpOworCisJCWlmIChpbmRleEluZm8tPmlpX0luZGV4QXR0ck51bWJlcnNbMF0g PT0gYXR0bm8pCisJCQlza19hdHRubyA9IDE7CisJCWVsc2UKKwkJCWVsb2coRVJST1IsICJjYWNo ZSBsb29rdXAgZmFpbGVkIGZvciBhdHRyaWJ1dGUgbnVtYmVyICVkIG9uIGluZGV4ICV1IiwKKwkJ CQkgaW5kZXhvaWQsIGF0dG5vKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGluZG5rZXlhdHRz OyBpKyspCisJCXsKKwkJCS8qIHNldCB1cCBhbiBJUyBOVUxMIHNjYW4ga2V5IHNvIHRoYXQgd2Ug aWdub3JlIG5vdCBudWxscyAqLworCQkJU2NhbktleUVudHJ5SW5pdGlhbGl6ZSgmc2NhbmtleXNb aV0sCisJCQkJCQkJCSAgIFNLX0lTTlVMTCB8IFNLX1NFQVJDSE5VTEwsCisJCQkJCQkJCSAgIHNr X2F0dG5vLAkvKiBpbmRleCBjb2wgdG8gc2NhbiAqLworCQkJCQkJCQkgICBJbnZhbGlkU3RyYXRl Z3ksIC8qIG5vIHN0cmF0ZWd5ICovCisJCQkJCQkJCSAgIEludmFsaWRPaWQsCS8qIG5vIHN0cmF0 ZWd5IHN1YnR5cGUgKi8KKwkJCQkJCQkJICAgSW52YWxpZE9pZCwJLyogbm8gY29sbGF0aW9uICov CisJCQkJCQkJCSAgIEludmFsaWRPaWQsCS8qIG5vIHJlZyBwcm9jIGZvciB0aGlzICovCisJCQkJ CQkJCSAgIChEYXR1bSkgMCk7CS8qIGNvbnN0YW50ICovCisJCX0KKworCQlpbmRleF9zY2FuID0g aW5kZXhfYmVnaW5zY2FuKHJlbGF0aW9uLAorCQkJCQkJCQkJIGlkeHJlbCwKKwkJCQkJCQkJCSAm RGlydHlTbmFwc2hvdCwKKwkJCQkJCQkJCSBOVUxMLAorCQkJCQkJCQkJIGluZG5rZXlhdHRzLAor CQkJCQkJCQkJIDApOworCQlpbmRleF9yZXNjYW4oaW5kZXhfc2Nhbiwgc2NhbmtleXMsIGluZG5r ZXlhdHRzLCBOVUxMLCAwKTsKKworCQl3aGlsZSAoaW5kZXhfZ2V0bmV4dF9zbG90KGluZGV4X3Nj YW4sIEZvcndhcmRTY2FuRGlyZWN0aW9uLCBleGlzdGluZ19zbG90KSkKKwkJeworCQkJLyoKKwkJ CSAqIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgZm91bmQgdGhhdCBzb21lIGF0dHJpYnV0ZSB2YWx1 ZSBpcyBOVUxMLgorCQkJICogYnRyZWUgaW5kZXhlcyBhcmUgbmV2ZXIgbG9zc3ksIHdlIGRvbid0 IG5lZWQgcmVjaGVjayB0aGUKKwkJCSAqIGNvbmRpdGlvbi4KKwkJCSAqLworCQkJYWxsX25vdF9u dWxsID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCisJCWluZGV4X2VuZHNjYW4oaW5kZXhfc2Nh bik7CisJCWluZGV4X2Nsb3NlKGlkeHJlbCwgTm9Mb2NrKTsKKwkJRXhlY0Ryb3BTaW5nbGVUdXBs ZVRhYmxlU2xvdChleGlzdGluZ19zbG90KTsKKworCQkvKiBleGl0IGVhcmxpZXIgKi8KKwkJaWYg KCFhbGxfbm90X251bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9 CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NvbnN0cmFpbnRzLm91dCBi L3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY29uc3RyYWludHMub3V0CmluZGV4IDFiYmY1OWNj YTAyLi41ZmFhNmNiMDM1YSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9j b25zdHJhaW50cy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jb25zdHJhaW50 cy5vdXQKQEAgLTE3MTMsMyArMTcxMyw2NyBAQCBDT01NRU5UIE9OIENPTlNUUkFJTlQgaW52X2Nr IE9OIERPTUFJTiBjb25zdHJhaW50X2NvbW1lbnRzX2RvbSBJUyAnY29tbWVudCBvbiBpbgogQ1JF QVRFIFRBQkxFIHJlZ3Jlc3Nfbm90bnVsbDEgKGEgaW50ZWdlcik7CiBDUkVBVEUgVEFCTEUgcmVn cmVzc19ub3RudWxsMiAoKSBJTkhFUklUUyAocmVncmVzc19ub3RudWxsMSk7CiBBTFRFUiBUQUJM RSBPTkxZIHJlZ3Jlc3Nfbm90bnVsbDIgQUxURVIgQ09MVU1OIGEgU0VUIE5PVCBOVUxMOworQ1JF QVRFIFRBQkxFIHRwX25vdG51bGwgKGEgaW50LCBiIGludCwgYyBpbnQsIGQgaW50LCBmMSBpbnQg ZGVmYXVsdCAxMCwgZjIgaW50IGRlZmF1bHQgMTEpIFBBUlRJVElPTiBCWSByYW5nZShhKTsKK0NS RUFURSBUQUJMRSB0cF9ub3RudWxsXzEgcGFydGl0aW9uIG9mIHRwX25vdG51bGwgZm9yIHZhbHVl cyBGUk9NICggMSApIHRvICgxMCk7CitDUkVBVEUgVEFCTEUgdHBfbm90bnVsbF8yIHBhcnRpdGlv biBvZiB0cF9ub3RudWxsIGZvciB2YWx1ZXMgRlJPTSAoIDEwICkgdG8gKDIxKTsKK0NSRUFURSBJ TkRFWCB0cF9ub3RudWxsX2lkeF9iIE9OIHRwX25vdG51bGwoYik7CitDUkVBVEUgSU5ERVggdHBf bm90bnVsbF9pZHhfYyBPTiB0cF9ub3RudWxsKGMpOworQ1JFQVRFIElOREVYIHRwX25vdG51bGxf aWR4X2QgT04gdHBfbm90bnVsbChkKTsKK0NSRUFURSBJTkRFWCB0cF9ub3RudWxsX2lkeF9kX2lu Y2x1ZGUgT04gdHBfbm90bnVsbChkKSBpbmNsdWRlKGYxKTsKK0NSRUFURSBJTkRFWCB0cF9ub3Ru dWxsX2lkeF9mMiBPTiB0cF9ub3RudWxsIFVTSU5HIGhhc2ggKGYyIGludDRfb3BzKTsKK0lOU0VS VCBJTlRPIHRwX25vdG51bGwgU0VMRUNUIGcsIGcgKyAxMCwgZyArIDE1LCBnICsgcmFuZG9tKG1p bj0+MTo6aW50LCBtYXg9PjEwOjppbnQpIEZST00gZ2VuZXJhdGVfc2VyaWVzKDgsMTkpIGc7CitT RVQgY2xpZW50X21pbl9tZXNzYWdlcyBUTyBERUJVRzE7CitTRVQgbG9nX3N0YXRlbWVudCB0byBO T05FOworLS1kZWJ1ZyBtZXNzYWdlIHNob3VsZCBjb250YWluICJoYXZlIGJlZW4gdmFsaWRhdGVk IGJ5IHVzaW5nIGluZGV4IHNjYW4iCitBTFRFUiBUQUJMRSB0cF9ub3RudWxsIEFMVEVSIENPTFVN TiBiIFNFVCBOT1QgTlVMTDsKK0RFQlVHOiAgYWxsIG5ldyBub3QtbnVsbCBjb25zdHJhaW50cyBv biByZWxhdGlvbiAidHBfbm90bnVsbF8xIiBoYXZlIGJlZW4gdmFsaWRhdGVkIGJ5IHVzaW5nIGlu ZGV4IHNjYW4KK0RFQlVHOiAgYWxsIG5ldyBub3QtbnVsbCBjb25zdHJhaW50cyBvbiByZWxhdGlv biAidHBfbm90bnVsbF8yIiBoYXZlIGJlZW4gdmFsaWRhdGVkIGJ5IHVzaW5nIGluZGV4IHNjYW4K K0FMVEVSIFRBQkxFIHRwX25vdG51bGwgQUxURVIgQ09MVU1OIGIgRFJPUCBOT1QgTlVMTDsKKy0t ZGVidWcgbWVzc2FnZSBzaG91bGQgY29udGFpbiAiaGF2ZSBiZWVuIHZhbGlkYXRlZCBieSB1c2lu ZyBpbmRleCBzY2FuIgorQUxURVIgVEFCTEUgdHBfbm90bnVsbF8xIEFMVEVSIENPTFVNTiBiIFNF VCBOT1QgTlVMTDsKK0RFQlVHOiAgYWxsIG5ldyBub3QtbnVsbCBjb25zdHJhaW50cyBvbiByZWxh dGlvbiAidHBfbm90bnVsbF8xIiBoYXZlIGJlZW4gdmFsaWRhdGVkIGJ5IHVzaW5nIGluZGV4IHNj YW4KKy0tZGVidWcgbWVzc2FnZSBzaG91bGQgY29udGFpbiAiaGF2ZSBiZWVuIHZhbGlkYXRlZCBi eSB1c2luZyBpbmRleCBzY2FuIgorQUxURVIgVEFCTEUgdHBfbm90bnVsbF8yIEFMVEVSIENPTFVN TiBiIFNFVCBOT1QgTlVMTDsKK0RFQlVHOiAgYWxsIG5ldyBub3QtbnVsbCBjb25zdHJhaW50cyBv biByZWxhdGlvbiAidHBfbm90bnVsbF8yIiBoYXZlIGJlZW4gdmFsaWRhdGVkIGJ5IHVzaW5nIGlu ZGV4IHNjYW4KK0FMVEVSIFRBQkxFIHRwX25vdG51bGxfMiBBREQgQ09OU1RSQUlOVCBubl9kIE5P VCBOVUxMIGQgTk9UIFZBTElEOworLS1kZWJ1ZyBtZXNzYWdlIHNob3VsZCBub3QgY29udGFpbiAi aGF2ZSBiZWVuIHZhbGlkYXRlZCBieSB1c2luZyBpbmRleCBzY2FuIgorQUxURVIgVEFCTEUgdHBf bm90bnVsbF8yIFZBTElEQVRFIENPTlNUUkFJTlQgbm5fZDsKK0RFQlVHOiAgdmVyaWZ5aW5nIHRh YmxlICJ0cF9ub3RudWxsXzIiCistLWRlYnVnIG1lc3NhZ2Ugc2hvdWxkIG5vdCBjb250YWluICJo YXZlIGJlZW4gdmFsaWRhdGVkIGJ5IHVzaW5nIGluZGV4IHNjYW4iCitBTFRFUiBUQUJMRSB0cF9u b3RudWxsIEFERCBDT05TVFJBSU5UIG5uZjEgTk9UIE5VTEwgZjE7CitERUJVRzogIHZlcmlmeWlu ZyB0YWJsZSAidHBfbm90bnVsbF8xIgorREVCVUc6ICB2ZXJpZnlpbmcgdGFibGUgInRwX25vdG51 bGxfMiIKKy0tZGVidWcgbWVzc2FnZSBzaG91bGQgbm90IGNvbnRhaW4gImhhdmUgYmVlbiB2YWxp ZGF0ZWQgYnkgdXNpbmcgaW5kZXggc2NhbiIKK0FMVEVSIFRBQkxFIHRwX25vdG51bGwgQUREIENP TlNUUkFJTlQgbm5mMiBOT1QgTlVMTCBmMjsKK0RFQlVHOiAgdmVyaWZ5aW5nIHRhYmxlICJ0cF9u b3RudWxsXzEiCitERUJVRzogIHZlcmlmeWluZyB0YWJsZSAidHBfbm90bnVsbF8yIgorLS1kZWJ1 ZyBtZXNzYWdlIHNob3VsZCBub3QgY29udGFpbiAiaGF2ZSBiZWVuIHZhbGlkYXRlZCBieSB1c2lu ZyBpbmRleCBzY2FuIgorQUxURVIgVEFCTEUgdHBfbm90bnVsbCBBTFRFUiBDT0xVTU4gYSBTRVQg Tk9UIE5VTEwsIEFERCBDT05TVFJBSU5UIGNfbm4gTk9UIE5VTEwgYzsKK0RFQlVHOiAgdmVyaWZ5 aW5nIHRhYmxlICJ0cF9ub3RudWxsXzEiCitERUJVRzogIHZlcmlmeWluZyB0YWJsZSAidHBfbm90 bnVsbF8yIgorLS1kZWJ1ZyBtZXNzYWdlIHNob3VsZCBjb250YWluICJoYXZlIGJlZW4gdmFsaWRh dGVkIGJ5IHVzaW5nIGluZGV4IHNjYW4iCitBTFRFUiBUQUJMRSB0cF9ub3RudWxsIEFMVEVSIENP TFVNTiBkIFNFVCBOT1QgTlVMTCwgQUREIENPTlNUUkFJTlQgY19ubiBOT1QgTlVMTCBjLCBBTFRF UiBDT0xVTU4gYiBTRVQgTk9UIE5VTEw7CitERUJVRzogIGFsbCBuZXcgbm90LW51bGwgY29uc3Ry YWludHMgb24gcmVsYXRpb24gInRwX25vdG51bGxfMSIgaGF2ZSBiZWVuIHZhbGlkYXRlZCBieSB1 c2luZyBpbmRleCBzY2FuCistLWRlYnVnIG1lc3NhZ2Ugc2hvdWxkIG5vdCBjb250YWluICJoYXZl IGJlZW4gdmFsaWRhdGVkIGJ5IHVzaW5nIGluZGV4IHNjYW4iCitBTFRFUiBUQUJMRSB0cF9ub3Ru dWxsIEFMVEVSIENPTFVNTiBiIFNFVCBOT1QgTlVMTCwgQUxURVIgQ09MVU1OIGIgU0VUIERBVEEg VFlQRSBCSUdJTlQ7CitERUJVRzogIHJld3JpdGluZyB0YWJsZSAidHBfbm90bnVsbF8xIgorREVC VUc6ICBidWlsZGluZyBpbmRleCAidHBfbm90bnVsbF8xX2NfaWR4IiBvbiB0YWJsZSAidHBfbm90 bnVsbF8xIiBzZXJpYWxseQorREVCVUc6ICBpbmRleCAidHBfbm90bnVsbF8xX2NfaWR4IiBjYW4g c2FmZWx5IHVzZSBkZWR1cGxpY2F0aW9uCitERUJVRzogIGJ1aWxkaW5nIGluZGV4ICJ0cF9ub3Ru dWxsXzFfZF9pZHgiIG9uIHRhYmxlICJ0cF9ub3RudWxsXzEiIHNlcmlhbGx5CitERUJVRzogIGlu ZGV4ICJ0cF9ub3RudWxsXzFfZF9pZHgiIGNhbiBzYWZlbHkgdXNlIGRlZHVwbGljYXRpb24KK0RF QlVHOiAgYnVpbGRpbmcgaW5kZXggInRwX25vdG51bGxfMV9kX2YxX2lkeCIgb24gdGFibGUgInRw X25vdG51bGxfMSIgc2VyaWFsbHkKK0RFQlVHOiAgYnVpbGRpbmcgaW5kZXggInRwX25vdG51bGxf MV9mMl9pZHgiIG9uIHRhYmxlICJ0cF9ub3RudWxsXzEiIHNlcmlhbGx5CitERUJVRzogIGJ1aWxk aW5nIGluZGV4ICJ0cF9ub3RudWxsXzFfYl9pZHgiIG9uIHRhYmxlICJ0cF9ub3RudWxsXzEiIHNl cmlhbGx5CitERUJVRzogIGluZGV4ICJ0cF9ub3RudWxsXzFfYl9pZHgiIGNhbiBzYWZlbHkgdXNl IGRlZHVwbGljYXRpb24KK0RFQlVHOiAgcmV3cml0aW5nIHRhYmxlICJ0cF9ub3RudWxsXzIiCitE RUJVRzogIGJ1aWxkaW5nIGluZGV4ICJ0cF9ub3RudWxsXzJfY19pZHgiIG9uIHRhYmxlICJ0cF9u b3RudWxsXzIiIHNlcmlhbGx5CitERUJVRzogIGluZGV4ICJ0cF9ub3RudWxsXzJfY19pZHgiIGNh biBzYWZlbHkgdXNlIGRlZHVwbGljYXRpb24KK0RFQlVHOiAgYnVpbGRpbmcgaW5kZXggInRwX25v dG51bGxfMl9kX2lkeCIgb24gdGFibGUgInRwX25vdG51bGxfMiIgc2VyaWFsbHkKK0RFQlVHOiAg aW5kZXggInRwX25vdG51bGxfMl9kX2lkeCIgY2FuIHNhZmVseSB1c2UgZGVkdXBsaWNhdGlvbgor REVCVUc6ICBidWlsZGluZyBpbmRleCAidHBfbm90bnVsbF8yX2RfZjFfaWR4IiBvbiB0YWJsZSAi dHBfbm90bnVsbF8yIiBzZXJpYWxseQorREVCVUc6ICBidWlsZGluZyBpbmRleCAidHBfbm90bnVs bF8yX2YyX2lkeCIgb24gdGFibGUgInRwX25vdG51bGxfMiIgc2VyaWFsbHkKK0RFQlVHOiAgYnVp bGRpbmcgaW5kZXggInRwX25vdG51bGxfMl9iX2lkeCIgb24gdGFibGUgInRwX25vdG51bGxfMiIg c2VyaWFsbHkKK0RFQlVHOiAgaW5kZXggInRwX25vdG51bGxfMl9iX2lkeCIgY2FuIHNhZmVseSB1 c2UgZGVkdXBsaWNhdGlvbgorUkVTRVQgY2xpZW50X21pbl9tZXNzYWdlczsKK1JFU0VUIGxvZ19z dGF0ZW1lbnQ7CitEUk9QIFRBQkxFIHRwX25vdG51bGw7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9y ZWdyZXNzL3NxbC9jb25zdHJhaW50cy5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jb25zdHJh aW50cy5zcWwKaW5kZXggNzMzYTFkYmNjZmUuLmY5NWMyNjdhNjQ4IDEwMDY0NAotLS0gYS9zcmMv dGVzdC9yZWdyZXNzL3NxbC9jb25zdHJhaW50cy5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9z cWwvY29uc3RyYWludHMuc3FsCkBAIC0xMDU3LDMgKzEwNTcsNDkgQEAgQ09NTUVOVCBPTiBDT05T VFJBSU5UIGludl9jayBPTiBET01BSU4gY29uc3RyYWludF9jb21tZW50c19kb20gSVMgJ2NvbW1l bnQgb24gaW4KIENSRUFURSBUQUJMRSByZWdyZXNzX25vdG51bGwxIChhIGludGVnZXIpOwogQ1JF QVRFIFRBQkxFIHJlZ3Jlc3Nfbm90bnVsbDIgKCkgSU5IRVJJVFMgKHJlZ3Jlc3Nfbm90bnVsbDEp OwogQUxURVIgVEFCTEUgT05MWSByZWdyZXNzX25vdG51bGwyIEFMVEVSIENPTFVNTiBhIFNFVCBO T1QgTlVMTDsKKworQ1JFQVRFIFRBQkxFIHRwX25vdG51bGwgKGEgaW50LCBiIGludCwgYyBpbnQs IGQgaW50LCBmMSBpbnQgZGVmYXVsdCAxMCwgZjIgaW50IGRlZmF1bHQgMTEpIFBBUlRJVElPTiBC WSByYW5nZShhKTsKK0NSRUFURSBUQUJMRSB0cF9ub3RudWxsXzEgcGFydGl0aW9uIG9mIHRwX25v dG51bGwgZm9yIHZhbHVlcyBGUk9NICggMSApIHRvICgxMCk7CitDUkVBVEUgVEFCTEUgdHBfbm90 bnVsbF8yIHBhcnRpdGlvbiBvZiB0cF9ub3RudWxsIGZvciB2YWx1ZXMgRlJPTSAoIDEwICkgdG8g KDIxKTsKK0NSRUFURSBJTkRFWCB0cF9ub3RudWxsX2lkeF9iIE9OIHRwX25vdG51bGwoYik7CitD UkVBVEUgSU5ERVggdHBfbm90bnVsbF9pZHhfYyBPTiB0cF9ub3RudWxsKGMpOworQ1JFQVRFIElO REVYIHRwX25vdG51bGxfaWR4X2QgT04gdHBfbm90bnVsbChkKTsKK0NSRUFURSBJTkRFWCB0cF9u b3RudWxsX2lkeF9kX2luY2x1ZGUgT04gdHBfbm90bnVsbChkKSBpbmNsdWRlKGYxKTsKK0NSRUFU RSBJTkRFWCB0cF9ub3RudWxsX2lkeF9mMiBPTiB0cF9ub3RudWxsIFVTSU5HIGhhc2ggKGYyIGlu dDRfb3BzKTsKK0lOU0VSVCBJTlRPIHRwX25vdG51bGwgU0VMRUNUIGcsIGcgKyAxMCwgZyArIDE1 LCBnICsgcmFuZG9tKG1pbj0+MTo6aW50LCBtYXg9PjEwOjppbnQpIEZST00gZ2VuZXJhdGVfc2Vy aWVzKDgsMTkpIGc7CisKK1NFVCBjbGllbnRfbWluX21lc3NhZ2VzIFRPIERFQlVHMTsKK1NFVCBs b2dfc3RhdGVtZW50IHRvIE5PTkU7CisKKy0tZGVidWcgbWVzc2FnZSBzaG91bGQgY29udGFpbiAi aGF2ZSBiZWVuIHZhbGlkYXRlZCBieSB1c2luZyBpbmRleCBzY2FuIgorQUxURVIgVEFCTEUgdHBf bm90bnVsbCBBTFRFUiBDT0xVTU4gYiBTRVQgTk9UIE5VTEw7CitBTFRFUiBUQUJMRSB0cF9ub3Ru dWxsIEFMVEVSIENPTFVNTiBiIERST1AgTk9UIE5VTEw7CisKKy0tZGVidWcgbWVzc2FnZSBzaG91 bGQgY29udGFpbiAiaGF2ZSBiZWVuIHZhbGlkYXRlZCBieSB1c2luZyBpbmRleCBzY2FuIgorQUxU RVIgVEFCTEUgdHBfbm90bnVsbF8xIEFMVEVSIENPTFVNTiBiIFNFVCBOT1QgTlVMTDsKKworLS1k ZWJ1ZyBtZXNzYWdlIHNob3VsZCBjb250YWluICJoYXZlIGJlZW4gdmFsaWRhdGVkIGJ5IHVzaW5n IGluZGV4IHNjYW4iCitBTFRFUiBUQUJMRSB0cF9ub3RudWxsXzIgQUxURVIgQ09MVU1OIGIgU0VU IE5PVCBOVUxMOworCitBTFRFUiBUQUJMRSB0cF9ub3RudWxsXzIgQUREIENPTlNUUkFJTlQgbm5f ZCBOT1QgTlVMTCBkIE5PVCBWQUxJRDsKKy0tZGVidWcgbWVzc2FnZSBzaG91bGQgbm90IGNvbnRh aW4gImhhdmUgYmVlbiB2YWxpZGF0ZWQgYnkgdXNpbmcgaW5kZXggc2NhbiIKK0FMVEVSIFRBQkxF IHRwX25vdG51bGxfMiBWQUxJREFURSBDT05TVFJBSU5UIG5uX2Q7CisKKy0tZGVidWcgbWVzc2Fn ZSBzaG91bGQgbm90IGNvbnRhaW4gImhhdmUgYmVlbiB2YWxpZGF0ZWQgYnkgdXNpbmcgaW5kZXgg c2NhbiIKK0FMVEVSIFRBQkxFIHRwX25vdG51bGwgQUREIENPTlNUUkFJTlQgbm5mMSBOT1QgTlVM TCBmMTsKKworLS1kZWJ1ZyBtZXNzYWdlIHNob3VsZCBub3QgY29udGFpbiAiaGF2ZSBiZWVuIHZh bGlkYXRlZCBieSB1c2luZyBpbmRleCBzY2FuIgorQUxURVIgVEFCTEUgdHBfbm90bnVsbCBBREQg Q09OU1RSQUlOVCBubmYyIE5PVCBOVUxMIGYyOworCistLWRlYnVnIG1lc3NhZ2Ugc2hvdWxkIG5v dCBjb250YWluICJoYXZlIGJlZW4gdmFsaWRhdGVkIGJ5IHVzaW5nIGluZGV4IHNjYW4iCitBTFRF UiBUQUJMRSB0cF9ub3RudWxsIEFMVEVSIENPTFVNTiBhIFNFVCBOT1QgTlVMTCwgQUREIENPTlNU UkFJTlQgY19ubiBOT1QgTlVMTCBjOworCistLWRlYnVnIG1lc3NhZ2Ugc2hvdWxkIGNvbnRhaW4g ImhhdmUgYmVlbiB2YWxpZGF0ZWQgYnkgdXNpbmcgaW5kZXggc2NhbiIKK0FMVEVSIFRBQkxFIHRw X25vdG51bGwgQUxURVIgQ09MVU1OIGQgU0VUIE5PVCBOVUxMLCBBREQgQ09OU1RSQUlOVCBjX25u IE5PVCBOVUxMIGMsIEFMVEVSIENPTFVNTiBiIFNFVCBOT1QgTlVMTDsKKworLS1kZWJ1ZyBtZXNz YWdlIHNob3VsZCBub3QgY29udGFpbiAiaGF2ZSBiZWVuIHZhbGlkYXRlZCBieSB1c2luZyBpbmRl eCBzY2FuIgorQUxURVIgVEFCTEUgdHBfbm90bnVsbCBBTFRFUiBDT0xVTU4gYiBTRVQgTk9UIE5V TEwsIEFMVEVSIENPTFVNTiBiIFNFVCBEQVRBIFRZUEUgQklHSU5UOworCitSRVNFVCBjbGllbnRf bWluX21lc3NhZ2VzOworUkVTRVQgbG9nX3N0YXRlbWVudDsKK0RST1AgVEFCTEUgdHBfbm90bnVs bDsKLS0gCjIuMzQuMQoK --00000000000023b0b00649f9a749--