Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kzPNY-0005VC-2l for pgsql-hackers@arkaria.postgresql.org; Tue, 12 Jan 2021 19:30:56 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1kzPNT-0002gT-Gb for pgsql-hackers@arkaria.postgresql.org; Tue, 12 Jan 2021 19:30:51 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kzPNS-0002gM-NV for pgsql-hackers@lists.postgresql.org; Tue, 12 Jan 2021 19:30:51 +0000 Received: from mail-ej1-x632.google.com ([2a00:1450:4864:20::632]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1kzPNL-0002iu-Fa for pgsql-hackers@lists.postgresql.org; Tue, 12 Jan 2021 19:30:49 +0000 Received: by mail-ej1-x632.google.com with SMTP id b9so5187242ejy.0 for ; Tue, 12 Jan 2021 11:30:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb-com.20150623.gappssmtp.com; s=20150623; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language; bh=N0+8zXEmSKN1mbquBh88RzgKU88HF3Ego6Z3BPS9Qf8=; b=iQtQzdRzx2d+DhgHIA0pXB/mry76Pdfskeh2JTWBn6H/LlnMV1lHlhIQVeq5elVRQS 9fchuG5OTHA7ljLi393BJM9FqeRrgrmHda8h2/GnQq6enTt8G9J4HomiOKYo5tqDQ0vj 0gSDTfkw6Bes37OW8pMsaSVrfrONnQHpA6o+SjTHFk8VlecdJ2CNPHntFdBvYaKEfh27 lGdxAMmowgH6PMVNykIaxbuQwjgzS1UxXYUAcp2HEPAuaQBtS8a/nYgStV5j2T85TC1A L3yFBHay/7THAonA5xir3a0Mnv58hpQak4slFV9Ttdyy8VMmLW0DVbAMv37hkqNruYY/ dh5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language; bh=N0+8zXEmSKN1mbquBh88RzgKU88HF3Ego6Z3BPS9Qf8=; b=AFVic3t040D4FyqPU3/WSvZVm/YRYTAyo2MqN6a2diJDLMfjjUNJfj+XbRU6BRJ7Ry InJV+J2/ShKPP9h6pXKy/YUtvoHctW+irqiWiI8CpQ1X25pTVs0upRVlO7JGo6mh53bO QqY8B3Fr4EIhZYZYvhtUc+rK1tXyPNu7PMiOQvX814GiAycgKO3qvJrrlO353Pf1o0VL J8M0PIll2co6QaTOmk5lSP45qloq4nLSNWqMyZc6etOby1PD93J2+VUEBf96n8Ydg/++ jykiclGO5uYf5pDoJAcO3UT+gmt8/UbHImbemPDgC4SnkEppt7PZ0UREmZxfBgAaUM2u VWAQ== X-Gm-Message-State: AOAM532qLI/ZDESy5/1LjY5RcRVfML3uYMm+/Gl8SvZyQeE7pKmRAyV7 8KWaB7VdNkIKLNgUv/xoDtmZqLCx3pMJAePFFPCUDjsKC7FMKhCbd7PLZ42jJgkp/Ro6fnoOI72 aq+2BsjY+aFfqqmIvayx9Kk4HJ8bWYGwlK65hB9brNA3IMfr0kOiIotZdNdVXbhxS3QgwpyNZy6 GVuSbEBYcIIcGp79hy2R33ysyIzJoAtVEdKkKea6ZKFVp/s4XhhexT X-Google-Smtp-Source: ABdhPJx/zyGAo9L5IJVEfRxX+bkCaNjE9RqwXWxFZLxl/gA+gWkpeWp/697PJw0fJ0O0WZNoYIsQvQ== X-Received: by 2002:a17:906:4ec4:: with SMTP id i4mr267166ejv.302.1610479840740; Tue, 12 Jan 2021 11:30:40 -0800 (PST) Received: from [10.137.0.20] (ip-86-49-253-127.net.upcbroadband.cz. [86.49.253.127]) by smtp.gmail.com with ESMTPSA id c16sm1554994ejk.91.2021.01.12.11.30.38 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 12 Jan 2021 11:30:39 -0800 (PST) Subject: Re: COPY FREEZE and setting PD_ALL_VISIBLE/visibility map bits To: Anastasia Lubennikova , Tomas Vondra Cc: Tatsuo Ishii , lubennikovaav@gmail.com, pgsql-hackers@lists.postgresql.org, pavan.deolasee@gmail.com, ibrar.ahmad@gmail.com References: <160382617166.1204.475752573208579406.pgcf@coridan.postgresql.org> <20201028.144653.966121790856478893.t-ishii@sraoss.co.jp> <20201030004252.d63rwclys4bniluu@development> <1d2e0f4a-6ab8-10f1-c177-af97475df001@postgrespro.ru> <20201102144453.tumlk7qhw3gzn2dk@development> <7e6a006f-c59a-93fc-3ddf-f9c661319bc8@2ndquadrant.com> <75f3760f-1077-07c1-aea4-975d5c127d6d@postgrespro.ru> <93b767d6-4cde-7326-8de4-d71d81817c16@postgrespro.ru> From: Tomas Vondra Message-ID: <8669d452-d078-bdf9-5a62-6f1acd55f3c6@enterprisedb.com> Date: Tue, 12 Jan 2021 20:30:35 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.6.0 MIME-Version: 1.0 In-Reply-To: <93b767d6-4cde-7326-8de4-d71d81817c16@postgrespro.ru> Content-Type: multipart/mixed; boundary="------------AC23EB3777EE083F54AEE753" Content-Language: en-US X-CLOUD-SEC-AV-Info: enterprisedb,google_mail,monitor X-CLOUD-SEC-AV-Sent: true X-Gm-Spam: 0 X-Gm-Phishy: 0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk This is a multi-part message in MIME format. --------------AC23EB3777EE083F54AEE753 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Thanks. These patches seem to resolve the TOAST table issue, freezing it as expected. I think the code duplication is not an issue, but I wonder why heap_insert uses this condition: /* * ... * * No need to update the visibilitymap if it had all_frozen bit set * before this insertion. */ if (all_frozen_set && ((vmstatus & VISIBILITYMAP_ALL_FROZEN) == 0)) while heap_multi_insert only does this: if (all_frozen_set) { ... } I haven't looked at the details, but shouldn't both do the same thing? I've done some benchmarks, comparing master and patched version on a bunch of combinations (logged/unlogged, no before-insert trigger, trigger filtering everything/nothing). On master, the results are: group copy vacuum ----------------------------------------------- logged / no trigger 4672 162 logged / trigger (all) 4914 162 logged / trigger (none) 1219 11 unlogged / no trigger 4132 156 unlogged / trigger (all) 4292 156 unlogged / trigger (none) 1275 11 and patched looks like this: group copy vacuum ----------------------------------------------- logged / no trigger 4669 12 logged / trigger (all) 4874 12 logged / trigger (none) 1233 11 unlogged / no trigger 4054 11 unlogged / trigger (all) 4185 12 unlogged / trigger (none) 1222 10 This looks pretty nice - there are no regressions, just speedups in the vacuum step. The SQL script used is attached. However, I've also repeated the test counting all-frozen pages in both the main table and TOAST table, and I get this: master ====== select count(*) from pg_visibility((select reltoastrelid from pg_class where relname = 't')); count -------- 100000 (1 row) select count(*) from pg_visibility((select reltoastrelid from pg_class where relname = 't')) where not all_visible; count -------- 100000 (1 row) patched ======= select count(*) from pg_visibility((select reltoastrelid from pg_class where relname = 't')); count -------- 100002 (1 row) select count(*) from pg_visibility((select reltoastrelid from pg_class where relname = 't')) where not all_visible; count -------- 0 (1 row) That is - all TOAST pages are frozen (as expected, which is good). But now there are 100002 pages, not just 100000 pages. That is, we're now creating 2 extra pages, for some reason. I recall Pavan reported similar issue with every 32768-th page not being properly filled, but I'm not sure if that's the same issue. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company --------------AC23EB3777EE083F54AEE753 Content-Type: application/sql; name="test.sql" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="test.sql" Y3JlYXRlIGV4dGVuc2lvbiBwZ192aXNpYmlsaXR5OwoKZHJvcCB0YWJsZSBpZiBleGlzdHMg dDsKY3JlYXRlIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwppbnNlcnQgaW50byB0IHNlbGVj dCBpLCAoc2VsZWN0IHN0cmluZ19hZ2cobWQ1KHJhbmRvbSgpOjp0ZXh0KSwgJycpIGZyb20g Z2VuZXJhdGVfc2VyaWVzKDEsMTAwKSkgZnJvbSBnZW5lcmF0ZV9zZXJpZXMoMSwyMDAwMDAp IHMoaSk7CmNvcHkgdCB0byAnL3RtcC90LmRhdGEnOwpkcm9wIHRhYmxlIHQ7CgpiZWdpbjsK Y3JlYXRlIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRh dGEnIGZyZWV6ZTsKCnNlbGVjdCAqIGZyb20gcGdfdmlzaWJpbGl0eSgndCcpOwpzZWxlY3Qg KiBmcm9tIHBnX3Zpc2liaWxpdHkoKHNlbGVjdCByZWx0b2FzdHJlbGlkIGZyb20gcGdfY2xh c3Mgd2hlcmUgcmVsbmFtZSA9ICd0JykpOwoKCnNlbGVjdCBjb3VudCgqKSBmcm9tIHBnX3Zp c2liaWxpdHkoJ3QnKTsKc2VsZWN0IGNvdW50KCopIGZyb20gcGdfdmlzaWJpbGl0eSgndCcp IHdoZXJlIG5vdCBhbGxfdmlzaWJsZTsKCgpzZWxlY3QgY291bnQoKikgZnJvbSBwZ192aXNp YmlsaXR5KChzZWxlY3QgcmVsdG9hc3RyZWxpZCBmcm9tIHBnX2NsYXNzIHdoZXJlIHJlbG5h bWUgPSAndCcpKTsKc2VsZWN0IGNvdW50KCopIGZyb20gcGdfdmlzaWJpbGl0eSgoc2VsZWN0 IHJlbHRvYXN0cmVsaWQgZnJvbSBwZ19jbGFzcyB3aGVyZSByZWxuYW1lID0gJ3QnKSkgd2hl cmUgbm90IGFsbF92aXNpYmxlOwo= --------------AC23EB3777EE083F54AEE753 Content-Type: application/sql; name="bench.sql" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="bench.sql" ZHJvcCB0YWJsZSBpZiBleGlzdHMgdDsKY3JlYXRlIHRhYmxlIHQgKGEgaW50LCBiIHRleHQp OwppbnNlcnQgaW50byB0IHNlbGVjdCBpLCAoc2VsZWN0IHN0cmluZ19hZ2cobWQ1KHJhbmRv bSgpOjp0ZXh0KSwgJycpIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDEsMTAwKSkgZnJvbSBnZW5l cmF0ZV9zZXJpZXMoMSwxMDAwMDApIHMoaSk7CmNvcHkgdCB0byAnL3RtcC90LmRhdGEnOwpk cm9wIHRhYmxlIHQ7CgpjcmVhdGUgb3IgcmVwbGFjZSBmdW5jdGlvbiB0cmlnX2FsbCgpIHJl dHVybnMgdHJpZ2dlciBhcyAkJApiZWdpbgogIHJldHVybiBuZXc7CmVuZDsgJCQgbGFuZ3Vh Z2UgcGxwZ3NxbDsKCmNyZWF0ZSBvciByZXBsYWNlIGZ1bmN0aW9uIHRyaWdfbm9uZSgpIHJl dHVybnMgdHJpZ2dlciBhcyAkJApiZWdpbgogIHJldHVybiBudWxsOwplbmQ7ICQkIGxhbmd1 YWdlIHBscGdzcWw7CgoKXHRpbWluZyBvbgoKY2hlY2twb2ludDsKCmJlZ2luOwpjcmVhdGUg dGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0YScgZnJl ZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0OwoKY2hlY2twb2ludDsKCmJl Z2luOwpjcmVhdGUgdGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CmNvcHkgdCBmcm9tICcvdG1w L3QuZGF0YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0OwoKY2hl Y2twb2ludDsKCmJlZ2luOwpjcmVhdGUgdGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CmNvcHkg dCBmcm9tICcvdG1wL3QuZGF0YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0 YWJsZSB0OwoKY2hlY2twb2ludDsKCmJlZ2luOwpjcmVhdGUgdGFibGUgdCAoYSBpbnQsIGIg dGV4dCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1 dW0gdDsKZHJvcCB0YWJsZSB0OwoKY2hlY2twb2ludDsKCmJlZ2luOwpjcmVhdGUgdGFibGUg dCAoYSBpbnQsIGIgdGV4dCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0YScgZnJlZXplOwpj b21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0OwoKY2hlY2twb2ludDsKCmJlZ2luOwpj cmVhdGUgdGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0 YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0OwoKY2hlY2twb2lu dDsKCmJlZ2luOwpjcmVhdGUgdGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CmNvcHkgdCBmcm9t ICcvdG1wL3QuZGF0YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0 OwoKY2hlY2twb2ludDsKCmJlZ2luOwpjcmVhdGUgdGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7 CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsK ZHJvcCB0YWJsZSB0OwoKY2hlY2twb2ludDsKCmJlZ2luOwpjcmVhdGUgdGFibGUgdCAoYSBp bnQsIGIgdGV4dCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0YScgZnJlZXplOwpjb21taXQ7 Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0OwoKY2hlY2twb2ludDsKCmJlZ2luOwpjcmVhdGUg dGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0YScgZnJl ZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0OwoKCgoKCmNoZWNrcG9pbnQ7 CgpiZWdpbjsKY3JlYXRlIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dF UiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVS RSB0cmlnX2FsbCgpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0 OwoKdmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3JlYXRl IHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JFIElO U0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX2FsbCgpOwpj b3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVtIHQ7CmRy b3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3JlYXRlIHRhYmxlIHQgKGEgaW50 LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBF QUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX2FsbCgpOwpjb3B5IHQgZnJvbSAnL3Rt cC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsKCmNo ZWNrcG9pbnQ7CgpiZWdpbjsKY3JlYXRlIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVB VEUgVFJJR0dFUiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRF IFBST0NFRFVSRSB0cmlnX2FsbCgpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6 ZTsKY29tbWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdp bjsKY3JlYXRlIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMg QkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0cmln X2FsbCgpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoKdmFj dXVtIHQ7CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3JlYXRlIHRhYmxl IHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JFIElOU0VSVCBP TiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX2FsbCgpOwpjb3B5IHQg ZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFi bGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3JlYXRlIHRhYmxlIHQgKGEgaW50LCBiIHRl eHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNIIFJP VyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX2FsbCgpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRh dGEnIGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9p bnQ7CgpiZWdpbjsKY3JlYXRlIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJ R0dFUiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NF RFVSRSB0cmlnX2FsbCgpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6ZTsKY29t bWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3Jl YXRlIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JF IElOU0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX2FsbCgp Owpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVtIHQ7 CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3JlYXRlIHRhYmxlIHQgKGEg aW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0IEZP UiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX2FsbCgpOwpjb3B5IHQgZnJvbSAn L3RtcC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsK CgoKCgoKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3JlYXRlIHRhYmxlIHQgKGEgaW50LCBiIHRl eHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNIIFJP VyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX25vbmUoKTsKY29weSB0IGZyb20gJy90bXAvdC5k YXRhJyBmcmVlemU7CmNvbW1pdDsKCnZhY3V1bSB0Owpkcm9wIHRhYmxlIHQ7CgpjaGVja3Bv aW50OwoKYmVnaW47CmNyZWF0ZSB0YWJsZSB0IChhIGludCwgYiB0ZXh0KTsKQ1JFQVRFIFRS SUdHRVIgaW5zIEJFRk9SRSBJTlNFUlQgT04gdCBGT1IgRUFDSCBST1cgRVhFQ1VURSBQUk9D RURVUkUgdHJpZ19ub25lKCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0YScgZnJlZXplOwpj b21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0OwoKY2hlY2twb2ludDsKCmJlZ2luOwpj cmVhdGUgdGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CkNSRUFURSBUUklHR0VSIGlucyBCRUZP UkUgSU5TRVJUIE9OIHQgRk9SIEVBQ0ggUk9XIEVYRUNVVEUgUFJPQ0VEVVJFIHRyaWdfbm9u ZSgpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVt IHQ7CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3JlYXRlIHRhYmxlIHQg KGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0 IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX25vbmUoKTsKY29weSB0IGZy b20gJy90bXAvdC5kYXRhJyBmcmVlemU7CmNvbW1pdDsKCnZhY3V1bSB0Owpkcm9wIHRhYmxl IHQ7CgpjaGVja3BvaW50OwoKYmVnaW47CmNyZWF0ZSB0YWJsZSB0IChhIGludCwgYiB0ZXh0 KTsKQ1JFQVRFIFRSSUdHRVIgaW5zIEJFRk9SRSBJTlNFUlQgT04gdCBGT1IgRUFDSCBST1cg RVhFQ1VURSBQUk9DRURVUkUgdHJpZ19ub25lKCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0 YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0OwoKY2hlY2twb2lu dDsKCmJlZ2luOwpjcmVhdGUgdGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CkNSRUFURSBUUklH R0VSIGlucyBCRUZPUkUgSU5TRVJUIE9OIHQgRk9SIEVBQ0ggUk9XIEVYRUNVVEUgUFJPQ0VE VVJFIHRyaWdfbm9uZSgpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6ZTsKY29t bWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3Jl YXRlIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JF IElOU0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX25vbmUo KTsKY29weSB0IGZyb20gJy90bXAvdC5kYXRhJyBmcmVlemU7CmNvbW1pdDsKCnZhY3V1bSB0 Owpkcm9wIHRhYmxlIHQ7CgpjaGVja3BvaW50OwoKYmVnaW47CmNyZWF0ZSB0YWJsZSB0IChh IGludCwgYiB0ZXh0KTsKQ1JFQVRFIFRSSUdHRVIgaW5zIEJFRk9SRSBJTlNFUlQgT04gdCBG T1IgRUFDSCBST1cgRVhFQ1VURSBQUk9DRURVUkUgdHJpZ19ub25lKCk7CmNvcHkgdCBmcm9t ICcvdG1wL3QuZGF0YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0 OwoKY2hlY2twb2ludDsKCmJlZ2luOwpjcmVhdGUgdGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7 CkNSRUFURSBUUklHR0VSIGlucyBCRUZPUkUgSU5TRVJUIE9OIHQgRk9SIEVBQ0ggUk9XIEVY RUNVVEUgUFJPQ0VEVVJFIHRyaWdfbm9uZSgpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEn IGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7 CgpiZWdpbjsKY3JlYXRlIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dF UiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVS RSB0cmlnX25vbmUoKTsKY29weSB0IGZyb20gJy90bXAvdC5kYXRhJyBmcmVlemU7CmNvbW1p dDsKCnZhY3V1bSB0Owpkcm9wIHRhYmxlIHQ7CgoKCgoKY2hlY2twb2ludDsKCmJlZ2luOwpj cmVhdGUgdW5sb2dnZWQgdGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CmNvcHkgdCBmcm9tICcv dG1wL3QuZGF0YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0OwoK Y2hlY2twb2ludDsKCmJlZ2luOwpjcmVhdGUgdW5sb2dnZWQgdGFibGUgdCAoYSBpbnQsIGIg dGV4dCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1 dW0gdDsKZHJvcCB0YWJsZSB0OwoKY2hlY2twb2ludDsKCmJlZ2luOwpjcmVhdGUgdW5sb2dn ZWQgdGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0YScg ZnJlZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0OwoKY2hlY2twb2ludDsK CmJlZ2luOwpjcmVhdGUgdW5sb2dnZWQgdGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CmNvcHkg dCBmcm9tICcvdG1wL3QuZGF0YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0 YWJsZSB0OwoKY2hlY2twb2ludDsKCmJlZ2luOwpjcmVhdGUgdW5sb2dnZWQgdGFibGUgdCAo YSBpbnQsIGIgdGV4dCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0YScgZnJlZXplOwpjb21t aXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0OwoKY2hlY2twb2ludDsKCmJlZ2luOwpjcmVh dGUgdW5sb2dnZWQgdGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CmNvcHkgdCBmcm9tICcvdG1w L3QuZGF0YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0OwoKY2hl Y2twb2ludDsKCmJlZ2luOwpjcmVhdGUgdW5sb2dnZWQgdGFibGUgdCAoYSBpbnQsIGIgdGV4 dCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1dW0g dDsKZHJvcCB0YWJsZSB0OwoKY2hlY2twb2ludDsKCmJlZ2luOwpjcmVhdGUgdW5sb2dnZWQg dGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0YScgZnJl ZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0OwoKY2hlY2twb2ludDsKCmJl Z2luOwpjcmVhdGUgdW5sb2dnZWQgdGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CmNvcHkgdCBm cm9tICcvdG1wL3QuZGF0YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJs ZSB0OwoKY2hlY2twb2ludDsKCmJlZ2luOwpjcmVhdGUgdW5sb2dnZWQgdGFibGUgdCAoYSBp bnQsIGIgdGV4dCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0YScgZnJlZXplOwpjb21taXQ7 Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0OwoKCgoKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3Jl YXRlIHVubG9nZ2VkIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBp bnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0 cmlnX2FsbCgpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoK dmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3JlYXRlIHVu bG9nZ2VkIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVG T1JFIElOU0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX2Fs bCgpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVt IHQ7CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3JlYXRlIHVubG9nZ2Vk IHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JFIElO U0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX2FsbCgpOwpj b3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVtIHQ7CmRy b3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3JlYXRlIHVubG9nZ2VkIHRhYmxl IHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JFIElOU0VSVCBP TiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX2FsbCgpOwpjb3B5IHQg ZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFi bGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3JlYXRlIHVubG9nZ2VkIHRhYmxlIHQgKGEg aW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0IEZP UiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX2FsbCgpOwpjb3B5IHQgZnJvbSAn L3RtcC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsK CmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3JlYXRlIHVubG9nZ2VkIHRhYmxlIHQgKGEgaW50LCBi IHRleHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNI IFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX2FsbCgpOwpjb3B5IHQgZnJvbSAnL3RtcC90 LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsKCmNoZWNr cG9pbnQ7CgpiZWdpbjsKY3JlYXRlIHVubG9nZ2VkIHRhYmxlIHQgKGEgaW50LCBiIHRleHQp OwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBF WEVDVVRFIFBST0NFRFVSRSB0cmlnX2FsbCgpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEn IGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7 CgpiZWdpbjsKY3JlYXRlIHVubG9nZ2VkIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVB VEUgVFJJR0dFUiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRF IFBST0NFRFVSRSB0cmlnX2FsbCgpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6 ZTsKY29tbWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdp bjsKY3JlYXRlIHVubG9nZ2VkIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJ R0dFUiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NF RFVSRSB0cmlnX2FsbCgpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6ZTsKY29t bWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3Jl YXRlIHVubG9nZ2VkIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBp bnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0 cmlnX2FsbCgpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoK dmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsKCgoKCgoKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3Jl YXRlIHVubG9nZ2VkIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBp bnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0 cmlnX25vbmUoKTsKY29weSB0IGZyb20gJy90bXAvdC5kYXRhJyBmcmVlemU7CmNvbW1pdDsK CnZhY3V1bSB0Owpkcm9wIHRhYmxlIHQ7CgpjaGVja3BvaW50OwoKYmVnaW47CmNyZWF0ZSB1 bmxvZ2dlZCB0YWJsZSB0IChhIGludCwgYiB0ZXh0KTsKQ1JFQVRFIFRSSUdHRVIgaW5zIEJF Rk9SRSBJTlNFUlQgT04gdCBGT1IgRUFDSCBST1cgRVhFQ1VURSBQUk9DRURVUkUgdHJpZ19u b25lKCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1 dW0gdDsKZHJvcCB0YWJsZSB0OwoKY2hlY2twb2ludDsKCmJlZ2luOwpjcmVhdGUgdW5sb2dn ZWQgdGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CkNSRUFURSBUUklHR0VSIGlucyBCRUZPUkUg SU5TRVJUIE9OIHQgRk9SIEVBQ0ggUk9XIEVYRUNVVEUgUFJPQ0VEVVJFIHRyaWdfbm9uZSgp Owpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVtIHQ7 CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3JlYXRlIHVubG9nZ2VkIHRh YmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JFIElOU0VS VCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX25vbmUoKTsKY29w eSB0IGZyb20gJy90bXAvdC5kYXRhJyBmcmVlemU7CmNvbW1pdDsKCnZhY3V1bSB0Owpkcm9w IHRhYmxlIHQ7CgpjaGVja3BvaW50OwoKYmVnaW47CmNyZWF0ZSB1bmxvZ2dlZCB0YWJsZSB0 IChhIGludCwgYiB0ZXh0KTsKQ1JFQVRFIFRSSUdHRVIgaW5zIEJFRk9SRSBJTlNFUlQgT04g dCBGT1IgRUFDSCBST1cgRVhFQ1VURSBQUk9DRURVUkUgdHJpZ19ub25lKCk7CmNvcHkgdCBm cm9tICcvdG1wL3QuZGF0YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJs ZSB0OwoKY2hlY2twb2ludDsKCmJlZ2luOwpjcmVhdGUgdW5sb2dnZWQgdGFibGUgdCAoYSBp bnQsIGIgdGV4dCk7CkNSRUFURSBUUklHR0VSIGlucyBCRUZPUkUgSU5TRVJUIE9OIHQgRk9S IEVBQ0ggUk9XIEVYRUNVVEUgUFJPQ0VEVVJFIHRyaWdfbm9uZSgpOwpjb3B5IHQgZnJvbSAn L3RtcC90LmRhdGEnIGZyZWV6ZTsKY29tbWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsK CmNoZWNrcG9pbnQ7CgpiZWdpbjsKY3JlYXRlIHVubG9nZ2VkIHRhYmxlIHQgKGEgaW50LCBi IHRleHQpOwpDUkVBVEUgVFJJR0dFUiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNI IFJPVyBFWEVDVVRFIFBST0NFRFVSRSB0cmlnX25vbmUoKTsKY29weSB0IGZyb20gJy90bXAv dC5kYXRhJyBmcmVlemU7CmNvbW1pdDsKCnZhY3V1bSB0Owpkcm9wIHRhYmxlIHQ7CgpjaGVj a3BvaW50OwoKYmVnaW47CmNyZWF0ZSB1bmxvZ2dlZCB0YWJsZSB0IChhIGludCwgYiB0ZXh0 KTsKQ1JFQVRFIFRSSUdHRVIgaW5zIEJFRk9SRSBJTlNFUlQgT04gdCBGT1IgRUFDSCBST1cg RVhFQ1VURSBQUk9DRURVUkUgdHJpZ19ub25lKCk7CmNvcHkgdCBmcm9tICcvdG1wL3QuZGF0 YScgZnJlZXplOwpjb21taXQ7Cgp2YWN1dW0gdDsKZHJvcCB0YWJsZSB0OwoKY2hlY2twb2lu dDsKCmJlZ2luOwpjcmVhdGUgdW5sb2dnZWQgdGFibGUgdCAoYSBpbnQsIGIgdGV4dCk7CkNS RUFURSBUUklHR0VSIGlucyBCRUZPUkUgSU5TRVJUIE9OIHQgRk9SIEVBQ0ggUk9XIEVYRUNV VEUgUFJPQ0VEVVJFIHRyaWdfbm9uZSgpOwpjb3B5IHQgZnJvbSAnL3RtcC90LmRhdGEnIGZy ZWV6ZTsKY29tbWl0OwoKdmFjdXVtIHQ7CmRyb3AgdGFibGUgdDsKCmNoZWNrcG9pbnQ7Cgpi ZWdpbjsKY3JlYXRlIHVubG9nZ2VkIHRhYmxlIHQgKGEgaW50LCBiIHRleHQpOwpDUkVBVEUg VFJJR0dFUiBpbnMgQkVGT1JFIElOU0VSVCBPTiB0IEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBS T0NFRFVSRSB0cmlnX25vbmUoKTsKY29weSB0IGZyb20gJy90bXAvdC5kYXRhJyBmcmVlemU7 CmNvbW1pdDsKCnZhY3V1bSB0Owpkcm9wIHRhYmxlIHQ7Cgo= --------------AC23EB3777EE083F54AEE753--