From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by sourceware.org (Postfix) with ESMTPS id D12FB385734B for ; Wed, 1 Jun 2022 16:36:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D12FB385734B Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 16E7E21AE6; Wed, 1 Jun 2022 16:36:41 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id F0C2513A8F; Wed, 1 Jun 2022 16:36:40 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 8Sx7OZiVl2KxUwAAMHmgww (envelope-from ); Wed, 01 Jun 2022 16:36:40 +0000 Content-Type: multipart/mixed; boundary="------------MsbUAY075emqC8vHlqM0mbj0" Message-ID: Date: Wed, 1 Jun 2022 18:36:40 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.0 Subject: Re: [PATCH][gdb] Fix warning in foreach_arch selftests Content-Language: en-US To: Pedro Alves , gdb-patches@sourceware.org References: <20220601104130.GA24730@delia.home> <45511000-6883-53f4-cec6-395cd0c5b216@palves.net> From: Tom de Vries In-Reply-To: <45511000-6883-53f4-cec6-395cd0c5b216@palves.net> X-Spam-Status: No, score=-13.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, NICE_REPLY_A, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 01 Jun 2022 16:36:43 -0000 This is a multi-part message in MIME format. --------------MsbUAY075emqC8vHlqM0mbj0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 6/1/22 16:32, Pedro Alves wrote: > On 2022-06-01 11:41, Tom de Vries via Gdb-patches wrote: >> Hi, >> >> When running the selftests, I run into: >> ... >> $ gdb -q -batch -ex "maint selftest" >> ... >> Running selftest execute_cfa_program::aarch64:ilp32. >> warning: A handler for the OS ABI "GNU/Linux" is not built into this >> configuration of GDB. Attempting to continue with the default aarch64:ilp32 >> settings. >> ... >> and likewise for execute_cfa_program::i8086 and >> execute_cfa_program::ia64-elf32. >> >> The warning can easily be reproduced outside the selftests by doing: >> ... >> $ gdb -q -batch -ex "set arch aarch64:ilp32" >> ... >> and can be prevented by first doing "set osabi none". >> >> Fix the warning by setting osabi to none while doing selftests that iterate >> over all architectures. >> >> Tested on x86_64-linux. >> >> Any comments? >> >> Thanks, >> - Tom >> >> [gdb] Fix warning in foreach_arch selftests >> >> --- >> gdb/osabi.c | 13 +++++++++++++ >> gdb/osabi.h | 6 ++++++ >> gdb/selftest-arch.c | 15 ++++++++++++++- >> 3 files changed, 33 insertions(+), 1 deletion(-) >> >> diff --git a/gdb/osabi.c b/gdb/osabi.c >> index bbd7635532f..c3f221df969 100644 >> --- a/gdb/osabi.c >> +++ b/gdb/osabi.c >> @@ -633,6 +633,19 @@ set_osabi (const char *args, int from_tty, struct cmd_list_element *c) >> internal_error (__FILE__, __LINE__, _("Updating OS ABI failed.")); >> } >> >> +void >> +set_osabi (const char *arg) >> +{ >> + set_osabi_string = arg; >> + set_osabi (NULL, 0, NULL); >> +} >> + >> +const char * >> +get_osabi () >> +{ >> + return set_osabi_string; >> +} > > Missing usual "see foo.h" comments. > Hi, thanks for the review. Done. >> + >> static void >> show_osabi (struct ui_file *file, int from_tty, struct cmd_list_element *c, >> const char *value) >> diff --git a/gdb/osabi.h b/gdb/osabi.h >> index be016732cbc..eb5d88699e7 100644 >> --- a/gdb/osabi.h >> +++ b/gdb/osabi.h >> @@ -89,4 +89,10 @@ const char *osabi_triplet_regexp (enum gdb_osabi osabi); >> void generic_elf_osabi_sniff_abi_tag_sections (bfd *, asection *, >> enum gdb_osabi *); >> >> +/* Set osabi to ARG. */ >> +extern void set_osabi (const char *arg); >> + >> +/* Return current osabi setting. */ >> +extern const char *get_osabi (); >> + >> #endif /* OSABI_H */ >> diff --git a/gdb/selftest-arch.c b/gdb/selftest-arch.c >> index f434da718d5..a631f52e31e 100644 >> --- a/gdb/selftest-arch.c >> +++ b/gdb/selftest-arch.c >> @@ -66,12 +66,25 @@ foreach_arch_test_generator (const std::string &name, >> auto test_fn >> = ([=] () >> { >> + /* Prevent warnings when setting architecture with current osabi >> + settings, like: >> + A handler for the OS ABI "GNU/Linux" is not built into this >> + configuration of GDB. Attempting to continue with the >> + default aarch64:ilp32 settings. */ >> + const char *save_osabi = get_osabi (); >> + set_osabi ("none"); >> + > > A bit of an odd API to have to pass the string name in. I'd think an API that > takes an enum gdb_osabi would be better, as that way you don't have to worry > about either passing the wrong string, or even worry about whether it's the > string contents that counts (whether the function internally uses strcmp), > or the string's address (the function internally compares pointers, assuming > the only strings that will be passed down are the ones in the command's enum > strings array). > Done. >> struct gdbarch_info info; >> info.bfd_arch_info = bfd_scan_arch (arch); >> struct gdbarch *gdbarch = gdbarch_find_by_info (info); >> SELF_CHECK (gdbarch != NULL); >> + >> function (gdbarch); >> - reset (); >> + >> + SCOPE_EXIT { >> + reset (); >> + set_osabi (save_osabi); >> + }; > > Please format as: > > SCOPE_EXIT > { > reset (); > set_osabi (save_osabi); > }; > > And you'll also need to move this to right after the set_osabi("none") call. Doing it > here is too late. SCOPE_EXIT creates a RAII object on the stack, which needs to exist > before any of the code that may throw right after set_osabi("none"). > Done, thanks for catching that. How does this look? Thanks, - Tom --------------MsbUAY075emqC8vHlqM0mbj0 Content-Type: text/x-patch; charset=UTF-8; name="0002-gdb-Fix-warning-in-foreach_arch-selftests.patch" Content-Disposition: attachment; filename="0002-gdb-Fix-warning-in-foreach_arch-selftests.patch" Content-Transfer-Encoding: base64 W2dkYl0gRml4IHdhcm5pbmcgaW4gZm9yZWFjaF9hcmNoIHNlbGZ0ZXN0cwoKV2hlbiBydW5u aW5nIHRoZSBzZWxmdGVzdHMsIEkgcnVuIGludG86Ci4uLgokIGdkYiAtcSAtYmF0Y2ggLWV4 ICJtYWludCBzZWxmdGVzdCIKICAuLi4KUnVubmluZyBzZWxmdGVzdCBleGVjdXRlX2NmYV9w cm9ncmFtOjphYXJjaDY0OmlscDMyLgp3YXJuaW5nOiBBIGhhbmRsZXIgZm9yIHRoZSBPUyBB QkkgIkdOVS9MaW51eCIgaXMgbm90IGJ1aWx0IGludG8gdGhpcwpjb25maWd1cmF0aW9uIG9m IEdEQi4gIEF0dGVtcHRpbmcgdG8gY29udGludWUgd2l0aCB0aGUgZGVmYXVsdCBhYXJjaDY0 OmlscDMyCnNldHRpbmdzLgouLi4KYW5kIGxpa2V3aXNlIGZvciBleGVjdXRlX2NmYV9wcm9n cmFtOjppODA4NiBhbmQKZXhlY3V0ZV9jZmFfcHJvZ3JhbTo6aWE2NC1lbGYzMi4KClRoZSB3 YXJuaW5nIGNhbiBlYXNpbHkgYmUgcmVwcm9kdWNlZCBvdXRzaWRlIHRoZSBzZWxmdGVzdHMg YnkgZG9pbmc6Ci4uLgokIGdkYiAtcSAtYmF0Y2ggLWV4ICJzZXQgYXJjaCBhYXJjaDY0Omls cDMyIgouLi4KYW5kIGNhbiBiZSBwcmV2ZW50ZWQgYnkgZmlyc3QgZG9pbmcgInNldCBvc2Fi aSBub25lIi4KCkZpeCB0aGUgd2FybmluZyBieSBzZXR0aW5nIG9zYWJpIHRvIG5vbmUgd2hp bGUgZG9pbmcgc2VsZnRlc3RzIHRoYXQgaXRlcmF0ZQpvdmVyIGFsbCBhcmNoaXRlY3R1cmVz LgoKVGVzdGVkIG9uIHg4Nl82NC1saW51eC4KCi0tLQogZ2RiL29zYWJpLmMgICAgICAgICB8 IDUwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0t CiBnZGIvb3NhYmkuaCAgICAgICAgIHwgMTMgKysrKysrKysrKysrKwogZ2RiL3NlbGZ0ZXN0 LWFyY2guYyB8IDE4ICsrKysrKysrKysrKysrKysrLQogMyBmaWxlcyBjaGFuZ2VkLCA2OCBp bnNlcnRpb25zKCspLCAxMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9nZGIvb3NhYmku YyBiL2dkYi9vc2FiaS5jCmluZGV4IGJiZDc2MzU1MzJmLi43NzZlNjIwNjllNSAxMDA2NDQK LS0tIGEvZ2RiL29zYWJpLmMKKysrIGIvZ2RiL29zYWJpLmMKQEAgLTMyLDcgKzMyLDcgQEAK ICNlbmRpZgogCiAvKiBTdGF0ZSBmb3IgdGhlICJzZXQgb3NhYmkiIGNvbW1hbmQuICAqLwot c3RhdGljIGVudW0geyBvc2FiaV9hdXRvLCBvc2FiaV9kZWZhdWx0LCBvc2FiaV91c2VyIH0g dXNlcl9vc2FiaV9zdGF0ZTsKK3N0YXRpYyBlbnVtIGdkYl9vc2FiaV9tb2RlIHVzZXJfb3Nh Ymlfc3RhdGU7CiBzdGF0aWMgZW51bSBnZGJfb3NhYmkgdXNlcl9zZWxlY3RlZF9vc2FiaTsK IHN0YXRpYyBjb25zdCBjaGFyICpnZGJfb3NhYmlfYXZhaWxhYmxlX25hbWVzW0dEQl9PU0FC SV9JTlZBTElEICsgM10gPSB7CiAgICJhdXRvIiwKQEAgLTU5NSwxNSArNTk1LDQ4IEBAIGdl bmVyaWNfZWxmX29zYWJpX3NuaWZmZXIgKGJmZCAqYWJmZCkKICAgcmV0dXJuIG9zYWJpOwog fQogDAorLyogU2VlIG9zYWJpLmguICAqLworCit2b2lkCitzZXRfb3NhYmkgKGVudW0gZ2Ri X29zYWJpX21vZGUgbW9kZSwgZW51bSBnZGJfb3NhYmkgb3NhYmkpCit7CisgIGlmIChtb2Rl ID09IG9zYWJpX2F1dG8pCisgICAgdXNlcl9vc2FiaV9zdGF0ZSA9IG9zYWJpX2F1dG87Cisg IGVsc2UgaWYgKG1vZGUgPT0gb3NhYmlfZGVmYXVsdCkKKyAgICB7CisgICAgICB1c2VyX3Nl bGVjdGVkX29zYWJpID0gR0RCX09TQUJJX0RFRkFVTFQ7CisgICAgICB1c2VyX29zYWJpX3N0 YXRlID0gb3NhYmlfdXNlcjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB1c2VyX3Nl bGVjdGVkX29zYWJpID0gb3NhYmk7CisgICAgICB1c2VyX29zYWJpX3N0YXRlID0gb3NhYmlf dXNlcjsKKyAgICB9CisKKyAgLyogTk9URTogQXQgc29tZSBwb2ludCAodHJ1ZSBtdWx0aXBs ZSBhcmNoaXRlY3R1cmVzKSB3ZSdsbCBuZWVkIHRvIGJlIG1vcmUKKyAgICAgZ3JhY2VmdWwg aGVyZS4gICovCisgIGdkYmFyY2hfaW5mbyBpbmZvOworICBpZiAoISBnZGJhcmNoX3VwZGF0 ZV9wIChpbmZvKSkKKyAgICBpbnRlcm5hbF9lcnJvciAoX19GSUxFX18sIF9fTElORV9fLCBf KCJVcGRhdGluZyBPUyBBQkkgZmFpbGVkLiIpKTsKK30KKworLyogU2VlIG9zYWJpLmguICAq LworCit2b2lkCitnZXRfb3NhYmkgKGVudW0gZ2RiX29zYWJpX21vZGUgJm1vZGUsIGVudW0g Z2RiX29zYWJpICZvc2FiaSkKK3sKKyAgbW9kZSA9IHVzZXJfb3NhYmlfc3RhdGU7CisgIG9z YWJpID0gdXNlcl9zZWxlY3RlZF9vc2FiaTsKK30KKwogc3RhdGljIHZvaWQKIHNldF9vc2Fi aSAoY29uc3QgY2hhciAqYXJncywgaW50IGZyb21fdHR5LCBzdHJ1Y3QgY21kX2xpc3RfZWxl bWVudCAqYykKIHsKICAgaWYgKHN0cmNtcCAoc2V0X29zYWJpX3N0cmluZywgImF1dG8iKSA9 PSAwKQotICAgIHVzZXJfb3NhYmlfc3RhdGUgPSBvc2FiaV9hdXRvOworICAgIHNldF9vc2Fi aSAob3NhYmlfYXV0bywgR0RCX09TQUJJX0lOVkFMSUQpOwogICBlbHNlIGlmIChzdHJjbXAg KHNldF9vc2FiaV9zdHJpbmcsICJkZWZhdWx0IikgPT0gMCkKICAgICB7Ci0gICAgICB1c2Vy X3NlbGVjdGVkX29zYWJpID0gR0RCX09TQUJJX0RFRkFVTFQ7Ci0gICAgICB1c2VyX29zYWJp X3N0YXRlID0gb3NhYmlfdXNlcjsKKyAgICAgIHNldF9vc2FiaSAob3NhYmlfZGVmYXVsdCwg R0RCX09TQUJJX0lOVkFMSUQpOwogICAgIH0KICAgZWxzZQogICAgIHsKQEAgLTYxNSw4ICs2 NDgsNyBAQCBzZXRfb3NhYmkgKGNvbnN0IGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSwgc3Ry dWN0IGNtZF9saXN0X2VsZW1lbnQgKmMpCiAKIAkgIGlmIChzdHJjbXAgKHNldF9vc2FiaV9z dHJpbmcsIGdkYmFyY2hfb3NhYmlfbmFtZSAob3NhYmkpKSA9PSAwKQogCSAgICB7Ci0JICAg ICAgdXNlcl9zZWxlY3RlZF9vc2FiaSA9IG9zYWJpOwotCSAgICAgIHVzZXJfb3NhYmlfc3Rh dGUgPSBvc2FiaV91c2VyOworCSAgICAgIHNldF9vc2FiaSAob3NhYmlfdXNlciwgb3NhYmkp OwogCSAgICAgIGJyZWFrOwogCSAgICB9CiAJfQpAQCAtNjI1LDEyICs2NTcsNiBAQCBzZXRf b3NhYmkgKGNvbnN0IGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSwgc3RydWN0IGNtZF9saXN0 X2VsZW1lbnQgKmMpCiAJCQlfKCJJbnZhbGlkIE9TIEFCSSBcIiVzXCIgcGFzc2VkIHRvIGNv bW1hbmQgaGFuZGxlci4iKSwKIAkJCXNldF9vc2FiaV9zdHJpbmcpOwogICAgIH0KLQotICAv KiBOT1RFOiBBdCBzb21lIHBvaW50ICh0cnVlIG11bHRpcGxlIGFyY2hpdGVjdHVyZXMpIHdl J2xsIG5lZWQgdG8gYmUgbW9yZQotICAgICBncmFjZWZ1bCBoZXJlLiAgKi8KLSAgZ2RiYXJj aF9pbmZvIGluZm87Ci0gIGlmICghIGdkYmFyY2hfdXBkYXRlX3AgKGluZm8pKQotICAgIGlu dGVybmFsX2Vycm9yIChfX0ZJTEVfXywgX19MSU5FX18sIF8oIlVwZGF0aW5nIE9TIEFCSSBm YWlsZWQuIikpOwogfQogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvZ2RiL29zYWJpLmgg Yi9nZGIvb3NhYmkuaAppbmRleCBiZTAxNjczMmNiYy4uMzczN2E3N2Q1MGUgMTAwNjQ0Ci0t LSBhL2dkYi9vc2FiaS5oCisrKyBiL2dkYi9vc2FiaS5oCkBAIC01MCw2ICs1MCwxMyBAQCBl bnVtIGdkYl9vc2FiaQogICBHREJfT1NBQklfSU5WQUxJRAkJLyoga2VlcCB0aGlzIGxhc3Qg Ki8KIH07CiAKK2VudW0gZ2RiX29zYWJpX21vZGUKK3sKKyAgb3NhYmlfYXV0bywKKyAgb3Nh YmlfZGVmYXVsdCwKKyAgb3NhYmlfdXNlcgorfTsKKwogLyogUmVnaXN0ZXIgYW4gT1MgQUJJ IHNuaWZmZXIuICBFYWNoIGFyY2gvZmxhdm91ciBtYXkgaGF2ZSBtb3JlIHRoYW4KICAgIG9u ZSBzbmlmZmVyLiAgVGhpcyBpcyB1c2VkIHRvIGUuZy4gZGlmZmVyZW50aWF0ZSBvbmUgT1Mn cyBhLm91dCBmcm9tCiAgICBhbm90aGVyLiAgVGhlIGZpcnN0IHNuaWZmZXIgdG8gcmV0dXJu IHNvbWV0aGluZyBvdGhlciB0aGFuCkBAIC04OSw0ICs5NiwxMCBAQCBjb25zdCBjaGFyICpv c2FiaV90cmlwbGV0X3JlZ2V4cCAoZW51bSBnZGJfb3NhYmkgb3NhYmkpOwogdm9pZCBnZW5l cmljX2VsZl9vc2FiaV9zbmlmZl9hYmlfdGFnX3NlY3Rpb25zIChiZmQgKiwgYXNlY3Rpb24g KiwKIAkJCQkJICAgICAgIGVudW0gZ2RiX29zYWJpICopOwogCisvKiBTZXQgb3NhYmkgdG8g TU9ERS9PU0FCSS4gICovCitleHRlcm4gdm9pZCBzZXRfb3NhYmkgKGVudW0gZ2RiX29zYWJp X21vZGUgbW9kZSwgZW51bSBnZGJfb3NhYmkgb3NhYmkpOworCisvKiBSZXR1cm4gY3VycmVu dCBvc2FiaSBzZXR0aW5nIGluIE1PREUvT1NBQkkuICAqLworZXh0ZXJuIHZvaWQgZ2V0X29z YWJpIChlbnVtIGdkYl9vc2FiaV9tb2RlICZtb2RlLCBlbnVtIGdkYl9vc2FiaSAmb3NhYmkp OworCiAjZW5kaWYgLyogT1NBQklfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3NlbGZ0ZXN0LWFy Y2guYyBiL2dkYi9zZWxmdGVzdC1hcmNoLmMKaW5kZXggZjQzNGRhNzE4ZDUuLmE0ZDlkZTVh NzRkIDEwMDY0NAotLS0gYS9nZGIvc2VsZnRlc3QtYXJjaC5jCisrKyBiL2dkYi9zZWxmdGVz dC1hcmNoLmMKQEAgLTY2LDEyICs2NiwyOCBAQCBmb3JlYWNoX2FyY2hfdGVzdF9nZW5lcmF0 b3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAogICAgICAgYXV0byB0ZXN0X2ZuCiAJPSAo Wz1dICgpCiAJICAgeworCSAgICAgLyogUHJldmVudCB3YXJuaW5ncyB3aGVuIHNldHRpbmcg YXJjaGl0ZWN0dXJlIHdpdGggY3VycmVudCBvc2FiaQorCQlzZXR0aW5ncywgbGlrZToKKwkJ ICBBIGhhbmRsZXIgZm9yIHRoZSBPUyBBQkkgIkdOVS9MaW51eCIgaXMgbm90IGJ1aWx0IGlu dG8gdGhpcworCQkgIGNvbmZpZ3VyYXRpb24gb2YgR0RCLiAgQXR0ZW1wdGluZyB0byBjb250 aW51ZSB3aXRoIHRoZQorCQkgIGRlZmF1bHQgYWFyY2g2NDppbHAzMiBzZXR0aW5ncy4gICov CisJICAgICBlbnVtIGdkYl9vc2FiaV9tb2RlIG1vZGU7CisJICAgICBlbnVtIGdkYl9vc2Fi aSBvc2FiaTsKKwkgICAgIGdldF9vc2FiaSAobW9kZSwgb3NhYmkpOworCisJICAgICBzZXRf b3NhYmkgKG9zYWJpX3VzZXIsIEdEQl9PU0FCSV9OT05FKTsKKwkgICAgIFNDT1BFX0VYSVQK KwkgICAgICAgeworCQkgcmVzZXQgKCk7CisJCSBzZXRfb3NhYmkgKG1vZGUsIG9zYWJpKTsK KwkgICAgICAgfTsKKwogCSAgICAgc3RydWN0IGdkYmFyY2hfaW5mbyBpbmZvOwogCSAgICAg aW5mby5iZmRfYXJjaF9pbmZvID0gYmZkX3NjYW5fYXJjaCAoYXJjaCk7CiAJICAgICBzdHJ1 Y3QgZ2RiYXJjaCAqZ2RiYXJjaCA9IGdkYmFyY2hfZmluZF9ieV9pbmZvIChpbmZvKTsKIAkg ICAgIFNFTEZfQ0hFQ0sgKGdkYmFyY2ggIT0gTlVMTCk7CisKIAkgICAgIGZ1bmN0aW9uIChn ZGJhcmNoKTsKLQkgICAgIHJlc2V0ICgpOwogCSAgIH0pOwogCiAgICAgICB0ZXN0cy5lbXBs YWNlX2JhY2sgKHN0cmluZ19wcmludGYgKCIlczo6JXMiLCBuYW1lLmNfc3RyICgpLCBhcmNo KSwK --------------MsbUAY075emqC8vHlqM0mbj0--