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 1u7yLs-00Awwn-Qq for pgsql-hackers@arkaria.postgresql.org; Thu, 24 Apr 2025 15:19:01 +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 1u7yLr-001ABx-3q for pgsql-hackers@arkaria.postgresql.org; Thu, 24 Apr 2025 15:18:59 +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.94.2) (envelope-from ) id 1u7yLq-001ABo-KG for pgsql-hackers@lists.postgresql.org; Thu, 24 Apr 2025 15:18:59 +0000 Received: from mail-qv1-xf2e.google.com ([2607:f8b0:4864:20::f2e]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1u7yLn-001nhw-3D for pgsql-hackers@lists.postgresql.org; Thu, 24 Apr 2025 15:18:59 +0000 Received: by mail-qv1-xf2e.google.com with SMTP id 6a1803df08f44-6f0c30a1ca3so13721136d6.1 for ; Thu, 24 Apr 2025 08:18:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1745507935; x=1746112735; 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=h+pXMWxd+NXNDWkGVEyy7i144SEP2crUDacbMo29Rdk=; b=PEergfoeS/TEiIN38LBjDbmweFItSXfudk1U/bW0h5ycGz+tUf/bw07oMSphtW2v91 50IVFF8Yh4deI61zRqD5o4gvKWda8Etr0FOlDqBH0cKdLW2wxUamWDcarRlEsiYcsgO3 5nfH9+9t8hDacIjUciAHdg8+UGtjMpHovnqUG8a2jINSbkVVzOZc8FTrluwbx8eRTJyd ZPu/mnApjs0SAO1Yrg1/FF6NMZQ+uZXAb76rGd96kDm8dR4nIfLVCvs5741ZlVIINSqB BydYwEfpKoNV/TM5mGvCBClqnqYhkbHymT71/Lez2CltwJ3AnmBdnbx8Uot7AoOpb1Wg dyug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745507935; x=1746112735; 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=h+pXMWxd+NXNDWkGVEyy7i144SEP2crUDacbMo29Rdk=; b=KtSB7b6uB+LtlQdwwBh75Wp6gEFTkC2tasSACDFnBeWSLmKNiMtBQkruaKfPpaPDKm C/yqvVLrzETq3mI0ggw6y+V+PRRZRRurCJgt3BZ7JrRVK/Yl4O1oCUokmvtqkISolwXY i22J0UStM6IENW2n/8v5Kc9w1lG9qsEUPutc7dN4n6vVFQUg5yWwNU+EQImFYkCa2w3C RREyJpebYk42Mxe3R/eNVVoNpeTAqAYyNa+pgknFfXhyhWonoMZjVKHNBvYXSelacaeG lxnfButf1zX1JIjzKzarPBqL4BgrGu4+H1UlvafU4zpxs/h/HHrcjh6LSWIpTJATAZrE bHHA== X-Forwarded-Encrypted: i=1; AJvYcCXvfdIuJD3rNNeaE6kFpoBw4e3V2+0W98XnMudc/n897q0iWUpGTPeafoDuOO/2ZVAfIVL9+rh5QV6LLke+@lists.postgresql.org X-Gm-Message-State: AOJu0YzBEZrhLz6WLy+vYhR55kFWx3nHyTVuR6Cab5y5ZYW7Jj2Ma4Vf lKxSVOnIbZ8JJTIHoBLyid1bXF5OMV0kGVN6XW2a72YgEIF9O7MBEZKvPvvM7hR1FiCuxSIT9fm AARbfQPjvQ7bE/f88sM4lkat49hY= X-Gm-Gg: ASbGncvT3ETp5hzIaGvvaK9C7CRko4TRd182WttVJqRj9KaRxaaZMexIOISeO2rs/+j TQ8FHPZ/cug4pj0HQNsKHOJVbkudcb5kDau+MlLyM0gI8bIgEAwxK80c4IvDyFpd1ryZzhPL0yr H+p63fbJnQ7+efjlJXlr/0np6z4eBruwMZXsoQPUtTHnOEmoZnuNDKWPa8KJCSLxC+9w== X-Google-Smtp-Source: AGHT+IFNZYy0HH2Nt33TPftSi8vUZGLAP9g5FuSZOF9vDZoJLjRkjal/Gc5034gb5HJk1lfDeUAfOqD/TPcDUcYWTgk= X-Received: by 2002:a05:6214:27c5:b0:6e8:c713:31fa with SMTP id 6a1803df08f44-6f4bfbb8fbemr49461406d6.9.1745507935012; Thu, 24 Apr 2025 08:18:55 -0700 (PDT) MIME-Version: 1.0 References: <3C304C9E-976C-4FB9-A883-707E0B90756A@justatheory.com> In-Reply-To: From: Matheus Alcantara Date: Thu, 24 Apr 2025 12:18:28 -0300 X-Gm-Features: ATxdqUGF32kqRFPODoAPHxAnAXvhXfd8HdWTFgM05qmZHo1I5cFtiRu5dyYKWGU Message-ID: Subject: Re: extension_control_path and "directory" To: Christoph Berg Cc: "David E. Wheeler" , Peter Eisentraut , pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="0000000000006b94f8063387bce7" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000006b94f8063387bce7 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Apr 24, 2025 at 7:21=E2=80=AFAM Christoph Berg wr= ote: > > Re: Matheus Alcantara > > I've tested with the semver extension and it seems to work fine with > > this patch. Can you please check on your side to see if it's also > > working? > > Hi Matheus, > > thanks for the patch, it does indeed work. > Thanks for testing and for reviewing. > diff --git a/src/backend/commands/extension.c b/src/backend/commands/exte= nsion.c > index 180f4af9be3..d68efd59118 100644 > --- a/src/backend/commands/extension.c > +++ b/src/backend/commands/extension.c > @@ -376,6 +376,14 @@ get_extension_control_directories(void) > > /* Substitute the path macro if needed */ > mangled =3D substitute_path_macro(piece, "$system= ", system_dir); > + > + /* > + * Append "extension" suffix in case is a custom = extension control > + * path. > + */ > + if (strcmp(piece, "$system") !=3D 0) > + mangled =3D psprintf("%s/extension", mang= led); > > This would look prettier if it was something like > > mangled =3D substitute_path_macro(piece, "$system= ", system_dir "/extension"); > > ... but I'm wondering if it wouldn't be saner if the control path > should be stored without "extension" in that struct. Then opening the > control file would be path + "extension/" + filename and the extra > directory would be path + directory, without any on-the-fly stripping > of trailing components. > > The extension_control_path GUC could also be adjusted to refer to the > directory one level above the extension/foo.control location. > Storing the control path directly without any code to remove the /extension at the end would be more trick I think, because we would need to change the find_in_path() function to return the path without the suffix. In this new version I've introduced a new "basedir" field on ExtensionControlFile so that we can save the base directory to search for .control files and scripts. With this new field, on get_extension_script_directory() we just need to join control->basedir with control->directory. Note that we still need to handle the removal of the /extension at the end of control path but I think that on this new version the code looks a bit better (IMHO) since we just need to handle on find_extension_control_filename(). WYT? > > + /* > + * Assert that the control->control_dir end with /extension suffi= x so that > + * we can replace with the value from control->directory. > + */ > + Assert(ctrldir_len >=3D suffix_len && > + strcmp(control->control_dir + ctrldir_len - suffix_len= , "extension") =3D=3D 0); > > If control_dir is coming from extension_control_path, it might have a > different suffix. Replace the Assert by elog(ERROR). (Or see above.) > In v2 I've moved the logic to remove the /extension to parse_extension_control_file(), do you think that this Assert on this function would still be wrong? IIUC we should always have /extension at the end of "control_dir" at this place, because the extension_control_path GUC will omit the /extension at the end and we will force it to have the suffix on the path at find_extension_control_filename() and get_extension_control_directories() functions. I'm missing something here? I've also included some more TAP tests on this new version. --=20 Matheus Alcantara --0000000000006b94f8063387bce7 Content-Type: application/octet-stream; name="v2-0001-Make-directory-work-with-extension-control-path.patch" Content-Disposition: attachment; filename="v2-0001-Make-directory-work-with-extension-control-path.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m9vibuhg0 RnJvbSBiNzQ1OTBiNzViMGEwOGM3NDYyNWExNzMxYzI1NDRlYzEyNzFmYTM0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRoZXVzIEFsY2FudGFyYSA8bXRocy5kZXZAcG0ubWU+CkRh dGU6IFdlZCwgMjMgQXByIDIwMjUgMTY6MTE6MjQgLTAzMDAKU3ViamVjdDogW1BBVENIIHYyXSBN YWtlICJkaXJlY3RvcnkiIHdvcmsgd2l0aCBleHRlbnNpb24gY29udHJvbCBwYXRoCgpQcmV2aW91 c2x5IGV4dGVuc2lvbnMgaW5zdGFsbGVkIG9uIGEgY3VzdG9tIHBhdGggdGhhdCBpcyBhdmFpbGFi bGUgdmlhCmV4dGVuc2lvbl9jb250cm9sX3BhdGggR1VDIHRoYXQgc2V0IHRoZSAiZGlyZWN0b3J5 IiBmaWVsZCBvbiAuY29udHJvbApmaWxlIHdhcyBub3QgYmVpbmcgYWJsZSB0byBDUkVBVEUuIFRo aXMgd2FzIGhhcHBlbmluZyBiZWNhdXNlIG9uCmdldF9leHRlbnNpb25fc2NyaXB0X2RpcmVjdG9y eSB3YXMgaGFyZCBjb2RlZCB0byBzZWFyY2ggZm9yIHRoZSBzY3JpcHQKZmlsZXMgb25seSBvbiB0 aGUgc2hhcmUgc3lzdGVtIGRpci4KClRoaXMgY29tbWl0IGZpeCB0aGlzIGlzc3VlIGJ5IHVzaW5n IHRoZSBjb250cm9sLT5jb250cm9sX2RpciBhcyBhIHNoYXJlCmRpciB0byByZXR1cm4gdGhlIHBh dGggb2YgdGhlIGV4dGVuc2lvbiBzY3JpcHQgZmlsZXMuCi0tLQogc3JjL2JhY2tlbmQvY29tbWFu ZHMvZXh0ZW5zaW9uLmMgICAgICAgICAgICAgIHwgMjggKysrKy0tCiAuLi4vdC8wMDFfZXh0ZW5z aW9uX2NvbnRyb2xfcGF0aC5wbCAgICAgICAgICAgfCA4OCArKysrKysrKysrKysrKy0tLS0tCiAy IGZpbGVzIGNoYW5nZWQsIDg0IGluc2VydGlvbnMoKyksIDMyIGRlbGV0aW9ucygtKQoKZGlmZiAt LWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2V4dGVuc2lvbi5jIGIvc3JjL2JhY2tlbmQvY29t bWFuZHMvZXh0ZW5zaW9uLmMKaW5kZXggMTgwZjRhZjliZTMuLjNjODVjNzQ1ZDBhIDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9leHRlbnNpb24uYworKysgYi9zcmMvYmFja2VuZC9j b21tYW5kcy9leHRlbnNpb24uYwpAQCAtODMsNiArODMsOCBAQCBPaWQJCQlDdXJyZW50RXh0ZW5z aW9uT2JqZWN0ID0gSW52YWxpZE9pZDsKIHR5cGVkZWYgc3RydWN0IEV4dGVuc2lvbkNvbnRyb2xG aWxlCiB7CiAJY2hhcgkgICAqbmFtZTsJCQkvKiBuYW1lIG9mIHRoZSBleHRlbnNpb24gKi8KKwlj aGFyCSAgICpiYXNlZGlyOwkJLyogYmFzZSBkaXJlY3Rvcnkgd2hlcmUgY29udHJvbCBhbmQgc2Ny aXB0CisJCQkJCQkJCSAqIGZpbGVzIGFyZSBsb2NhdGVkICovCiAJY2hhcgkgICAqY29udHJvbF9k aXI7CS8qIGRpcmVjdG9yeSB3aGVyZSBjb250cm9sIGZpbGUgd2FzIGZvdW5kICovCiAJY2hhcgkg ICAqZGlyZWN0b3J5OwkJLyogZGlyZWN0b3J5IGZvciBzY3JpcHQgZmlsZXMgKi8KIAljaGFyCSAg ICpkZWZhdWx0X3ZlcnNpb247CS8qIGRlZmF1bHQgaW5zdGFsbCB0YXJnZXQgdmVyc2lvbiwgaWYg YW55ICovCkBAIC0zNzYsNiArMzc4LDE0IEBAIGdldF9leHRlbnNpb25fY29udHJvbF9kaXJlY3Rv cmllcyh2b2lkKQogCiAJCQkvKiBTdWJzdGl0dXRlIHRoZSBwYXRoIG1hY3JvIGlmIG5lZWRlZCAq LwogCQkJbWFuZ2xlZCA9IHN1YnN0aXR1dGVfcGF0aF9tYWNybyhwaWVjZSwgIiRzeXN0ZW0iLCBz eXN0ZW1fZGlyKTsKKworCQkJLyoKKwkJCSAqIEFwcGVuZCAiZXh0ZW5zaW9uIiBzdWZmaXggaW4g Y2FzZSBpcyBhIGN1c3RvbSBleHRlbnNpb24gY29udHJvbAorCQkJICogcGF0aC4KKwkJCSAqLwor CQkJaWYgKHN0cmNtcChwaWVjZSwgIiRzeXN0ZW0iKSAhPSAwKQorCQkJCW1hbmdsZWQgPSBwc3By aW50ZigiJXMvZXh0ZW5zaW9uIiwgbWFuZ2xlZCk7CisKIAkJCXBmcmVlKHBpZWNlKTsKIAogCQkJ LyogQ2Fub25pY2FsaXplIHRoZSBwYXRoIGJhc2VkIG9uIHRoZSBPUyBhbmQgYWRkIHRvIHRoZSBs aXN0ICovCkBAIC00MjIsNiArNDMyLDkgQEAgZmluZF9leHRlbnNpb25fY29udHJvbF9maWxlbmFt ZShFeHRlbnNpb25Db250cm9sRmlsZSAqY29udHJvbCkKIAllY3AgPSBFeHRlbnNpb25fY29udHJv bF9wYXRoOwogCWlmIChzdHJsZW4oZWNwKSA9PSAwKQogCQllY3AgPSAiJHN5c3RlbSI7CisJZWxz ZSBpZiAoc3RyY21wKGVjcCwgIiRzeXN0ZW0iKSAhPSAwKQorCQllY3AgPSBwc3ByaW50ZigiJXMv ZXh0ZW5zaW9uIiwgZWNwKTsKKwogCXJlc3VsdCA9IGZpbmRfaW5fcGF0aChiYXNlbmFtZSwgZWNw LCAiZXh0ZW5zaW9uX2NvbnRyb2xfcGF0aCIsICIkc3lzdGVtIiwgc3lzdGVtX2Rpcik7CiAKIAlp ZiAocmVzdWx0KQpAQCAtNDM5LDkgKzQ1Miw2IEBAIGZpbmRfZXh0ZW5zaW9uX2NvbnRyb2xfZmls ZW5hbWUoRXh0ZW5zaW9uQ29udHJvbEZpbGUgKmNvbnRyb2wpCiBzdGF0aWMgY2hhciAqCiBnZXRf ZXh0ZW5zaW9uX3NjcmlwdF9kaXJlY3RvcnkoRXh0ZW5zaW9uQ29udHJvbEZpbGUgKmNvbnRyb2wp CiB7Ci0JY2hhcgkJc2hhcmVwYXRoW01BWFBHUEFUSF07Ci0JY2hhcgkgICAqcmVzdWx0OwotCiAJ LyoKIAkgKiBUaGUgZGlyZWN0b3J5IHBhcmFtZXRlciBjYW4gYmUgb21pdHRlZCwgYWJzb2x1dGUs IG9yIHJlbGF0aXZlIHRvIHRoZQogCSAqIGluc3RhbGxhdGlvbidzIHNoYXJlIGRpcmVjdG9yeS4K QEAgLTQ1MiwxMSArNDYyLDggQEAgZ2V0X2V4dGVuc2lvbl9zY3JpcHRfZGlyZWN0b3J5KEV4dGVu c2lvbkNvbnRyb2xGaWxlICpjb250cm9sKQogCWlmIChpc19hYnNvbHV0ZV9wYXRoKGNvbnRyb2wt PmRpcmVjdG9yeSkpCiAJCXJldHVybiBwc3RyZHVwKGNvbnRyb2wtPmRpcmVjdG9yeSk7CiAKLQln ZXRfc2hhcmVfcGF0aChteV9leGVjX3BhdGgsIHNoYXJlcGF0aCk7Ci0JcmVzdWx0ID0gKGNoYXIg KikgcGFsbG9jKE1BWFBHUEFUSCk7Ci0Jc25wcmludGYocmVzdWx0LCBNQVhQR1BBVEgsICIlcy8l cyIsIHNoYXJlcGF0aCwgY29udHJvbC0+ZGlyZWN0b3J5KTsKLQotCXJldHVybiByZXN1bHQ7CisJ QXNzZXJ0KGNvbnRyb2wtPmJhc2VkaXIgIT0gTlVMTCk7CisJcmV0dXJuIHBzcHJpbnRmKCIlcy8l cyIsIGNvbnRyb2wtPmJhc2VkaXIsIGNvbnRyb2wtPmRpcmVjdG9yeSk7CiB9CiAKIHN0YXRpYyBj aGFyICoKQEAgLTU0Miw2ICs1NDksMTEgQEAgcGFyc2VfZXh0ZW5zaW9uX2NvbnRyb2xfZmlsZShF eHRlbnNpb25Db250cm9sRmlsZSAqY29udHJvbCwKIAkJCWZpbGVuYW1lID0gZmluZF9leHRlbnNp b25fY29udHJvbF9maWxlbmFtZShjb250cm9sKTsKIAl9CiAKKwlBc3NlcnQoY29udHJvbC0+Y29u dHJvbF9kaXIgIT0gTlVMTCk7CisJY29udHJvbC0+YmFzZWRpciA9IHBuc3RyZHVwKAorCQkJCQkJ CQljb250cm9sLT5jb250cm9sX2RpciwKKwkJCQkJCQkJc3RybGVuKGNvbnRyb2wtPmNvbnRyb2xf ZGlyKSAtIHN0cmxlbigiL2V4dGVuc2lvbiIpKTsKKwogCWlmICghZmlsZW5hbWUpCiAJewogCQll cmVwb3J0KEVSUk9SLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2V4dGVuc2lv bnMvdC8wMDFfZXh0ZW5zaW9uX2NvbnRyb2xfcGF0aC5wbCBiL3NyYy90ZXN0L21vZHVsZXMvdGVz dF9leHRlbnNpb25zL3QvMDAxX2V4dGVuc2lvbl9jb250cm9sX3BhdGgucGwKaW5kZXggYzE4NmMx NDcwZjcuLjgyN2YyOTNmYmM5IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfZXh0 ZW5zaW9ucy90LzAwMV9leHRlbnNpb25fY29udHJvbF9wYXRoLnBsCisrKyBiL3NyYy90ZXN0L21v ZHVsZXMvdGVzdF9leHRlbnNpb25zL3QvMDAxX2V4dGVuc2lvbl9jb250cm9sX3BhdGgucGwKQEAg LTUsNiArNSw3IEBAIHVzZSB3YXJuaW5ncyBGQVRBTCA9PiAnYWxsJzsKIHVzZSBQb3N0Z3JlU1FM OjpUZXN0OjpDbHVzdGVyOwogdXNlIFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxzOwogdXNlIFRlc3Q6 Ok1vcmU7Cit1c2UgRmlsZTo6UGF0aCBxdyggbWFrZV9wYXRoICk7CiAKIG15ICRub2RlID0gUG9z dGdyZVNRTDo6VGVzdDo6Q2x1c3Rlci0+bmV3KCdub2RlJyk7CiAKQEAgLTEyLDI1ICsxMywxNCBA QCAkbm9kZS0+aW5pdDsKIAogIyBDcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciB0aGUg ZXh0ZW5zaW9uIGNvbnRyb2wgZmlsZQogbXkgJGV4dF9kaXIgPSBQb3N0Z3JlU1FMOjpUZXN0OjpV dGlsczo6dGVtcGRpcigpOworbWFrZV9wYXRoKCIkZXh0X2Rpci9leHRlbnNpb24iKTsKKwogbXkg JGV4dF9uYW1lID0gInRlc3RfY3VzdG9tX2V4dF9wYXRocyI7Ci1teSAkY29udHJvbF9maWxlID0g IiRleHRfZGlyLyRleHRfbmFtZS5jb250cm9sIjsKLW15ICRzcWxfZmlsZSA9ICIkZXh0X2Rpci8k ZXh0X25hbWUtLTEuMC5zcWwiOwotCi0jIENyZWF0ZSAuY29udHJvbCAuc3FsIGZpbGUKLW9wZW4g bXkgJGNmLCAnPicsICRjb250cm9sX2ZpbGUgb3IgZGllICJDb3VsZCBub3QgY3JlYXRlIGNvbnRy b2wgZmlsZTogJCEiOwotcHJpbnQgJGNmICJjb21tZW50ID0gJ1Rlc3QgZXh0ZW5zaW9uX2NvbnRy b2xfcGF0aCdcbiI7Ci1wcmludCAkY2YgImRlZmF1bHRfdmVyc2lvbiA9ICcxLjAnXG4iOwotcHJp bnQgJGNmICJyZWxvY2F0YWJsZSA9IHRydWVcbiI7Ci1jbG9zZSAkY2Y7Ci0KLSMgQ3JlYXRlIC0t MS4wLnNxbCBmaWxlCi1vcGVuIG15ICRzcWxmLCAnPicsICRzcWxfZmlsZSBvciBkaWUgIkNvdWxk IG5vdCBjcmVhdGUgc3FsIGZpbGU6ICQhIjsKLXByaW50ICRzcWxmICIvKiAkc3FsX2ZpbGUgKi9c biI7Ci1wcmludCAkc3FsZgotICAiLS0gY29tcGxhaW4gaWYgc2NyaXB0IGlzIHNvdXJjZWQgaW4g cHNxbCwgcmF0aGVyIHRoYW4gdmlhIENSRUFURSBFWFRFTlNJT05cbiI7Ci1wcmludCAkc3FsZgot ICBxcSdcXGVjaG8gVXNlICJDUkVBVEUgRVhURU5TSU9OICRleHRfbmFtZSIgdG8gbG9hZCB0aGlz IGZpbGUuIFxccXVpdFxuJzsKLWNsb3NlICRzcWxmOworY3JlYXRlX2V4dGVuc2lvbigkZXh0X25h bWUsICRleHRfZGlyKTsKKworbXkgJGV4dF9uYW1lMiA9ICJ0ZXN0X2N1c3RvbV9leHRfcGF0aHNf dXNpbmdfZGlyZWN0b3J5IjsKK21ha2VfcGF0aCgiJGV4dF9kaXIvJGV4dF9uYW1lMiIpOworY3Jl YXRlX2V4dGVuc2lvbigkZXh0X25hbWUyLCAkZXh0X2RpciwgJGV4dF9uYW1lMik7CiAKICMgVXNl IHRoZSBjb3JyZWN0IHNlcGFyYXRvciBhbmQgZXNjYXBlIFwgd2hlbiBydW5uaW5nIG9uIFdpbmRv d3MuCiBteSAkc2VwID0gJHdpbmRvd3Nfb3MgPyAiOyIgOiAiOiI7CkBAIC00OCw2ICszOCw3IEBA IGlzKCRlY3AsICJcJHN5c3RlbSRzZXAkZXh0X2RpciIsCiAJImN1c3RvbSBleHRlbnNpb24gY29u dHJvbCBkaXJlY3RvcnkgcGF0aCBjb25maWd1cmVkIik7CiAKICRub2RlLT5zYWZlX3BzcWwoJ3Bv c3RncmVzJywgIkNSRUFURSBFWFRFTlNJT04gJGV4dF9uYW1lIik7Ciskbm9kZS0+c2FmZV9wc3Fs KCdwb3N0Z3JlcycsICJDUkVBVEUgRVhURU5TSU9OICRleHRfbmFtZTIiKTsKIAogbXkgJHJldCA9 ICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKIAkic2VsZWN0ICogZnJvbSBwZ19hdmFpbGFi bGVfZXh0ZW5zaW9ucyB3aGVyZSBuYW1lID0gJyRleHRfbmFtZSciKTsKQEAgLTU1LDI2ICs0Niw3 NSBAQCBpcyggJHJldCwKIAkidGVzdF9jdXN0b21fZXh0X3BhdGhzfDEuMHwxLjB8VGVzdCBleHRl bnNpb25fY29udHJvbF9wYXRoIiwKIAkiZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCBjb3JyZWN0bHkg b24gcGdfYXZhaWxhYmxlX2V4dGVuc2lvbnMiKTsKIAotbXkgJHJldDIgPSAkbm9kZS0+c2FmZV9w c3FsKCdwb3N0Z3JlcycsCiskcmV0ID0gJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAogCSJz ZWxlY3QgKiBmcm9tIHBnX2F2YWlsYWJsZV9leHRlbnNpb25fdmVyc2lvbnMgd2hlcmUgbmFtZSA9 ICckZXh0X25hbWUnIik7Ci1pcyggJHJldDIsCitpcyggJHJldCwKIAkidGVzdF9jdXN0b21fZXh0 X3BhdGhzfDEuMHx0fHR8Znx0fHx8VGVzdCBleHRlbnNpb25fY29udHJvbF9wYXRoIiwKIAkiZXh0 ZW5zaW9uIGlzIGluc3RhbGxlZCBjb3JyZWN0bHkgb24gcGdfYXZhaWxhYmxlX2V4dGVuc2lvbl92 ZXJzaW9ucyIpOwogCiskcmV0ID0gJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSJzZWxl Y3QgKiBmcm9tIHBnX2F2YWlsYWJsZV9leHRlbnNpb25zIHdoZXJlIG5hbWUgPSAnJGV4dF9uYW1l MiciKTsKK2lzKCAkcmV0LAorCSJ0ZXN0X2N1c3RvbV9leHRfcGF0aHNfdXNpbmdfZGlyZWN0b3J5 fDEuMHwxLjB8VGVzdCBleHRlbnNpb25fY29udHJvbF9wYXRoIiwKKwkiZXh0ZW5zaW9uIGlzIGlu c3RhbGxlZCBjb3JyZWN0bHkgb24gcGdfYXZhaWxhYmxlX2V4dGVuc2lvbnMiKTsKKworJHJldCA9 ICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwkic2VsZWN0ICogZnJvbSBwZ19hdmFpbGFi bGVfZXh0ZW5zaW9uX3ZlcnNpb25zIHdoZXJlIG5hbWUgPSAnJGV4dF9uYW1lMiciKTsKK2lzKCAk cmV0LAorCSJ0ZXN0X2N1c3RvbV9leHRfcGF0aHNfdXNpbmdfZGlyZWN0b3J5fDEuMHx0fHR8Znx0 fHx8VGVzdCBleHRlbnNpb25fY29udHJvbF9wYXRoIiwKKwkiZXh0ZW5zaW9uIGlzIGluc3RhbGxl ZCBjb3JyZWN0bHkgb24gcGdfYXZhaWxhYmxlX2V4dGVuc2lvbl92ZXJzaW9ucyIpOworCiAjIEVu c3VyZSB0aGF0IGV4dGVuc2lvbnMgaW5zdGFsbGVkIG9uICRzeXN0ZW0gaXMgc3RpbGwgdmlzaWJs ZSB3aGVuIHVzaW5nIHdpdGgKICMgY3VzdG9tIGV4dGVuc2lvbiBjb250cm9sIHBhdGguCi1teSAk cmV0MyA9ICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKyRyZXQgPSAkbm9kZS0+c2FmZV9w c3FsKCdwb3N0Z3JlcycsCiAJInNlbGVjdCBjb3VudCgqKSA+IDAgYXMgb2sgZnJvbSBwZ19hdmFp bGFibGVfZXh0ZW5zaW9ucyB3aGVyZSBuYW1lID0gJ3BscGdzcWwnIgogKTsKLWlzKCRyZXQzLCAi dCIsCitpcygkcmV0LCAidCIsCiAJIlwkc3lzdGVtIGV4dGVuc2lvbiBpcyBpbnN0YWxsZWQgY29y cmVjdGx5IG9uIHBnX2F2YWlsYWJsZV9leHRlbnNpb25zIik7CiAKIAotbXkgJHJldDQgPSAkbm9k ZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCiskcmV0ID0gJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdy ZXMnLAogCSJzZXQgZXh0ZW5zaW9uX2NvbnRyb2xfcGF0aCA9ICcnOyBzZWxlY3QgY291bnQoKikg PiAwIGFzIG9rIGZyb20gcGdfYXZhaWxhYmxlX2V4dGVuc2lvbnMgd2hlcmUgbmFtZSA9ICdwbHBn c3FsJyIKICk7Ci1pcygkcmV0NCwgInQiLAoraXMoJHJldCwgInQiLAogCSJcJHN5c3RlbSBleHRl bnNpb24gaXMgaW5zdGFsbGVkIGNvcnJlY3RseSBvbiBwZ19hdmFpbGFibGVfZXh0ZW5zaW9ucyB3 aXRoIGVtcHR5IGV4dGVuc2lvbl9jb250cm9sX3BhdGgiCiApOwogCitzdWIgY3JlYXRlX2V4dGVu c2lvbgoreworCW15ICgkZXh0X25hbWUsICRleHRfZGlyLCAkZGlyZWN0b3J5KSA9IEBfOworCisJ bXkgJGNvbnRyb2xfZmlsZSA9ICIkZXh0X2Rpci9leHRlbnNpb24vJGV4dF9uYW1lLmNvbnRyb2wi OworCW15ICRzcWxfZmlsZTsKKworCWlmIChkZWZpbmVkICRkaXJlY3RvcnkpCisJeworCQkkc3Fs X2ZpbGUgPSAiJGV4dF9kaXIvJGRpcmVjdG9yeS8kZXh0X25hbWUtLTEuMC5zcWwiOworCX0KKwll bHNlCisJeworCQkkc3FsX2ZpbGUgPSAiJGV4dF9kaXIvZXh0ZW5zaW9uLyRleHRfbmFtZS0tMS4w LnNxbCI7CisJfQorCisJIyBDcmVhdGUgLmNvbnRyb2wgLnNxbCBmaWxlCisJb3BlbiBteSAkY2Ys ICc+JywgJGNvbnRyb2xfZmlsZSBvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgY29udHJvbCBmaWxl OiAkISI7CisJcHJpbnQgJGNmICJjb21tZW50ID0gJ1Rlc3QgZXh0ZW5zaW9uX2NvbnRyb2xfcGF0 aCdcbiI7CisJcHJpbnQgJGNmICJkZWZhdWx0X3ZlcnNpb24gPSAnMS4wJ1xuIjsKKwlwcmludCAk Y2YgInJlbG9jYXRhYmxlID0gdHJ1ZVxuIjsKKwlpZiAoZGVmaW5lZCAkZGlyZWN0b3J5KQorCXsK KwkJcHJpbnQgJGNmICJkaXJlY3RvcnkgPSAkZGlyZWN0b3J5IjsKKwl9CisJY2xvc2UgJGNmOwor CisJIyBDcmVhdGUgLS0xLjAuc3FsIGZpbGUKKwlvcGVuIG15ICRzcWxmLCAnPicsICRzcWxfZmls ZSBvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgc3FsIGZpbGU6ICQhIjsKKwlwcmludCAkc3FsZiAi LyogJHNxbF9maWxlICovXG4iOworCXByaW50ICRzcWxmCisJICAiLS0gY29tcGxhaW4gaWYgc2Ny aXB0IGlzIHNvdXJjZWQgaW4gcHNxbCwgcmF0aGVyIHRoYW4gdmlhIENSRUFURSBFWFRFTlNJT05c biI7CisJcHJpbnQgJHNxbGYKKwkgIHFxJ1xcZWNobyBVc2UgIkNSRUFURSBFWFRFTlNJT04gJGV4 dF9uYW1lIiB0byBsb2FkIHRoaXMgZmlsZS4gXFxxdWl0XG4nOworCWNsb3NlICRzcWxmOworfQor CiBkb25lX3Rlc3RpbmcoKTsKLS0gCjIuMzkuNSAoQXBwbGUgR2l0LTE1NCkKCg== --0000000000006b94f8063387bce7--