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.94.2) (envelope-from ) id 1uF8ER-000Lu7-I2 for pgsql-hackers@arkaria.postgresql.org; Wed, 14 May 2025 09:16:56 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1uF8EQ-009FyI-Kp for pgsql-hackers@arkaria.postgresql.org; Wed, 14 May 2025 09:16:54 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1uF8EP-009Fy8-VL for pgsql-hackers@lists.postgresql.org; Wed, 14 May 2025 09:16:54 +0000 Received: from mail-vk1-xa32.google.com ([2607:f8b0:4864:20::a32]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1uF8EN-001jRY-1G for pgsql-hackers@lists.postgresql.org; Wed, 14 May 2025 09:16:53 +0000 Received: by mail-vk1-xa32.google.com with SMTP id 71dfb90a1353d-52c7aa0c371so2498292e0c.2 for ; Wed, 14 May 2025 02:16:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747214211; x=1747819011; 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=4Ee6qJNz1OR0QSJSsSytL46ZSm74phkEsrQP+jJkE88=; b=GKsWuwWYgZFAMBXGWSG2YPdzGmAgOvFdIAb4A25Z+AKhkJBvJPtIxnoYhospC6Ohj1 bISVoicJnJzxMEj1TPj82BhtPskcfi4fjh0k2PPOJBQcbN0X97/2rMe/WeixcZjFAa4I OG4YIAhBARHH9Fjmxa+pStPwYd6liAGgE0gNFjkBHPDEO16VhTlc5cYDI72tPLFxIzGz +x/re9Pn/hSZDGTNI3Kvplzx+rsLoImAYANO/by9gOFr4Jg/widgSk5So0JogpjNthyj AC1k+lJfuDyGiHOP013sKAs+wotQmy8RCnwxj5SbuLK89VAquyT5wfAaPyqlNWOSLfA4 t18w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747214211; x=1747819011; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=4Ee6qJNz1OR0QSJSsSytL46ZSm74phkEsrQP+jJkE88=; b=r5wudqbiztQcrk74QKu6eJ3iNaJLk/Z16FZx5/ZQyVpSKo4Gs/jYxdSN6ThMl/EuGR Qq9S3VZ1G3G8kOFu5Q4V1jyNKXXiVrFoCHDeYtr3JuMun2meLGKlNvCWCJLJfK7ZhadR NSYZNyG+swYBNJgQQyqDx8GrRmhWruD1csy34EZWb2fxVYX1g8hD7GhRqueEPzzHE42z AVVn8K0qMF0K5V9E+fIWPigyS9LowbGuVJVBPLE67KLlPP7TOKsx7E8Kw1Rf9tZPPO4F xF/L79qQm+Uk1+G+yJMQAv3Vvq2yabK6Hwns+6sDq+prBX/nWfc1vULwNeZOHQ0na2YW Z6Ig== X-Gm-Message-State: AOJu0Yz+6pZrZJyl/Zr/YRvFzeRhpTX1cGUgYrR8UnAoHFnKZu9sND0O J7hywLkzsGooVKkZ3JrHBW3gsGv2xsYmuJtdmmv1rvDANFmvZCznTdD9A9nmxJPCgRHyk7FJMPg uiezF4CN+yLuCcqKnCqoY2VA1dMk= X-Gm-Gg: ASbGnctewNxaiqNuMXgrwkHjMkvuksTf4lIWz+FdvvaYWLP/JrVAGbyq5D+pFFBq+wF ynUgi1usAH5UgH5h6iUux2mdFaGQ7VKSQn0nQMXhU+qxqWE2PYECjynS8CuJ6Zre2vg65/gpk1I JH0P05uTcE9jyjpKGJwVenq+WeQSPALrfipBYuJxMx6ZTn+5sfX8BcHjnAwiqf X-Google-Smtp-Source: AGHT+IGIq2V7lsyfdGCY1srRMLwXG1geozjUvgX5B1IRPH7gTVsYYjqmUi2LB9pqzFUbMOq+7N2FtGoSpbAMmUYSmNA= X-Received: by 2002:a05:6122:2503:b0:52c:44a5:e65e with SMTP id 71dfb90a1353d-52d9c3bac2fmr1786355e0c.0.1747214211163; Wed, 14 May 2025 02:16:51 -0700 (PDT) MIME-Version: 1.0 References: <202504280840.vmqn6igfmeuh@alvherre.pgsql> In-Reply-To: <202504280840.vmqn6igfmeuh@alvherre.pgsql> From: jian he Date: Wed, 14 May 2025 17:16:14 +0800 X-Gm-Features: AX0GCFtj9kg-oz9xofXVyfW2T5xcfnqVPMLINyz-pEVD3TiheYLYid3iJvW0mow 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="0000000000006745c60635150295" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000006745c60635150295 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Apr 28, 2025 at 4:40=E2=80=AFPM =C3=81lvaro Herrera wrote: > > On 2025-Apr-28, jian he wrote: > > > for tests, just found out i can imitate > > src/test/modules/test_misc/t/001_constraint_validation.pl, > > > > So I created a file: > > src/test/modules/test_misc/t/008_indexscan_validate_notnull.pl > > for TAP tests. > > Seems reasonable, didn't look at it in detail. I think you don't have > any tests where you try to set multiple columns as NOT NULL in a single > ALTER TABLE command; I think this is worth having. Something like > > CREATE TABLE foo (col1 int, col2 int, col3 int); > ... create indexes on col1 and col2 ... > alter table foo set col1 not null, > set col3 not null, > add constraint bla not null b; > and stuff like that. > newly added tests covered that. now the test coverage is quite good, IMHO. also rebased to address test failure. --0000000000006745c60635150295 Content-Type: application/x-patch; name="v6-0001-using-indexscan-to-speedup-add-not-null-constrain.patch" Content-Disposition: attachment; filename="v6-0001-using-indexscan-to-speedup-add-not-null-constrain.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_manq6cce0 RnJvbSA4YzlhNjY4OTkzMzg2YzY3YTNlNmFiMTRlMDJjODdhMzE4NGJlODNiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBqaWFuIGhlIDxqaWFuLnVuaXZlcnNhbGl0eUBnbWFpbC5jb20+ CkRhdGU6IFdlZCwgMTQgTWF5IDIwMjUgMTc6MTQ6MzYgKzA4MDAKU3ViamVjdDogW1BBVENIIHY2 IDEvMV0gdXNpbmcgaW5kZXhzY2FuIHRvIHNwZWVkdXAgYWRkIG5vdCBudWxsIGNvbnN0cmFpbnRz CgpUaGlzIHBhdGNoIHRyaWVzIHRvIHVzZSBpbmRleF9iZWdpbnNjYW4oKSAvIGluZGV4X2dldG5l eHQoKSAvIGluZGV4X2VuZHNjYW4oKQptZW50aW9uZWQgaW4gWzFdIHRvIHNwZWVkdXAgYWRkaW5n IG5vdC1udWxsIGNvbnN0cmFpbnRzIHRvIHRoZSBleGlzdGluZyB0YWJsZS4KClRoZSBtYWluIGxv Z2ljIGhhcHBlbnMgaW4gcGhhc2UzIEFUUmV3cml0ZVRhYmxlCjEuIGNvbGxlY3QgYWxsIG5vdC1u dWxsIGNvbnN0cmFpbnRzLgoyLiBGb3IgZWFjaCBub3QtbnVsbCBjb25zdHJhaW50LCBjaGVjayB3 aGV0aGVyIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBpbmRleAphdmFpbGFibGUgZm9yIHZhbGlk YXRpb24uIElmIG5vdCwgdGhlbiBjYW4gbm90IHVzZSBpbmRleHNjYW4gdG8gdmVyaWZ5IG5vdC1u dWxsCmNvbnN0cmFpbnRzLgozLiBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy ZSB0cnVlCiAgKiB0YWJsZSBzY2FuIG9yIHJld3JpdGUgaXMgcmVxdWlyZWQsCiAgKiB0YWJsZSB3 YXNuJ3QgbG9ja2VkIHdpdGggYEFjY2Vzc0V4Y2x1c2l2ZUxvY2tgCiAgKiB0aGUgTk9UIE5VTEwg Y29uc3RyYWludCBhcHBsaWVzIHRvIGEgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1uCiB0aGVuIGlu ZGV4IHNjYW4gY2Fubm90IGJlIHVzZWQgZm9yIGZhc3QgdmFsaWRhdGlvbi4KNC4gSWYgYWxsIGNv bmRpdGlvbnMgYXJlIHNhdGlzZmllZCwgYXR0ZW1wdCB0byB1c2UgaW5kZXhzY2FuIHRvIHZlcmlm eQp3aGV0aGVyIHRoZSBjb2x1bW4gY29udGFpbnMgYW55IE5VTEwgdmFsdWVzLgoKY29uY3VycmVu Y3kgY29uY2VybjoKQUxURVIgVEFCTEUgU0VUIE5PVCBOVUxMIHdpbGwgdGFrZSBhbiBBQ0NFU1Mg RVhDTFVTSVZFIGxvY2ssIHNvIHRoZXJlIGlzIGxlc3MKdmFyaWFudCBvZiByYWNpbmcgaXNzdWUg Y2FuIG9jY3VyPyAgdG8gcHJvdmUgYWNjdXJhdGUsIEkgd3JvdGUgc29tZSBpc29sYXRpb24KdGVz dHMuIHNlZVsyXQoKcGVyZm9ybWFuY2U6CmRlbW86CmNhc2Ugd2hlbjogJTIwIHBlcmNlbnQgdmFs dWVzIGFyZSBOVUxMIGFuZCBoYXZlIGJlZW4gZGVsZXRlZCBmcm9tIGhlYXAgYnV0IHRoZXkKc3Rp bGwgb24gdGhlIGluZGV4LgoKZHJvcCB0YWJsZSBpZiBleGlzdHMgdDsKY3JlYXRlIHVubG9nZ2Vk IHRhYmxlIHQoYSBpbnQsIGIgaW50KSB3aXRoIChhdXRvdmFjdXVtX2VuYWJsZWQgPSBvZmYsIHZh Y3V1bV9pbmRleF9jbGVhbnVwPW9mZik7Cmluc2VydCBpbnRvIHQgc2VsZWN0IGNhc2Ugd2hlbiBn ICUgNSA9IDAgdGhlbiBudWxsIGVsc2UgZyBlbmQsIGcrMQpmcm9tIGdlbmVyYXRlX3Nlcmllcygx LDFfMDAwXzAwMCkgZzsKY3JlYXRlIGluZGV4IHRfaWR4X2Egb24gdChhKTsKZGVsZXRlIGZyb20g dCB3aGVyZSBhIGlzIG51bGw7CgphbHRlciB0YWJsZSB0IGFsdGVyIGNvbHVtbiBhIGRyb3Agbm90 IG51bGw7CmFsdGVyIHRhYmxlIHQgYWRkIGNvbnN0cmFpbnQgdDEgbm90IG51bGwgYTsKCnRoZSBh Ym92ZSB0d28gc3RhdGVtZW50IHJ1bm5pbmcgc2V2ZXJhbCB0aW1lczoKcGF0Y2ggVGltZTo6IDEu MDg0ICBtcwptYXN0ZXIgVGltZTogMTIuMDQ1IG1zCgpyZWZlcmVuY2VzOgpbMV0gaHR0cHM6Ly9w b3N0Z3IuZXMvbS9DQSUyQlRnbW9hNU5LejhpR1dfOXY3d3olM0QtJTJCelFGdSUzREU0U1pvYVRh VTF6bkxhRVhSWXAtUSU0MG1haWwuZ21haWwuY29tClsyXSBodHRwczovL3Bvc3Rnci5lcy9tLzkw MDA1NkQxLTMyREYtNDkyNy04MjUxLTNFMEMwREM0MDdGRCU0MGFuYXJhemVsLmRlCmRpc2N1c3Np b246IGh0dHBzOi8vcG9zdGdyLmVzL20vQ0FDSnVmeEZpVz00azFpcz1GMUo9ci1DeDFSdUJ5WFFQ VXJXQjMzMVU0N3JTbkd6K2h3QG1haWwuZ21haWwuY29tCmNvbW1pdGZlc3QgZW50cnk6IGh0dHBz Oi8vY29tbWl0ZmVzdC5wb3N0Z3Jlc3FsLm9yZy9wYXRjaC81NDQ0Ci0tLQogc3JjL2JhY2tlbmQv Y29tbWFuZHMvdGFibGVjbWRzLmMgICAgICAgICAgICAgIHwgMTI1ICsrKysrKysrKystCiBzcmMv YmFja2VuZC9leGVjdXRvci9leGVjSW5kZXhpbmcuYyAgICAgICAgICAgfCAyMDAgKysrKysrKysr KysrKysrKysrCiBzcmMvaW5jbHVkZS9leGVjdXRvci9leGVjdXRvci5oICAgICAgICAgICAgICAg fCAgIDIgKwogLi4uL2V4cGVjdGVkL2luZGV4c2Nhbi1jaGVjay1ub3RudWxsLm91dCAgICAgIHwg IDk3ICsrKysrKysrKwogc3JjL3Rlc3QvaXNvbGF0aW9uL2lzb2xhdGlvbl9zY2hlZHVsZSAgICAg ICAgIHwgICAxICsKIC4uLi9zcGVjcy9pbmRleHNjYW4tY2hlY2stbm90bnVsbC5zcGVjICAgICAg ICB8ICA0NSArKysrCiBzcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy9tZXNvbi5idWlsZCAgICAg ICAgfCAgIDEgKwogLi4uL3QvMDA4X2luZGV4c2Nhbl92YWxpZGF0ZV9ub3RudWxsLnBsICAgICAg IHwgMTY0ICsrKysrKysrKysrKysrCiA4IGZpbGVzIGNoYW5nZWQsIDYzMCBpbnNlcnRpb25zKCsp LCA1IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L2lzb2xhdGlvbi9l eHBlY3RlZC9pbmRleHNjYW4tY2hlY2stbm90bnVsbC5vdXQKIGNyZWF0ZSBtb2RlIDEwMDY0NCBz cmMvdGVzdC9pc29sYXRpb24vc3BlY3MvaW5kZXhzY2FuLWNoZWNrLW5vdG51bGwuc3BlYwogY3Jl YXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVsZXMvdGVzdF9taXNjL3QvMDA4X2luZGV4c2Nh bl92YWxpZGF0ZV9ub3RudWxsLnBsCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMv dGFibGVjbWRzLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYwppbmRleCA1NGFk MzgyNDdhYS4uYzI3NjQ1MGFjZWIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3Rh YmxlY21kcy5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jCkBAIC0yMDks MTYgKzIwOSwxOSBAQCB0eXBlZGVmIHN0cnVjdCBBbHRlcmVkVGFibGVJbmZvCiAJTGlzdAkgICAq Y2hhbmdlZFN0YXRpc3RpY3NEZWZzOwkvKiBzdHJpbmcgZGVmaW5pdGlvbnMgb2Ygc2FtZSAqLwog fSBBbHRlcmVkVGFibGVJbmZvOwogCi0vKiBTdHJ1Y3QgZGVzY3JpYmluZyBvbmUgbmV3IGNvbnN0 cmFpbnQgdG8gY2hlY2sgaW4gUGhhc2UgMyBzY2FuICovCi0vKiBOb3RlOiBuZXcgbm90LW51bGwg Y29uc3RyYWludHMgYXJlIGhhbmRsZWQgZWxzZXdoZXJlICovCisvKgorICogU3RydWN0IGRlc2Ny aWJpbmcgb25lIG5ldyBjb25zdHJhaW50IHRvIGNoZWNrIGluIFBoYXNlIDMgc2Nhbi4gTm90ZTog bmV3CisgKiBub3QtbnVsbCBjb25zdHJhaW50cyBhcmUgaGFuZGxlZCBoZXJlIHRvby4KKyovCiB0 eXBlZGVmIHN0cnVjdCBOZXdDb25zdHJhaW50CiB7CiAJY2hhcgkgICAqbmFtZTsJCQkvKiBDb25z dHJhaW50IG5hbWUsIG9yIE5VTEwgaWYgbm9uZSAqLwotCUNvbnN0clR5cGUJY29udHlwZTsJCS8q IENIRUNLIG9yIEZPUkVJR04gKi8KKwlDb25zdHJUeXBlCWNvbnR5cGU7CQkvKiBDSEVDSyBvciBG T1JFSUdOIG9yIE5PVCBOVUxMICovCiAJT2lkCQkJcmVmcmVsaWQ7CQkvKiBQSyByZWwsIGlmIEZP UkVJR04gKi8KIAlPaWQJCQlyZWZpbmRpZDsJCS8qIE9JRCBvZiBQSydzIGluZGV4LCBpZiBGT1JF SUdOICovCiAJYm9vbAkJY29ud2l0aHBlcmlvZDsJLyogV2hldGhlciB0aGUgbmV3IEZPUkVJR04g S0VZIHVzZXMgUEVSSU9EICovCiAJT2lkCQkJY29uaWQ7CQkJLyogT0lEIG9mIHBnX2NvbnN0cmFp bnQgZW50cnksIGlmIEZPUkVJR04gKi8KKwlpbnQJCQlhdHRudW07CQkJLyogTk9UIE5VTEwgY29u c3RyYWludCBhdHRyaWJ1dGUgbnVtYmVyICovCiAJTm9kZQkgICAqcXVhbDsJCQkvKiBDaGVjayBl eHByIG9yIENPTlNUUl9GT1JFSUdOIENvbnN0cmFpbnQgKi8KIAlFeHByU3RhdGUgICpxdWFsc3Rh dGU7CQkvKiBFeGVjdXRpb24gc3RhdGUgZm9yIENIRUNLIGV4cHIgKi8KIH0gTmV3Q29uc3RyYWlu dDsKQEAgLTYxODIsNiArNjE4NSw5IEBAIEFUUmV3cml0ZVRhYmxlKEFsdGVyZWRUYWJsZUluZm8g KnRhYiwgT2lkIE9JRE5ld0hlYXApCiAJCQkJbmVlZHNjYW4gPSB0cnVlOwogCQkJCWNvbi0+cXVh bHN0YXRlID0gRXhlY1ByZXBhcmVFeHByKChFeHByICopIGV4cGFuZF9nZW5lcmF0ZWRfY29sdW1u c19pbl9leHByKGNvbi0+cXVhbCwgb2xkcmVsLCAxKSwgZXN0YXRlKTsKIAkJCQlicmVhazsKKwkJ CWNhc2UgQ09OU1RSX05PVE5VTEw6CisJCQkJLyogTm90aGluZyB0byBkbyBoZXJlICovCisJCQkJ YnJlYWs7CiAJCQljYXNlIENPTlNUUl9GT1JFSUdOOgogCQkJCS8qIE5vdGhpbmcgdG8gZG8gaGVy ZSAqLwogCQkJCWJyZWFrOwpAQCAtNjIzNSw5ICs2MjQxLDgxIEBAIEFUUmV3cml0ZVRhYmxlKEFs dGVyZWRUYWJsZUluZm8gKnRhYiwgT2lkIE9JRE5ld0hlYXApCiAJCQkJCQkJCQkJCQkJCXdob2xl YXR0LT5hdHRudW0pOwogCQkJfQogCQl9Ci0JCWlmIChub3RudWxsX2F0dHJzIHx8IG5vdG51bGxf dmlydHVhbF9hdHRycykKKwl9CisKKwkvKgorCSAqIFRoZSBjb25kaXRpb25zIGZvciB1c2luZyBp bmRleHNjYW4gbWVjaGFuaXNtIGZhc3QgdmVydGlmaW5nIG5vdC1udWxsCisJICogY29uc3RyYWlu dHMgYXJlIHF1aXRlIHN0cmljdC4gQWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBtdXN0 IGJlCisJICogbWV0LgorCSAqIDEuIFdlIG11c3QgaGF2ZSB0aGUgbmVlZCB0byB2YWxpZGF0ZSBu b3QtbnVsbCBjb25zdHJhaW50cworCSAqICAgIFRoYXQgbWVhbnMgQWx0ZXJlZFRhYmxlSW5mby0+ dmVyaWZ5X25ld19ub3RudWxsIG11c3QgYmUgdHJ1ZS4KKwkgKiAyLiBJZiB0YWJsZSBzY2FuIG9y IHRhYmxlIHJld3JpdGUgaXMgZXhwZWN0ZWQgbGF0ZXIsIHVzaW5nIGluZGV4c2NhbiBpcworCSAq ICAgIGp1c3Qgd2FzdGVzIGN5Y2xlcy4KKwkgKiAzLiBJbmRleGVzIGNhbm5vdCBiZSBjcmVhdGVk IG9uIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMsIHNvIGZhc3QKKwkgKiAgICBjaGVja2luZyBu b3QtbnVsbCBjb25zdHJhaW50cyBpcyBub3QgYXBwbGljYWJsZSB0byB0aGVtLgorCSAqIDQuIE9u bHkgYXBwbHkgdG8gcmVndWxhciByZWxhdGlvbnMuCisJICogNS4gVG8gYXZvaWQgY29uY3VycmVu Y3kgaXNzdWUsIHdlIG9ubHkgZG8gaXQgd2hlbiB0YWJsZSB3YXMgbG9ja2VkIHdpdGgKKwkgKiAg ICBhbiBBY2Nlc3NFeGNsdXNpdmVMb2NrLCB3aGljaCBpcyB0aGUgbG9jayBhY3F1aXJlZCBkdXJp bmcgQUxURVIgVEFCTEUKKwkgKiAgICBTRVQgTk9UIE5VTEwuCisJKi8KKwlpZiAoIW5lZWRzY2Fu ICYmCisJCW5ld3JlbCA9PSBOVUxMICYmCisJCSF0YWItPnJld3JpdGUgJiYKKwkJdGFiLT52ZXJp ZnlfbmV3X25vdG51bGwgJiYKKwkJbm90bnVsbF92aXJ0dWFsX2F0dHJzID09IE5JTCAmJgorCQlv bGRyZWwtPnJkX3JlbC0+cmVsa2luZCA9PSBSRUxLSU5EX1JFTEFUSU9OICYmCisJCUNoZWNrUmVs YXRpb25Mb2NrZWRCeU1lKG9sZHJlbCwgQWNjZXNzRXhjbHVzaXZlTG9jaywgZmFsc2UpKQorCXsK KwkJTGlzdAkgICAqbm90bnVsbF9hdHRudW1zID0gTklMOworCisJCWZvcmVhY2gobCwgdGFiLT5j b25zdHJhaW50cykKKwkJeworCQkJTmV3Q29uc3RyYWludCAqY29uID0gbGZpcnN0KGwpOworCisJ CQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHRyID0gVHVwbGVEZXNjQXR0cihuZXdUdXBEZXNjLCBjb24t PmF0dG51bSAtIDEpOworCisJCQlpZiAoY29uLT5jb250eXBlICE9IENPTlNUUl9OT1ROVUxMKQor CQkJCWNvbnRpbnVlOworCisJCQlBc3NlcnQoYXR0ci0+YXR0bm90bnVsbCk7CisJCQlBc3NlcnQo Y29uLT5hdHRudW0gPiAwKTsKKwkJCUFzc2VydChhdHRyLT5hdHRudW0gPT0gY29uLT5hdHRudW0p OworCisJCQlpZiAoYXR0ci0+YXR0Z2VuZXJhdGVkID09IEFUVFJJQlVURV9HRU5FUkFURURfVklS VFVBTCkKKwkJCXsKKwkJCQluZWVkc2NhbiA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJ CW5vdG51bGxfYXR0bnVtcyA9IGxhcHBlbmRfaW50KG5vdG51bGxfYXR0bnVtcywgYXR0ci0+YXR0 bnVtKTsKKwkJfQorCisJCS8qCisJCSAqIG5vdG51bGxfYXR0bnVtcyBjb250YWlucyBhbGwgYXR0 cmlidXRlcyB3aXRoIE5PVCBOVUxMIGNvbnN0cmFpbnRzCisJCSAqIHRoYXQgbmVlZCB2YWxpZGF0 aW9uLiAgSWYgbmVlZHNjYW4gaXMgdHJ1ZSwgbGF0ZXIgdGFibGUgc2NhbgorCQkgKiB3aWxsIGRv IHRoZSB2YWxpZGF0aW9uLCBpbmRlZHhzY2FuIHdvdWxkIGp1c3Qgd2FzdGUgY3ljbGUuCisJCSov CisJCWlmIChub3RudWxsX2F0dG51bXMgIT0gTklMICYmICFuZWVkc2NhbikKKwkJeworCQkJaWYg KCFpbmRleF9jaGVja19ub3RudWxsKG9sZHJlbCwgbm90bnVsbF9hdHRudW1zKSkKKwkJCQluZWVk c2NhbiA9IHRydWU7CisJCQllbHNlCisJCQkJZXJlcG9ydChERUJVRzEsCisJCQkJCQllcnJtc2df aW50ZXJuYWwoImFsbCBuZXcgbm90LW51bGwgY29uc3RyYWludHMgb24gcmVsYXRpb24gXCIlc1wi IGhhdmUgYmVlbiB2YWxpZGF0ZWQgYnkgdXNpbmcgaW5kZXggc2NhbiIsCisJCQkJCQkJCQkJUmVs YXRpb25HZXRSZWxhdGlvbk5hbWUob2xkcmVsKSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLyoK KwkJCSAqIGNvcm5lciBjYXNlOiBpbiBQaGFzZTIsIHNvbWVob3cgd2UgZGlkbid0IGFkZCB0aGUg Tk9UIE5VTEwKKwkJCSAqIGNvbnN0cmFpbnQgdG8gQWx0ZXJlZFRhYmxlSW5mby0+Y29uc3RyYWlu dHMsIGJ1dCBhbHJlYWR5IHNldAorCQkJICogdmVyaWZ5X25ld19ub3RudWxsIHRvIHRydWUgdGhl biB0YWJsZSBzY2FuIGlzIG5lZWRlZC4KKwkJCSovCiAJCQluZWVkc2NhbiA9IHRydWU7CisJCX0K IAl9CisJZWxzZSBpZiAobm90bnVsbF9hdHRycyB8fCBub3RudWxsX3ZpcnR1YWxfYXR0cnMpCisJ CW5lZWRzY2FuID0gdHJ1ZTsKIAogCWlmIChuZXdyZWwgfHwgbmVlZHNjYW4pCiAJewpAQCAtNzkx MCw2ICs3OTg4LDcgQEAgQVRFeGVjU2V0Tm90TnVsbChMaXN0ICoqd3F1ZXVlLCBSZWxhdGlvbiBy ZWwsIGNoYXIgKmNvbk5hbWUsIGNoYXIgKmNvbE5hbWUsCiAJQ29va2VkQ29uc3RyYWludCAqY2Nv bjsKIAlMaXN0CSAgICpjb29rZWQ7CiAJYm9vbAkJaXNfbm9faW5oZXJpdCA9IGZhbHNlOworCUFs dGVyZWRUYWJsZUluZm8gKnRhYiA9IE5VTEw7CiAKIAkvKiBHdWFyZCBhZ2FpbnN0IHN0YWNrIG92 ZXJmbG93IGR1ZSB0byBvdmVybHkgZGVlcCBpbmhlcml0YW5jZSB0cmVlLiAqLwogCWNoZWNrX3N0 YWNrX2RlcHRoKCk7CkBAIC04MDM0LDEwICs4MTEzLDMxIEBAIEFURXhlY1NldE5vdE51bGwoTGlz dCAqKndxdWV1ZSwgUmVsYXRpb24gcmVsLCBjaGFyICpjb25OYW1lLCBjaGFyICpjb2xOYW1lLAog CWNvbnN0cmFpbnQtPmlzX25vX2luaGVyaXQgPSBpc19ub19pbmhlcml0OwogCWNvbnN0cmFpbnQt PmNvbm5hbWUgPSBjb25OYW1lOwogCisJdGFiID0gQVRHZXRRdWV1ZUVudHJ5KHdxdWV1ZSwgcmVs KTsKKwogCS8qIGFuZCBkbyBpdCAqLwogCWNvb2tlZCA9IEFkZFJlbGF0aW9uTmV3Q29uc3RyYWlu dHMocmVsLCBOSUwsIGxpc3RfbWFrZTEoY29uc3RyYWludCksCiAJCQkJCQkJCQkgICBmYWxzZSwg IXJlY3Vyc2luZywgZmFsc2UsIE5VTEwpOwogCWNjb24gPSBsaW5pdGlhbChjb29rZWQpOworCisJ QXNzZXJ0KGNjb24tPmNvbnR5cGUgPT0gQ09OU1RSX05PVE5VTEwpOworCisJLyoKKwkgKiB3ZSBt YXkgdXNlIGluZGV4c2NhbiB0byB2YWxpZGF0ZSBub3QtbnVsbCBjb25zdHJhaW50IGluIFBoYXNl My4gIEFkZCB0aGUKKwkgKiB0by1iZS12YWxpZGF0ZWQgbm90LW51bGwgY29uc3RyYWludCB0byBQ aGFzZSAzJ3MgcXVldWUuCisJKi8KKwlpZiAoIWNjb24tPnNraXBfdmFsaWRhdGlvbikKKwl7CisJ CU5ld0NvbnN0cmFpbnQgKm5ld2NvbjsKKwkJbmV3Y29uID0gKE5ld0NvbnN0cmFpbnQgKikgcGFs bG9jMChzaXplb2YoTmV3Q29uc3RyYWludCkpOworCisJCW5ld2Nvbi0+bmFtZSA9IGNjb24tPm5h bWU7CisJCW5ld2Nvbi0+Y29udHlwZSA9IGNjb24tPmNvbnR5cGU7CisJCW5ld2Nvbi0+YXR0bnVt ID0gY2Nvbi0+YXR0bnVtOworCisJCXRhYi0+Y29uc3RyYWludHMgPSBsYXBwZW5kKHRhYi0+Y29u c3RyYWludHMsIG5ld2Nvbik7CisJfQorCiAJT2JqZWN0QWRkcmVzc1NldChhZGRyZXNzLCBDb25z dHJhaW50UmVsYXRpb25JZCwgY2Nvbi0+Y29ub2lkKTsKIAogCUludm9rZU9iamVjdFBvc3RBbHRl ckhvb2soUmVsYXRpb25SZWxhdGlvbklkLApAQCAtOTkxOCwxMyArMTAwMTgsMTUgQEAgQVRBZGRD aGVja05OQ29uc3RyYWludChMaXN0ICoqd3F1ZXVlLCBBbHRlcmVkVGFibGVJbmZvICp0YWIsIFJl bGF0aW9uIHJlbCwKIAl7CiAJCUNvb2tlZENvbnN0cmFpbnQgKmNjb24gPSAoQ29va2VkQ29uc3Ry YWludCAqKSBsZmlyc3QobGNvbik7CiAKLQkJaWYgKCFjY29uLT5za2lwX3ZhbGlkYXRpb24gJiYg Y2Nvbi0+Y29udHlwZSAhPSBDT05TVFJfTk9UTlVMTCkKKwkJaWYgKCFjY29uLT5za2lwX3ZhbGlk YXRpb24pCiAJCXsKIAkJCU5ld0NvbnN0cmFpbnQgKm5ld2NvbjsKIAogCQkJbmV3Y29uID0gKE5l d0NvbnN0cmFpbnQgKikgcGFsbG9jMChzaXplb2YoTmV3Q29uc3RyYWludCkpOwogCQkJbmV3Y29u LT5uYW1lID0gY2Nvbi0+bmFtZTsKIAkJCW5ld2Nvbi0+Y29udHlwZSA9IGNjb24tPmNvbnR5cGU7 CisJCQlpZiAoY2Nvbi0+Y29udHlwZSA9PSBDT05TVFJfTk9UTlVMTCkKKwkJCQluZXdjb24tPmF0 dG51bSA9IGNjb24tPmF0dG51bTsKIAkJCW5ld2Nvbi0+cXVhbCA9IGNjb24tPmV4cHI7CiAKIAkJ CXRhYi0+Y29uc3RyYWludHMgPSBsYXBwZW5kKHRhYi0+Y29uc3RyYWludHMsIG5ld2Nvbik7CkBA IC0xMzE2Niw2ICsxMzI2OCw3IEBAIFF1ZXVlTk5Db25zdHJhaW50VmFsaWRhdGlvbihMaXN0ICoq d3F1ZXVlLCBSZWxhdGlvbiBjb25yZWwsIFJlbGF0aW9uIHJlbCwKIAlMaXN0CSAgICpjaGlsZHJl biA9IE5JTDsKIAlBdHRyTnVtYmVyCWF0dG51bTsKIAljaGFyCSAgICpjb2xuYW1lOworCU5ld0Nv bnN0cmFpbnQgKm5ld2NvbjsKIAogCWNvbiA9IChGb3JtX3BnX2NvbnN0cmFpbnQpIEdFVFNUUlVD VChjb250dXBsZSk7CiAJQXNzZXJ0KGNvbi0+Y29udHlwZSA9PSBDT05TVFJBSU5UX05PVE5VTEwp OwpAQCAtMTMyMjksNyArMTMzMzIsMTkgQEAgUXVldWVOTkNvbnN0cmFpbnRWYWxpZGF0aW9uKExp c3QgKip3cXVldWUsIFJlbGF0aW9uIGNvbnJlbCwgUmVsYXRpb24gcmVsLAogCS8qIFNldCBhdHRu b3RudWxsIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBxdWV1ZWluZyBhbm90aGVyIHZhbGlkYXRpb24g Ki8KIAlzZXRfYXR0bm90bnVsbChOVUxMLCByZWwsIGF0dG51bSwgdHJ1ZSwgZmFsc2UpOwogCisJ LyoKKwkgKiBRdWV1ZSB2YWxpZGF0aW9uIGZvciBwaGFzZSAzLiAgQUxURVIgVEFCTEUgU0VUIE5P VCBOVUxMIHdpbGwgYWRkIE5PVCBOVUxMCisJICogY29uc3RyYWludCB0byBBbHRlcmVkVGFibGVJ bmZvLT5jb25zdHJhaW50cywgZm9yIGNvbnNpc3RlbmN5LCBkbyB0aGUgc2FtZQorCSAqIGhlcmUu CisJKi8KKwluZXdjb24gPSAoTmV3Q29uc3RyYWludCAqKSBwYWxsb2MwKHNpemVvZihOZXdDb25z dHJhaW50KSk7CisJbmV3Y29uLT5uYW1lID0gY29sbmFtZTsKKwluZXdjb24tPmNvbnR5cGUgPSBD T05TVFJfTk9UTlVMTDsKKwluZXdjb24tPmF0dG51bSA9IGF0dG51bTsKKworCS8qIEZpbmQgb3Ig Y3JlYXRlIHdvcmsgcXVldWUgZW50cnkgZm9yIHRoaXMgdGFibGUgKi8KIAl0YWIgPSBBVEdldFF1 ZXVlRW50cnkod3F1ZXVlLCByZWwpOworCXRhYi0+Y29uc3RyYWludHMgPSBsYXBwZW5kKHRhYi0+ Y29uc3RyYWludHMsIG5ld2Nvbik7CiAJdGFiLT52ZXJpZnlfbmV3X25vdG51bGwgPSB0cnVlOwog CiAJLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNJbmRleGluZy5jIGIv c3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY0luZGV4aW5nLmMKaW5kZXggYmRmODYyYjI0MDYuLmQx NjQ4ZTJhOTY0IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjSW5kZXhpbmcu YworKysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjSW5kZXhpbmcuYwpAQCAtMTA4LDEyICsx MDgsMTUgQEAKIAogI2luY2x1ZGUgImFjY2Vzcy9nZW5hbS5oIgogI2luY2x1ZGUgImFjY2Vzcy9y ZWxzY2FuLmgiCisjaW5jbHVkZSAiYWNjZXNzL3RhYmxlLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3Rh YmxlYW0uaCIKICNpbmNsdWRlICJhY2Nlc3MveGFjdC5oIgogI2luY2x1ZGUgImNhdGFsb2cvaW5k ZXguaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX2FtX2QuaCIKICNpbmNsdWRlICJleGVjdXRvci9l eGVjdXRvci5oIgogI2luY2x1ZGUgIm5vZGVzL25vZGVGdW5jcy5oIgogI2luY2x1ZGUgInN0b3Jh Z2UvbG1nci5oIgorI2luY2x1ZGUgInV0aWxzL2ZtZ3JvaWRzLmgiCiAjaW5jbHVkZSAidXRpbHMv bXVsdGlyYW5nZXR5cGVzLmgiCiAjaW5jbHVkZSAidXRpbHMvcmFuZ2V0eXBlcy5oIgogI2luY2x1 ZGUgInV0aWxzL3NuYXBtZ3IuaCIKQEAgLTE0NSw2ICsxNDgsNyBAQCBzdGF0aWMgYm9vbCBpbmRl eF9leHByZXNzaW9uX2NoYW5nZWRfd2Fsa2VyKE5vZGUgKm5vZGUsCiAJCQkJCQkJCQkJCUJpdG1h cHNldCAqYWxsVXBkYXRlZENvbHMpOwogc3RhdGljIHZvaWQgRXhlY1dpdGhvdXRPdmVybGFwc05v dEVtcHR5KFJlbGF0aW9uIHJlbCwgTmFtZURhdGEgYXR0bmFtZSwgRGF0dW0gYXR0dmFsLAogCQkJ CQkJCQkJCWNoYXIgdHlwdHlwZSwgT2lkIGF0dHR5cGlkKTsKK3N0YXRpYyBib29sIGluZGV4X2No ZWNrX25vdG51bGxfaW50ZXJuYWwoUmVsYXRpb24gcmVsYXRpb24sIExpc3QgKmF0dG51bXMsIExp c3QgKmlkeHMpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKgkJRXhlY09wZW5JbmRpY2VzCkBAIC0xMTcyLDMg KzExNzYsMTk5IEBAIEV4ZWNXaXRob3V0T3ZlcmxhcHNOb3RFbXB0eShSZWxhdGlvbiByZWwsIE5h bWVEYXRhIGF0dG5hbWUsIERhdHVtIGF0dHZhbCwgY2hhciB0CiAJCQkJIGVycm1zZygiZW1wdHkg V0lUSE9VVCBPVkVSTEFQUyB2YWx1ZSBmb3VuZCBpbiBjb2x1bW4gXCIlc1wiIGluIHJlbGF0aW9u IFwiJXNcIiIsCiAJCQkJCQlOYW1lU3RyKGF0dG5hbWUpLCBSZWxhdGlvbkdldFJlbGF0aW9uTmFt ZShyZWwpKSkpOwogfQorCisvKgorICogbm90bnVsbF9hdHRudW1zOiBsaXN0IG9mIGF0dHJpYnV0 ZSBudW1iZXJzIG9mIGFsbCBuZXcgbm90LW51bGwgY29uc3RyYWludHMuCisgKgorICogRmlyc3Qg Y2hlY2sgaWYgdGhlIHJlbGF0aW9uIGhhcyBhIHN1aXRhYmxlIGluZGV4IGZvciBlYWNoIG5vdC1u dWxsIGF0dHJpYnV0ZS4KKyAqIElmIGl0IGRvZXMsIHRoZW4gdXNpbmcgaW5kZXhzY2FuIG1lY2hh bmlzbSB0byB2ZXJpZnkgdGhhdCAqYWxsKiBhdHRyaWJ1dGVzIG9uCisgKiBub3RudWxsX2F0dG51 bXMgYXJlIGluZGVlZCBub3QgbnVsbC4KKyAqCisgKiBSZXR1cm5pbmcgdHJ1ZSBtZWFucyBieSB1 c2luZyBpbmRleHNjYW4gbWVjaGFuaXNtLCBhbGwgbmV3IG5vdC1udWxsCisgKiBjb25zdHJhaW50 cyBoYXZlIGJlZW4gdmFsaWRhdGVkLgorICovCitib29sCitpbmRleF9jaGVja19ub3RudWxsKFJl bGF0aW9uIHJlbGF0aW9uLCBMaXN0ICpub3RudWxsX2F0dG51bXMpCit7CisJUmVsYXRpb24JcGdf aW5kZXg7CisJUmVsYXRpb24JaW5kZXhfcmVsOworCVN5c1NjYW5EZXNjIGluZHNjYW47CisJU2Nh bktleURhdGEgc2tleTsKKwlIZWFwVHVwbGUJaHR1cDsKKwlUdXBsZURlc2MJdHVwZGVzYzsKKwlG b3JtX3BnX2F0dHJpYnV0ZSBhdHRyOworCUxpc3QJICAgKnJlc3VsdCA9IE5JTDsKKwlMaXN0CSAg ICphdHRudW1zID0gTklMOworCisJdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IocmVsYXRpb24p OworCisJLyogUHJlcGFyZSB0byBzY2FuIHBnX2luZGV4IGZvciBlbnRyaWVzIGhhdmluZyBpbmRy ZWxpZCA9IHRoaXMgcmVsLiAqLworCVNjYW5LZXlJbml0KCZza2V5LAorCQkJCUFudW1fcGdfaW5k ZXhfaW5kcmVsaWQsCisJCQkJQlRFcXVhbFN0cmF0ZWd5TnVtYmVyLCBGX09JREVRLAorCQkJCU9i amVjdElkR2V0RGF0dW0oUmVsYXRpb25HZXRSZWxpZChyZWxhdGlvbikpKTsKKworCXBnX2luZGV4 ID0gdGFibGVfb3BlbihJbmRleFJlbGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9jayk7CisJaW5kc2Nh biA9IHN5c3RhYmxlX2JlZ2luc2NhbihwZ19pbmRleCwgSW5kZXhJbmRyZWxpZEluZGV4SWQsIHRy dWUsCisJCQkJCQkJCSBOVUxMLCAxLCAmc2tleSk7CisKKwl3aGlsZSAoSGVhcFR1cGxlSXNWYWxp ZChodHVwID0gc3lzdGFibGVfZ2V0bmV4dChpbmRzY2FuKSkpCisJeworCQlGb3JtX3BnX2luZGV4 IGluZGV4ID0gKEZvcm1fcGdfaW5kZXgpIEdFVFNUUlVDVChodHVwKTsKKworCQkvKgorCQkgKiB3 ZSBjYW4gb25seSB1c2Ugbm9uLWRlZmVycmVkLCB2YWxpZGF0ZWQsIGFuZCBhbGl2ZSBidHJlZSBp bmRleCB0bworCQkgKiB2YWxpZGF0ZSBub3QtbnVsbCBjb25zdHJhaW50cworCQkgKi8KKwkJaWYg KCFpbmRleC0+aW5kaW1tZWRpYXRlIHx8ICFpbmRleC0+aW5kaXN2YWxpZCB8fCAhaW5kZXgtPmlu ZGlzbGl2ZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGNhbiBub3QgdXNlIGV4cHJlc3Npb24gaW5k ZXggb3IgcGFydGlhbCBpbmRleCB0b28gKi8KKwkJaWYgKCFoZWFwX2F0dGlzbnVsbChodHVwLCBB bnVtX3BnX2luZGV4X2luZGV4cHJzLCBOVUxMKSB8fAorCQkJIWhlYXBfYXR0aXNudWxsKGh0dXAs IEFudW1fcGdfaW5kZXhfaW5kcHJlZCwgTlVMTCkpCisJCQljb250aW51ZTsKKworCQkvKiBjYW4g b25seSBhcHBseSB0byB0aGUgYnRyZWUgaW5kZXguIGFsc28gY29sbGVjdCBpbmRleCBhdHRudW1z ICovCisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXgtPmluZG5rZXlhdHRzOyBpKyspCisJCXsK KwkJCWF0dHIgPSBUdXBsZURlc2NBdHRyKHR1cGRlc2MsIChpbmRleC0+aW5ka2V5LnZhbHVlc1tp XSAtIDEpKTsKKworCQkJaWYgKGxpc3RfbWVtYmVyX2ludChub3RudWxsX2F0dG51bXMsIGF0dHIt PmF0dG51bSkpCisJCQl7CisJCQkJaW5kZXhfcmVsID0gaW5kZXhfb3BlbihpbmRleC0+aW5kZXhy ZWxpZCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCQkJCWlmIChpbmRleF9yZWwtPnJkX3JlbC0+cmVs YW0gPT0gQlRSRUVfQU1fT0lEICYmCisJCQkJCSFsaXN0X21lbWJlcl9pbnQoYXR0bnVtcywgYXR0 ci0+YXR0bnVtKSkKKwkJCQl7CisJCQkJCWF0dG51bXMgPSBsYXBwZW5kX2ludChhdHRudW1zLCBh dHRyLT5hdHRudW0pOworCQkJCQlyZXN1bHQgPSBsYXBwZW5kX29pZChyZXN1bHQsIGluZGV4LT5p bmRleHJlbGlkKTsKKwkJCQl9CisJCQkJaW5kZXhfY2xvc2UoaW5kZXhfcmVsLCBBY2Nlc3NTaGFy ZUxvY2spOworCQkJfQorCQl9CisJfQorCXN5c3RhYmxlX2VuZHNjYW4oaW5kc2Nhbik7CisJdGFi bGVfY2xvc2UocGdfaW5kZXgsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwlpZiAoYXR0bnVtcyA9PSBO SUwpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogZXZlcnkgbm90LW51bGwgY29uc3RyYWlu dCByZXF1aXJlcyBhbiBpbmRleCBmb3IgaW5kZXhzY2FuLiAgSWYgbm8gc3VjaAorCSAqIGluZGV4 IGV4aXN0cywgd2UgbmVlZCB0byB1c2UgdGFibGUgc2NhbiB0byB2YWxpZGF0ZSBub3QtbnVsbCBj b25zdHJhaW50cy4KKwkqLworCWZvcmVhY2hfaW50KGF0dG5vLCBub3RudWxsX2F0dG51bXMpCisJ eworCQlpZighbGlzdF9tZW1iZXJfaW50KGF0dG51bXMsIGF0dG5vKSkKKwkJCXJldHVybiBmYWxz ZTsKKwl9CisKKwlyZXR1cm4gaW5kZXhfY2hlY2tfbm90bnVsbF9pbnRlcm5hbChyZWxhdGlvbiwg YXR0bnVtcywgcmVzdWx0KTsKK30KKworLyoKKyAqIFVzZSBpbmRleHNjYW4gbWVjaGFuaXNtIHRv IGZhc3QgdmVyaWZ5IGVhY2ggYXR0cmlidXRlIGluICJhdHRudW1zIiBhcmUKKyAqIG5vdC1udWxs IG9yIG5vdC4KKyAqLworc3RhdGljIGJvb2wKK2luZGV4X2NoZWNrX25vdG51bGxfaW50ZXJuYWwo UmVsYXRpb24gcmVsYXRpb24sIExpc3QgKmF0dG51bXMsIExpc3QgKmlkeHMpCit7CisJRVN0YXRl CSAgICplc3RhdGU7CisJRXhwckNvbnRleHQgKmVjb250ZXh0OworCVR1cGxlVGFibGVTbG90ICpl eGlzdGluZ19zbG90OworCWJvb2wgCQlhbGxfbm90X251bGwgPSB0cnVlOworCUxpc3RDZWxsICAg KmxjLAorCQkJCSpsYzI7CisKKwkvKgorCSAqIE5lZWQgYW4gRVN0YXRlIGZvciBzbG90IHRvIGhv bGQgdGhlIGN1cnJlbnQgdHVwbGUuCisJKi8KKwllc3RhdGUgPSBDcmVhdGVFeGVjdXRvclN0YXRl KCk7CisJZWNvbnRleHQgPSBHZXRQZXJUdXBsZUV4cHJDb250ZXh0KGVzdGF0ZSk7CisKKwlmb3Ji b3RoKGxjLCBhdHRudW1zLCBsYzIsIGlkeHMpCisJeworCQlTbmFwc2hvdERhdGEgRGlydHlTbmFw c2hvdDsKKwkJSW5kZXhTY2FuRGVzYyBpbmRleF9zY2FuOworCQlTY2FuS2V5RGF0YQkJc2Nhbmtl eXNbSU5ERVhfTUFYX0tFWVNdOworCQlJbmRleEluZm8gIAkqaW5kZXhJbmZvOworCQlBdHRyTnVt YmVyCXNrX2F0dG5vID0gLTE7CisJCVJlbGF0aW9uIAlpbmRleDsKKwkJaW50CQkJaW5kbmtleWF0 dHM7CisKKwkJQXR0ck51bWJlcglhdHRubyA9IGxmaXJzdF9pbnQobGMpOworCQlPaWQJCWluZGV4 b2lkID0gbGZpcnN0X29pZChsYzIpOworCisJCWV4aXN0aW5nX3Nsb3QgPSB0YWJsZV9zbG90X2Ny ZWF0ZShyZWxhdGlvbiwgTlVMTCk7CisKKwkJLyogQXJyYW5nZSBmb3IgZWNvbnRleHQncyBzY2Fu IHR1cGxlIHRvIGJlIHRoZSB0dXBsZSB1bmRlciB0ZXN0ICovCisJCWVjb250ZXh0LT5lY3h0X3Nj YW50dXBsZSA9IGV4aXN0aW5nX3Nsb3Q7CisKKwkJaW5kZXggPSBpbmRleF9vcGVuKGluZGV4b2lk LCBBY2Nlc3NTaGFyZUxvY2spOworCisJCWluZGV4SW5mbyA9IEJ1aWxkSW5kZXhJbmZvKGluZGV4 KTsKKwkJaW5kbmtleWF0dHMgPSBJbmRleFJlbGF0aW9uR2V0TnVtYmVyT2ZLZXlBdHRyaWJ1dGVz KGluZGV4KTsKKworCQkvKgorCQkgKiBTZWFyY2ggdGhlIHR1cGxlcyB0aGF0IGFyZSBpbiB0aGUg aW5kZXggZm9yIGFueSB2aW9sYXRpb25zLCBpbmNsdWRpbmcKKwkJICogdHVwbGVzIHRoYXQgYXJl bid0IHZpc2libGUgeWV0LgorCQkqLworCQlJbml0RGlydHlTbmFwc2hvdChEaXJ0eVNuYXBzaG90 KTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGluZG5rZXlhdHRzOyBpKyspCisJCXsKKwkJCWlm IChpbmRleEluZm8tPmlpX0luZGV4QXR0ck51bWJlcnNbaV0gPT0gYXR0bm8pCisJCQl7CisJCQkJ c2tfYXR0bm8gPSBpKzE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoc2tfYXR0bm8g PT0gLTEpCisJCQllbG9nKEVSUk9SLCAiaW5kZXggJXUgc2hvdWxkIGVmZmVjdCBvbiBjb2x1bW4g bnVtYmVyICVkIiwgaW5kZXhvaWQsIGF0dG5vKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGlu ZG5rZXlhdHRzOyBpKyspCisJCXsKKwkJCS8qIHNldCB1cCBhbiBJUyBOVUxMIHNjYW4ga2V5IHNv IHRoYXQgd2UgaWdub3JlIG5vdCBudWxscyAqLworCQkJU2NhbktleUVudHJ5SW5pdGlhbGl6ZSgm c2NhbmtleXNbaV0sCisJCQkJCQkJCQlTS19JU05VTEwgfCBTS19TRUFSQ0hOVUxMLAorCQkJCQkJ CQkJc2tfYXR0bm8sCQkvKiBpbmRleCBjb2wgdG8gc2NhbiAqLworCQkJCQkJCQkJSW52YWxpZFN0 cmF0ZWd5LC8qIG5vIHN0cmF0ZWd5ICovCisJCQkJCQkJCQlJbnZhbGlkT2lkLAkJLyogbm8gc3Ry YXRlZ3kgc3VidHlwZSAqLworCQkJCQkJCQkJSW52YWxpZE9pZCwJCS8qIG5vIGNvbGxhdGlvbiAq LworCQkJCQkJCQkJSW52YWxpZE9pZCwJCS8qIG5vIHJlZyBwcm9jIGZvciB0aGlzICovCisJCQkJ CQkJCQkoRGF0dW0pIDApOwkJLyogY29uc3RhbnQgKi8KKwkJfQorCisJCWluZGV4X3NjYW4gPSBp bmRleF9iZWdpbnNjYW4ocmVsYXRpb24sIGluZGV4LCAmRGlydHlTbmFwc2hvdCwgTlVMTCwgaW5k bmtleWF0dHMsIDApOworCQlpbmRleF9yZXNjYW4oaW5kZXhfc2Nhbiwgc2NhbmtleXMsIGluZG5r ZXlhdHRzLCBOVUxMLCAwKTsKKworCQl3aGlsZSAoaW5kZXhfZ2V0bmV4dF9zbG90KGluZGV4X3Nj YW4sIEZvcndhcmRTY2FuRGlyZWN0aW9uLCBleGlzdGluZ19zbG90KSkKKwkJeworCQkJRGF0dW0J CXZhbHVlc1tJTkRFWF9NQVhfS0VZU107CisJCQlib29sCQludWxsc1tJTkRFWF9NQVhfS0VZU107 CisKKwkJCS8qCisJCQkgKiBFeHRyYWN0IHRoZSBpbmRleCBjb2x1bW4gdmFsdWVzIGFuZCBpc251 bGwgZmxhZ3MgZnJvbSB0aGUKKwkJCSAqIGV4aXN0aW5nIHR1cGxlLgorCQkJKi8KKwkJCUZvcm1J bmRleERhdHVtKGluZGV4SW5mbywgZXhpc3Rpbmdfc2xvdCwgZXN0YXRlLCB2YWx1ZXMsIG51bGxz KTsKKworCQkJaWYgKG51bGxzW3NrX2F0dG5vIC0gMV0pCisJCQl7CisJCQkJYWxsX25vdF9udWxs ID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpbmRleF9lbmRzY2FuKGluZGV4 X3NjYW4pOworCQlpbmRleF9jbG9zZShpbmRleCwgQWNjZXNzU2hhcmVMb2NrKTsKKwkJRXhlY0Ry b3BTaW5nbGVUdXBsZVRhYmxlU2xvdChleGlzdGluZ19zbG90KTsKKwkJaWYgKCFhbGxfbm90X251 bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJRnJlZUV4ZWN1dG9yU3RhdGUoZXN0YXRlKTsK KworCXJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvZXhlY3V0b3IvZXhl Y3V0b3IuaCBiL3NyYy9pbmNsdWRlL2V4ZWN1dG9yL2V4ZWN1dG9yLmgKaW5kZXggYWU5OTQwN2Ri ODkuLmY0MjQwN2VkNzVlIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9leGVjdXRvci9leGVjdXRv ci5oCisrKyBiL3NyYy9pbmNsdWRlL2V4ZWN1dG9yL2V4ZWN1dG9yLmgKQEAgLTc3OCw2ICs3Nzgs OCBAQCBleHRlcm4gdm9pZCBjaGVja19leGNsdXNpb25fY29uc3RyYWludChSZWxhdGlvbiBoZWFw LCBSZWxhdGlvbiBpbmRleCwKIAkJCQkJCQkJCSAgIGNvbnN0IERhdHVtICp2YWx1ZXMsIGNvbnN0 IGJvb2wgKmlzbnVsbCwKIAkJCQkJCQkJCSAgIEVTdGF0ZSAqZXN0YXRlLCBib29sIG5ld0luZGV4 KTsKIAorZXh0ZXJuIGJvb2wgaW5kZXhfY2hlY2tfbm90bnVsbChSZWxhdGlvbiByZWxhdGlvbiwg TGlzdCAqbm90bnVsbF9hdHRudW1zKTsKKwogLyoKICAqIHByb3RvdHlwZXMgZnJvbSBmdW5jdGlv bnMgaW4gZXhlY1JlcGxpY2F0aW9uLmMKICAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvaXNvbGF0 aW9uL2V4cGVjdGVkL2luZGV4c2Nhbi1jaGVjay1ub3RudWxsLm91dCBiL3NyYy90ZXN0L2lzb2xh dGlvbi9leHBlY3RlZC9pbmRleHNjYW4tY2hlY2stbm90bnVsbC5vdXQKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjIyNTUzMzVmMDBmCi0tLSAvZGV2L251bGwKKysrIGIv c3JjL3Rlc3QvaXNvbGF0aW9uL2V4cGVjdGVkL2luZGV4c2Nhbi1jaGVjay1ub3RudWxsLm91dApA QCAtMCwwICsxLDk3IEBACitQYXJzZWQgdGVzdCBzcGVjIHdpdGggMiBzZXNzaW9ucworCitzdGFy dGluZyBwZXJtdXRhdGlvbjogYjEgYjMgbTEgaGogYzEgYzMgc24KK3N0ZXAgYjE6IEJFR0lOIElT T0xBVElPTiBMRVZFTCBSRVBFQVRBQkxFIFJFQUQ7CitzdGVwIGIzOiBCRUdJTiBJU09MQVRJT04g TEVWRUwgUkVQRUFUQUJMRSBSRUFEOworc3RlcCBtMTogREVMRVRFIEZST00gdDsKK3N0ZXAgaGo6 IEFMVEVSIFRBQkxFIHQgQUREIENPTlNUUkFJTlQgdDFfbm4gTk9UIE5VTEwgYTsgPHdhaXRpbmcg Li4uPgorc3RlcCBjMTogQ09NTUlUOworc3RlcCBoajogPC4uLiBjb21wbGV0ZWQ+CitzdGVwIGMz OiBDT01NSVQ7CitzdGVwIHNuOiBTRUxFQ1QgY29ubmFtZSwgY29ucmVsaWQ6OnJlZ2NsYXNzLCBj b250eXBlLCBjb252YWxpZGF0ZWQKKyAgICAgICAgICAgRlJPTSBwZ19jb25zdHJhaW50IFdIRVJF IGNvbm5hbWUgPSAndDFfbm4nOworCitjb25uYW1lfGNvbnJlbGlkfGNvbnR5cGV8Y29udmFsaWRh dGVkCistLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tCit0MV9ubiAgfHQgICAg ICAgfG4gICAgICB8dCAgICAgICAgICAgCisoMSByb3cpCisKKworc3RhcnRpbmcgcGVybXV0YXRp b246IGIyIGIzIG0xIGhqIGMxIGMzIHNuCitzdGVwIGIyOiBCRUdJTjsKK3N0ZXAgYjM6IEJFR0lO IElTT0xBVElPTiBMRVZFTCBSRVBFQVRBQkxFIFJFQUQ7CitzdGVwIG0xOiBERUxFVEUgRlJPTSB0 Oworc3RlcCBoajogQUxURVIgVEFCTEUgdCBBREQgQ09OU1RSQUlOVCB0MV9ubiBOT1QgTlVMTCBh OyA8d2FpdGluZyAuLi4+CitzdGVwIGMxOiBDT01NSVQ7CitzdGVwIGhqOiA8Li4uIGNvbXBsZXRl ZD4KK3N0ZXAgYzM6IENPTU1JVDsKK3N0ZXAgc246IFNFTEVDVCBjb25uYW1lLCBjb25yZWxpZDo6 cmVnY2xhc3MsIGNvbnR5cGUsIGNvbnZhbGlkYXRlZAorICAgICAgICAgICBGUk9NIHBnX2NvbnN0 cmFpbnQgV0hFUkUgY29ubmFtZSA9ICd0MV9ubic7CisKK2Nvbm5hbWV8Y29ucmVsaWR8Y29udHlw ZXxjb252YWxpZGF0ZWQKKy0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0KK3Qx X25uICB8dCAgICAgICB8biAgICAgIHx0ICAgICAgICAgICAKKygxIHJvdykKKworCitzdGFydGlu ZyBwZXJtdXRhdGlvbjogYjEgYjQgbTEgaGogYzEgYzMgc24KK3N0ZXAgYjE6IEJFR0lOIElTT0xB VElPTiBMRVZFTCBSRVBFQVRBQkxFIFJFQUQ7CitzdGVwIGI0OiBCRUdJTjsKK3N0ZXAgbTE6IERF TEVURSBGUk9NIHQ7CitzdGVwIGhqOiBBTFRFUiBUQUJMRSB0IEFERCBDT05TVFJBSU5UIHQxX25u IE5PVCBOVUxMIGE7IDx3YWl0aW5nIC4uLj4KK3N0ZXAgYzE6IENPTU1JVDsKK3N0ZXAgaGo6IDwu Li4gY29tcGxldGVkPgorc3RlcCBjMzogQ09NTUlUOworc3RlcCBzbjogU0VMRUNUIGNvbm5hbWUs IGNvbnJlbGlkOjpyZWdjbGFzcywgY29udHlwZSwgY29udmFsaWRhdGVkCisgICAgICAgICAgIEZS T00gcGdfY29uc3RyYWludCBXSEVSRSBjb25uYW1lID0gJ3QxX25uJzsKKworY29ubmFtZXxjb25y ZWxpZHxjb250eXBlfGNvbnZhbGlkYXRlZAorLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tKy0tLS0t LS0tLS0tLQordDFfbm4gIHx0ICAgICAgIHxuICAgICAgfHQgICAgICAgICAgIAorKDEgcm93KQor CisKK3N0YXJ0aW5nIHBlcm11dGF0aW9uOiBiMSBiMyBoaiByMSBjMgorc3RlcCBiMTogQkVHSU4g SVNPTEFUSU9OIExFVkVMIFJFUEVBVEFCTEUgUkVBRDsKK3N0ZXAgYjM6IEJFR0lOIElTT0xBVElP TiBMRVZFTCBSRVBFQVRBQkxFIFJFQUQ7CitzdGVwIGhqOiBBTFRFUiBUQUJMRSB0IEFERCBDT05T VFJBSU5UIHQxX25uIE5PVCBOVUxMIGE7CitFUlJPUjogIGNvbHVtbiAiYSIgb2YgcmVsYXRpb24g InQiIGNvbnRhaW5zIG51bGwgdmFsdWVzCitzdGVwIHIxOiBST0xMQkFDSzsKK3N0ZXAgYzI6IFJP TExCQUNLOworCitzdGFydGluZyBwZXJtdXRhdGlvbjogYjEgYjQgZDEgbTEgYzIgczEgc24gcjEK K3N0ZXAgYjE6IEJFR0lOIElTT0xBVElPTiBMRVZFTCBSRVBFQVRBQkxFIFJFQUQ7CitzdGVwIGI0 OiBCRUdJTjsKK3N0ZXAgZDE6IERST1AgSU5ERVggdF9hYl9pZHg7CitzdGVwIG0xOiBERUxFVEUg RlJPTSB0OyA8d2FpdGluZyAuLi4+CitzdGVwIGMyOiBST0xMQkFDSzsKK3N0ZXAgbTE6IDwuLi4g Y29tcGxldGVkPgorc3RlcCBzMTogQUxURVIgVEFCTEUgdCBBREQgQ09OU1RSQUlOVCB0MV9ubiBO T1QgTlVMTCBhOworc3RlcCBzbjogU0VMRUNUIGNvbm5hbWUsIGNvbnJlbGlkOjpyZWdjbGFzcywg Y29udHlwZSwgY29udmFsaWRhdGVkCisgICAgICAgICAgIEZST00gcGdfY29uc3RyYWludCBXSEVS RSBjb25uYW1lID0gJ3QxX25uJzsKKworY29ubmFtZXxjb25yZWxpZHxjb250eXBlfGNvbnZhbGlk YXRlZAorLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLQordDFfbm4gIHx0ICAg ICAgIHxuICAgICAgfHQgICAgICAgICAgIAorKDEgcm93KQorCitzdGVwIHIxOiBST0xMQkFDSzsK Kworc3RhcnRpbmcgcGVybXV0YXRpb246IGIyIGIzIG0xIGQxIHMwIHMxIGMxIGMzIHNuCitzdGVw IGIyOiBCRUdJTjsKK3N0ZXAgYjM6IEJFR0lOIElTT0xBVElPTiBMRVZFTCBSRVBFQVRBQkxFIFJF QUQ7CitzdGVwIG0xOiBERUxFVEUgRlJPTSB0Oworc3RlcCBkMTogRFJPUCBJTkRFWCB0X2FiX2lk eDsgPHdhaXRpbmcgLi4uPgorc3RlcCBzMDogc2F2ZXBvaW50IHMwOworc3RlcCBzMTogQUxURVIg VEFCTEUgdCBBREQgQ09OU1RSQUlOVCB0MV9ubiBOT1QgTlVMTCBhOworc3RlcCBjMTogQ09NTUlU Oworc3RlcCBkMTogPC4uLiBjb21wbGV0ZWQ+CitzdGVwIGMzOiBDT01NSVQ7CitzdGVwIHNuOiBT RUxFQ1QgY29ubmFtZSwgY29ucmVsaWQ6OnJlZ2NsYXNzLCBjb250eXBlLCBjb252YWxpZGF0ZWQK KyAgICAgICAgICAgRlJPTSBwZ19jb25zdHJhaW50IFdIRVJFIGNvbm5hbWUgPSAndDFfbm4nOwor Citjb25uYW1lfGNvbnJlbGlkfGNvbnR5cGV8Y29udmFsaWRhdGVkCistLS0tLS0tKy0tLS0tLS0t Ky0tLS0tLS0rLS0tLS0tLS0tLS0tCit0MV9ubiAgfHQgICAgICAgfG4gICAgICB8dCAgICAgICAg ICAgCisoMSByb3cpCisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2lzb2xhdGlvbi9pc29sYXRpb25f c2NoZWR1bGUgYi9zcmMvdGVzdC9pc29sYXRpb24vaXNvbGF0aW9uX3NjaGVkdWxlCmluZGV4IGUz YzY2OWEyOWM3Li4xYjllOGY5MzJhYyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvaXNvbGF0aW9uL2lz b2xhdGlvbl9zY2hlZHVsZQorKysgYi9zcmMvdGVzdC9pc29sYXRpb24vaXNvbGF0aW9uX3NjaGVk dWxlCkBAIC01Niw2ICs1Niw3IEBAIHRlc3Q6IG1lcmdlLWRlbGV0ZQogdGVzdDogbWVyZ2UtdXBk YXRlCiB0ZXN0OiBtZXJnZS1tYXRjaC1yZWNoZWNrCiB0ZXN0OiBtZXJnZS1qb2luCit0ZXN0OiBp bmRleHNjYW4tY2hlY2stbm90bnVsbAogdGVzdDogZGVsZXRlLWFib3J0LXNhdmVwdAogdGVzdDog ZGVsZXRlLWFib3J0LXNhdmVwdC0yCiB0ZXN0OiBhYm9ydGVkLWtleXJldm9rZQpkaWZmIC0tZ2l0 IGEvc3JjL3Rlc3QvaXNvbGF0aW9uL3NwZWNzL2luZGV4c2Nhbi1jaGVjay1ub3RudWxsLnNwZWMg Yi9zcmMvdGVzdC9pc29sYXRpb24vc3BlY3MvaW5kZXhzY2FuLWNoZWNrLW5vdG51bGwuc3BlYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uZDBjYTkyOGYzYWYKLS0tIC9k ZXYvbnVsbAorKysgYi9zcmMvdGVzdC9pc29sYXRpb24vc3BlY3MvaW5kZXhzY2FuLWNoZWNrLW5v dG51bGwuc3BlYwpAQCAtMCwwICsxLDQ1IEBACisKKyMKKyMgdXNpbmcgaW5kZXhzY2FuIHRvIGNo ZWNrIGEgY29sdW1uIG5vdC1udWxsIGNvbnN0cmFpbnQKKyMgaXMgc2F0aXNmaWVkIG9yIG5vdC4K KyMKKworc2V0dXAKK3sKKyAgQ1JFQVRFIFRBQkxFIHQgKGEgaW50LCBiIGludCk7CisgIENSRUFU RSBJTkRFWCB0X2FiX2lkeCBvbiB0KGEsYik7CisgIElOU0VSVCBJTlRPIHQgdmFsdWVzIChudWxs LCAxKTsKKyAgSU5TRVJUIElOVE8gdCBTRUxFQ1QgeCwgeCoxMCBGUk9NIGdlbmVyYXRlX3Nlcmll cygxLDMpIGcoeCk7Cit9CisKK3RlYXJkb3duCit7CisgIERST1AgVEFCTEUgdDsKK30KKworc2Vz c2lvbiBzMQorc3RlcCBiMSAgeyBCRUdJTiBJU09MQVRJT04gTEVWRUwgUkVQRUFUQUJMRSBSRUFE OyB9CitzdGVwIGIyICB7IEJFR0lOOyB9CitzdGVwIG0xICB7IERFTEVURSBGUk9NIHQ7fQorc3Rl cCBzMCAgeyBzYXZlcG9pbnQgczA7fQorc3RlcCBzMSAgeyBBTFRFUiBUQUJMRSB0IEFERCBDT05T VFJBSU5UIHQxX25uIE5PVCBOVUxMIGE7fQorc3RlcCBzbiAgeyBTRUxFQ1QgY29ubmFtZSwgY29u cmVsaWQ6OnJlZ2NsYXNzLCBjb250eXBlLCBjb252YWxpZGF0ZWQKKyAgICAgICAgICAgRlJPTSBw Z19jb25zdHJhaW50IFdIRVJFIGNvbm5hbWUgPSAndDFfbm4nOworICAgICAgICAgfQorc3RlcCBy MSAgeyBST0xMQkFDSzsgfQorc3RlcCBjMSAgeyBDT01NSVQ7IH0KKworc2Vzc2lvbiBzMgorc3Rl cCBiMyAgeyBCRUdJTiBJU09MQVRJT04gTEVWRUwgUkVQRUFUQUJMRSBSRUFEOyB9CitzdGVwIGI0 ICB7IEJFR0lOOyB9CitzdGVwIGhqICB7IEFMVEVSIFRBQkxFIHQgQUREIENPTlNUUkFJTlQgdDFf bm4gTk9UIE5VTEwgYTt9CitzdGVwIGQxICB7IERST1AgSU5ERVggdF9hYl9pZHg7fQorc3RlcCBj MiAgeyBST0xMQkFDSzsgfQorc3RlcCBjMyAgeyBDT01NSVQ7IH0KKworcGVybXV0YXRpb24gYjEg YjMgbTEgaGogYzEgYzMgc24KK3Blcm11dGF0aW9uIGIyIGIzIG0xIGhqIGMxIGMzIHNuCitwZXJt dXRhdGlvbiBiMSBiNCBtMSBoaiBjMSBjMyBzbgorcGVybXV0YXRpb24gYjEgYjMgaGogcjEgYzIK K3Blcm11dGF0aW9uIGIxIGI0IGQxIG0xIGMyIHMxIHNuIHIxCitwZXJtdXRhdGlvbiBiMiBiMyBt MSBkMSBzMCBzMSBjMSBjMyBzbgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X21p c2MvbWVzb24uYnVpbGQgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy9tZXNvbi5idWlsZApp bmRleCA5YzUwZGU3ZWZiMC4uNDlmYTE2ZmI1MGUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVs ZXMvdGVzdF9taXNjL21lc29uLmJ1aWxkCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9taXNj L21lc29uLmJ1aWxkCkBAIC0xNiw2ICsxNiw3IEBAIHRlc3RzICs9IHsKICAgICAgICd0LzAwNV90 aW1lb3V0cy5wbCcsCiAgICAgICAndC8wMDZfc2lnbmFsX2F1dG92YWN1dW0ucGwnLAogICAgICAg J3QvMDA3X2NhdGNhY2hlX2ludmFsLnBsJywKKyAgICAgICd0LzAwOF9pbmRleHNjYW5fdmFsaWRh dGVfbm90bnVsbC5wbCcsCiAgICAgXSwKICAgfSwKIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21v ZHVsZXMvdGVzdF9taXNjL3QvMDA4X2luZGV4c2Nhbl92YWxpZGF0ZV9ub3RudWxsLnBsIGIvc3Jj L3Rlc3QvbW9kdWxlcy90ZXN0X21pc2MvdC8wMDhfaW5kZXhzY2FuX3ZhbGlkYXRlX25vdG51bGwu cGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjVmNzg3Y2RkMDcwCi0t LSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X21pc2MvdC8wMDhfaW5kZXhz Y2FuX3ZhbGlkYXRlX25vdG51bGwucGwKQEAgLTAsMCArMSwxNjQgQEAKKworIyBDb3B5cmlnaHQg KGMpIDIwMjUsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCisKKyMgVmVyaWZ5 IHRoYXQgaW5kZXhzY2FuIG1lY2hhbmlzbSBjYW4gc3BlZWR1cCBBTFRFUiBUQUJMRSBBREQgTk9U IE5VTEwKKworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzIEZBVEFMID0+ICdhbGwnOwordXNl IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXI7Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM7 Cit1c2UgVGVzdDo6TW9yZTsKKworIyBJbml0aWFsaXplIGEgdGVzdCBjbHVzdGVyCitteSAkbm9k ZSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygncHJpbWFyeScpOworJG5vZGUtPmlu aXQoKTsKKyMgVHVybiBtZXNzYWdlIGxldmVsIHVwIHRvIERFQlVHMSBzbyB0aGF0IHdlIGdldCB0 aGUgbWVzc2FnZXMgd2Ugd2FudCB0byBzZWUKKyRub2RlLT5hcHBlbmRfY29uZigncG9zdGdyZXNx bC5jb25mJywgJ2NsaWVudF9taW5fbWVzc2FnZXMgPSBERUJVRzEnKTsKKyRub2RlLT5zdGFydDsK KworIyBSdW4gYSBTUUwgY29tbWFuZCBhbmQgcmV0dXJuIHBzcWwncyBzdGRlcnIgKGluY2x1ZGlu ZyBkZWJ1ZyBtZXNzYWdlcykKK3N1YiBydW5fc3FsX2NvbW1hbmQKK3sKKwlteSAkc3FsID0gc2hp ZnQ7CisJbXkgJHN0ZGVycjsKKworCSRub2RlLT5wc3FsKAorCQkncG9zdGdyZXMnLAorCQkkc3Fs LAorCQlzdGRlcnIgPT4gXCRzdGRlcnIsCisJCW9uX2Vycm9yX2RpZSA9PiAxLAorCQlvbl9lcnJv cl9zdG9wID0+IDEpOworCXJldHVybiAkc3RkZXJyOworfQorCisjIENoZWNrIHdoZXRoZXIgcmVz dWx0IG9mIHJ1bl9zcWxfY29tbWFuZCBzaG93cyB0aGF0IHdlIGRpZCBhIHZlcmlmeSBwYXNzCitz dWIgaXNfdGFibGVfdmVyaWZpZWQKK3sKKwlteSAkb3V0cHV0ID0gc2hpZnQ7CisJcmV0dXJuIGlu ZGV4KCRvdXRwdXQsICdERUJVRzogIHZlcmlmeWluZyB0YWJsZScpICE9IC0xOworfQorCisjIENo ZWNrIHdoZXRoZXIgcmVzdWx0IG9mIHJ1bl9zcWxfY29tbWFuZCBzaG93cyB0aGF0IHdlIGRpZCBh IHZlcmlmeSBwYXNzCitzdWIgaXNfaW5kZXhzY2FuX3Zlcml0aWZ5X25vdG51bGwKK3sKKwlteSAk b3V0cHV0ID0gc2hpZnQ7CisJcmV0dXJuIGluZGV4KCRvdXRwdXQsICdERUJVRzogIGFsbCBuZXcg bm90LW51bGwgY29uc3RyYWludHMgb24gcmVsYXRpb24nKSAhPSAtMTsKK30KKworbXkgJG91dHB1 dDsKKworbm90ZSAidGVzdCBhbHRlciB0YWJsZSBTRVQgTk9UIE5VTEwgdXNpbmcgaW5kZXhzY2Fu IHdpdGggcGFydGl0aW9uZWQgdGFibGUiOworCitydW5fc3FsX2NvbW1hbmQoCisgICAgJ0NSRUFU RSBUQUJMRSB0cCAoYSBpbnQsIGIgaW50LCBjIGludCwgZCBpbnQgKSBQQVJUSVRJT04gQlkgcmFu Z2UoYSk7CisgICAgIENSRUFURSBUQUJMRSB0cHAxIHBhcnRpdGlvbiBvZiB0cCBmb3IgdmFsdWVz IGZyb20gKCAxICkgdG8gKDEwKTsKKyAgICAgQ1JFQVRFIFRBQkxFIHRwcDIgcGFydGl0aW9uIG9m IHRwIGZvciB2YWx1ZXMgZnJvbSAoIDEwICkgdG8gKDIxKTsKKyAgICAgSU5TRVJUIElOVE8gdHAg c2VsZWN0IGcsIGcgKyAxMCwgZyArIDE1LCBnICsgcmFuZG9tKG1pbj0+MTo6aW50LCBtYXg9PjEw OjppbnQpIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDEsMTkpIGc7CisgICAgIENSRUFURSBJTkRFWCBP TiB0cChiKTsgJyk7CisKKyRvdXRwdXQgPSBydW5fc3FsX2NvbW1hbmQoJ0FMVEVSIFRBQkxFIHRw IEFMVEVSIENPTFVNTiBiIFNFVCBOT1QgTlVMTDsnKTsKK29rKGlzX2luZGV4c2Nhbl92ZXJpdGlm eV9ub3RudWxsKCRvdXRwdXQpLAorCSdjb2x1bW4gYiB3aWxsIHVzZSBpbmRleHNjYW4gdG8gdmVy aWZ5IG5vdC1udWxsIHN0YXR1cywgbm8gbmVlZCBzY2FuIHRhYmxlJyk7CitvayggJG91dHB1dCA9 fgorCSAgbS9hbGwgbmV3IG5vdC1udWxsIGNvbnN0cmFpbnRzIG9uIHJlbGF0aW9uICJ0cHAxIiBo YXZlIGJlZW4gdmFsaWRhdGVkIGJ5IHVzaW5nIGluZGV4IHNjYW4vLAorCSdhbGwgbmV3bHkgYWRk ZWQgY29uc3RyYWludHMgcHJvdmVkIGJ5IGluZGV4c2NhbicpOworCitydW5fc3FsX2NvbW1hbmQo CisJJ0FMVEVSIFRBQkxFIHRwIEFMVEVSIENPTFVNTiBiIERST1AgTk9UIE5VTEw7Jyk7CisKKyMg dXNlIGluZGV4ZXMgb24gcGFydGl0aW9ucyB0byBmYXN0IHZlcnRpZmluZyBub3QtbnVsbCBzaG91 bGQgYmUgb2sKKyRvdXRwdXQgPSBydW5fc3FsX2NvbW1hbmQoJ0FMVEVSIFRBQkxFIHRwcDEgQUxU RVIgQ09MVU1OIGIgU0VUIE5PVCBOVUxMOycpOworb2soaXNfaW5kZXhzY2FuX3Zlcml0aWZ5X25v dG51bGwoJG91dHB1dCksICd1c2UgaW5kZXhzY2FuIHRvIHZhbGlkYXRlIGNvbHVtbiBiIG5vdC1u dWxsIHdpbGwgbm90IHNjYW4gdGFibGUnKTsKK29rKCFpc190YWJsZV92ZXJpZmllZCgkb3V0cHV0 KSwgJ25vIHRhYmxlIHNjYW4gZm9yIHBwMScpOworb2soICRvdXRwdXQgPX4KKwkgIG0vYWxsIG5l dyBub3QtbnVsbCBjb25zdHJhaW50cyBvbiByZWxhdGlvbiAidHBwMSIgaGF2ZSBiZWVuIHZhbGlk YXRlZCBieSB1c2luZyBpbmRleCBzY2FuLywKKwknYWxsIG5ld2x5IGFkZGVkIGNvbnN0cmFpbnRz IHByb3ZlZCBieSBpbmRleHNjYW4nKTsKKworJG91dHB1dCA9IHJ1bl9zcWxfY29tbWFuZCgnQUxU RVIgVEFCTEUgdHBwMiBBTFRFUiBDT0xVTU4gYiBTRVQgTk9UIE5VTEw7Jyk7Citvayhpc19pbmRl eHNjYW5fdmVyaXRpZnlfbm90bnVsbCgkb3V0cHV0KSwgJ3VzZSBpbmRleHNjYW4gdG8gdmFsaWRh dGUgY29sdW1uIGIgbm90LW51bGwsIHdpbGwgbm90IHNjYW4gdGFibGUnKTsKK29rKCFpc190YWJs ZV92ZXJpZmllZCgkb3V0cHV0KSwgJ25vIHRhYmxlIHNjYW4gZm9yIHRwcDInKTsKK29rKCAkb3V0 cHV0ID1+CisJICBtL2FsbCBuZXcgbm90LW51bGwgY29uc3RyYWludHMgb24gcmVsYXRpb24gInRw cDIiIGhhdmUgYmVlbiB2YWxpZGF0ZWQgYnkgdXNpbmcgaW5kZXggc2Nhbi8sCisJJ2FsbCBuZXds eSBhZGRlZCBjb25zdHJhaW50cyBwcm92ZWQgYnkgaW5kZXhzY2FuJyk7CisKK3J1bl9zcWxfY29t bWFuZCgKKwknQUxURVIgVEFCTEUgdHAgQUxURVIgQ09MVU1OIGIgRFJPUCBOT1QgTlVMTDsnKTsK KworIyB0YWJsZSByZXdyaXRlIHRoZW4gY2FuIG5vdCB1c2UgaW5kZXhzY2FuIHRvIHZlcmlmeSBu b3QtbnVsbCBjb25zdHJhaW50Ciskb3V0cHV0ID0gcnVuX3NxbF9jb21tYW5kKAorCSdBTFRFUiBU QUJMRSB0cCBBTFRFUiBDT0xVTU4gYiBTRVQgTk9UIE5VTEwsIEFMVEVSIENPTFVNTiBiIFNFVCBE QVRBIFRZUEUgYmlnaW50OycKKyk7CitvayghaXNfdGFibGVfdmVyaWZpZWQoJG91dHB1dCksICdu byB0YWJsZSBzY2FuIGZvciB0cCcpOworb2soIWlzX2luZGV4c2Nhbl92ZXJpdGlmeV9ub3RudWxs KCRvdXRwdXQpLCAndGFibGUgdHAgd2lsbCByZXdyaXRlLCBjYW4gbm90IHVzZSBpbmRleHNjYW4g dG8gdmVyaWZ5IG5vdC1udWxsIGNvbnN0cmFpbnRzIG9uIGl0Jyk7CisKKyMgdGVzdCB1c2luZyBp bmRleHNjYW4gd2l0aCBtdWx0aXBsZSBub3QtbnVsbCBjb25zdHJhaW50cworcnVuX3NxbF9jb21t YW5kKAorICAgICdBTFRFUiBUQUJMRSB0cCBBTFRFUiBDT0xVTU4gYiBEUk9QIE5PVCBOVUxMOwor CSBDUkVBVEUgSU5ERVggT04gdHAoYyk7CisJIENSRUFURSBJTkRFWCBPTiB0cChkKTsgJyk7CisK KyMgb25lIGNvbHVtbiBjYW4gdXNlIGluZGV4c2NhbiwgYW5vdGhlciBjYW4gbm90LCBzbyBjYW4g bm90IHVzZSBpbmRleHNjYW4gdG8gdmVyaWZ5IG5vdC1udWxsCiskb3V0cHV0ID0gcnVuX3NxbF9j b21tYW5kKAorCSdBTFRFUiBUQUJMRSB0cCBBTFRFUiBDT0xVTU4gYSBTRVQgTk9UIE5VTEwsIEFE RCBDT05TVFJBSU5UIGNfbm4gTk9UIE5VTEwgYycpOworb2soaXNfdGFibGVfdmVyaWZpZWQoJG91 dHB1dCksICd0YWJsZSBzY2FuIGZvciB0cCcpOworb2soIWlzX2luZGV4c2Nhbl92ZXJpdGlmeV9u b3RudWxsKCRvdXRwdXQpLCAnY2FuIG5vdCB1c2UgaW5kZXhzY2FuIHRvIHZlcmlmeSBub3QtbnVs bCBjb25zdHJhaW50cyBvbiB0YWJsZSB0cCcpOworCisjIGFsbCBjb2x1bW5zIGhhdmUgaW5kZXgg b24gaXQKKyMgdXNlIGluZGV4c2NhbiB0byB2ZXJpZnkgbXVsdGlwbGUgbm90LW51bGwgY29uc3Ry YWludHMgc2hvdWxkIGp1c3QgZmluZQorJG91dHB1dCA9IHJ1bl9zcWxfY29tbWFuZCgKKwknQUxU RVIgVEFCTEUgdHAgQUxURVIgQ09MVU1OIGQgU0VUIE5PVCBOVUxMLCBBREQgQ09OU1RSQUlOVCBj X25uIE5PVCBOVUxMIGMsIEFMVEVSIENPTFVNTiBiIFNFVCBOT1QgTlVMTDsnKTsKK29rKCFpc190 YWJsZV92ZXJpZmllZCgkb3V0cHV0KSwgJ25vIHRhYmxlIHNjYW4gZm9yIHRwJyk7Citvayhpc19p bmRleHNjYW5fdmVyaXRpZnlfbm90bnVsbCgkb3V0cHV0KSwKKwkndXNpbmcgaW5kZXhzY2FuIHRv IHZlcmlmeSBub3QtbnVsbCBjb25zdHJhaW50cyBvbiBjb2x1bW4gYiwgYywgZCwgbm8gbmVlZCB0 YWJsZSBzY2FuJyk7CisKKyMgdGVzdCB3aXRoIG5vbi1wYXJ0aXRpb25lZCB0YWJsZSBhbmQgb3Ro ZXIgbm9uLUJ0cmVlIGluZGV4LgorcnVuX3NxbF9jb21tYW5kKAorICAgICdDUkVBVEUgVEFCTEUg dDEoZjEgSU5ULCBmMiBpbnQsIGYzIGludCxmNCBpbnQsIGY1IGludCk7CisgICAgIElOU0VSVCBJ TlRPIHQxIHNlbGVjdCBnLCBnKzEsIGcrMiwgZyszLCBnKzQgZnJvbSBnZW5lcmF0ZV9zZXJpZXMo MSwgMTAwKSBnOworICAgICBDUkVBVEUgSU5ERVggdDFfZjFfZjJfaWR4IE9OIHQxKGYxLGYyKTsK KyAgICAgQ1JFQVRFIFVOSVFVRSBJTkRFWCB0MV9mM2lkeCBPTiB0MShmMyk7CisgICAgIENSRUFU RSBJTkRFWCB0MV9mM2Y0aWR4IE9OIHQxKGYzKSBpbmNsdWRlKGY0KTsKKyAgICAgQ1JFQVRFIElO REVYIGhhc2hfZjVfaWR4IE9OIHQxIFVTSU5HIGhhc2ggKGY1IGludDRfb3BzKTsgJyk7CisKKyMg QUxURVIgVEFCTEUgVkFMSURBVEUgQ09OU1RSQUlOVCBjYW4gbm90IHVzZSBpbmRleHNjYW4sCisj IGJlY2F1c2UgaXQgb25seSBob2xkIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayBsb2NrLgorcnVu X3NxbF9jb21tYW5kKCdBTFRFUiBUQUJMRSB0MSBBREQgQ09OU1RSQUlOVCBubl90MV9mMiBOT1Qg TlVMTCBmMiBOT1QgVkFMSUQ7Jyk7CisKKyRvdXRwdXQgPSBydW5fc3FsX2NvbW1hbmQoCisJJ0FM VEVSIFRBQkxFIHQxIFZBTElEQVRFIENPTlNUUkFJTlQgbm5fdDFfZjI7JworKTsKK29rKCFpc19p bmRleHNjYW5fdmVyaXRpZnlfbm90bnVsbCgkb3V0cHV0KSwgJ2NhbiBub3QgdXNlIGluZGV4c2Nh biBmb3IgQUxURVIgVEFCTEUgVkFMSURBVEUgQ09OU1RSQUlOVCBjb21tYW5kJyk7CitydW5fc3Fs X2NvbW1hbmQoJ0FMVEVSIFRBQkxFIHQxIERST1AgQ09OU1RSQUlOVCBubl90MV9mMjsnKTsKKwor JG91dHB1dCA9IHJ1bl9zcWxfY29tbWFuZCgKKwknQUxURVIgVEFCTEUgdDEgQUxURVIgQ09MVU1O IGYxIFNFVCBOT1QgTlVMTCwgQUxURVIgZjEgdHlwZSBiaWdpbnQ7JworKTsKK29rKCFpc19pbmRl eHNjYW5fdmVyaXRpZnlfbm90bnVsbCgkb3V0cHV0KSwgJ3RhYmxlIHQxIHdpbGwgcmV3cml0ZSwg Y2FuIG5vdCB1c2UgaW5kZXhzY2FuIHRvIHZhbGlkYXRlIG5vdC1udWxsIGNvbnN0cmFpbnRzIG9u IHQxJyk7CisKK3J1bl9zcWxfY29tbWFuZCgnQUxURVIgVEFCTEUgdDEgQUxURVIgQ09MVU1OIGYx IERST1AgTk9UIE5VTEw7Jyk7CitydW5fc3FsX2NvbW1hbmQoJ0FMVEVSIFRBQkxFIHQxIEFERCBD T05TVFJBSU5UIG5uIE5PVCBOVUxMIGYxLCBBTFRFUiBmMSB0eXBlIGJpZ2ludDsnKTsKKworIyBj YW4gdXNlIGluZGV4c2NhbiBtZWNoYW5pc20gdG8gZmFzdCBhZGQgbXVsdGlwbGUgbm90LW51bGwg Y29uc3RyYWludHMKKyRvdXRwdXQgPSBydW5fc3FsX2NvbW1hbmQoCisJJ0FMVEVSIFRBQkxFIHQx IEFMVEVSIENPTFVNTiBmMiBTRVQgTk9UIE5VTEwsIEFMVEVSIENPTFVNTiBmMSBTRVQgTk9UIE5V TEw7JworKTsKK29rKCAkb3V0cHV0ID1+CisJICBtL2FsbCBuZXcgbm90LW51bGwgY29uc3RyYWlu dHMgb24gcmVsYXRpb24gInQxIiBoYXZlIGJlZW4gdmFsaWRhdGVkIGJ5IHVzaW5nIGluZGV4IHNj YW4vLAorCSdhbGwgbm90LW51bGwgY29uc3RyYWludHMgYXJlIHZhbGlkYXRlZCBieSBpbmRleHNj YW4nKTsKKworIyB1c2luZyBpbmRleHNjYW4gbWVjaGFuaXNtIHRvIGZhc3QgYWRkIGEgbm90LW51 bGwgY2FuIG9ubHkgYXBwbHkgdG8ga2V5IGNvbHVtbnMsIG5vdCBpbmNsdWRlIGNvbHVtbgorJG91 dHB1dCA9IHJ1bl9zcWxfY29tbWFuZCgKKwknQUxURVIgVEFCTEUgdDEgQUREIENPTlNUUkFJTlQg bm5mNCBOT1QgTlVMTCBmNDsnCispOworb2soIWlzX2luZGV4c2Nhbl92ZXJpdGlmeV9ub3RudWxs KCRvdXRwdXQpLCAnY2FuIG5vdCB1c2UgaW5kZXhzY2FuIHRvIHZhbGlkYXRlIG5vdC1udWxsIGNv bnN0cmFpbnQgb24gdDEnKTsKKworIyBpZiBpbmRleCBpcyBub3QgYnRyZWUgaW5kZXggdGhlbiBj YW5ub3QgdXNlIGluZGV4c2NhbiBtZWNoYW5pc20gdG8gZmFzdCBhZGQgbm90LW51bGwgY29uc3Ry YWludAorJG91dHB1dCA9IHJ1bl9zcWxfY29tbWFuZCgKKwknQUxURVIgVEFCTEUgdDEgQUREIENP TlNUUkFJTlQgbm5fZjUgTk9UIE5VTEwgZjU7JworKTsKK29rKCFpc19pbmRleHNjYW5fdmVyaXRp Znlfbm90bnVsbCgkb3V0cHV0KSwgJ2NhbiBub3QgdXNlIGluZGV4c2NhbiB0byB2YWxpZGF0ZSBu b3QtbnVsbCBjb25zdHJhaW50cyBvbiB0MScpOworCiskbm9kZS0+c3RvcCgnZmFzdCcpOworCitk b25lX3Rlc3RpbmcoKTsKLS0gCjIuMzQuMQoK --0000000000006745c60635150295--