<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/96648>96648</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-tidy] llvmlibc-callee-namespace triggers an assertion
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang-tidy
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
VReichelt
</td>
</tr>
</table>
<pre>
When running `clang-tidy` with the check `llvmlibc-callee-namespace` enabled I run into an assertion with the following code snippet:
```
#include <gtest/gtest.h>
struct A
{
int operator() (int) const;
};
template<typename>
struct MyTest : public testing::Test {};
TYPED_TEST_SUITE_P(MyTest);
TYPED_TEST_P(MyTest, my)
{
EXPECT_TRUE(A()(0));
}
REGISTER_TYPED_TEST_SUITE_P(MyTest, my);
INSTANTIATE_TYPED_TEST_SUITE_P(MYTEST, MyTest, testing::Types<int>);
```
Assertion:
```
clang-tidy: /tmp/LLVM/llvm-project/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp:178: clang::DiagnosticBuilder clang::tidy::ClangTidyContext::diag(llvm::StringRef, clang::SourceLocation, llvm::StringRef, clang::DiagnosticIDs::Level): Assertion `Loc.isValid()' failed.
```
Apparently, the reason for the crash is that clang-tidy creates invalid source locations (the assertion 'Loc.isValid()' fails and the stack trace shows '<invalid sloc>'). Unfortunately, this is not visible if I put everything into a single file.
Therefore, the test case is not completely self-contained. It requires googletest version 1.14.0 to be installed
which can be downloaded from [GitHub](https://github.com/google/googletest/archive/refs/tags/v1.14.0.tar.gz). It just needs to be unpacked but not built.
For easier usage I'm adding a tar archive with all the needed bits, just unpack it and run
`clang-tidy -checks=-*,llvmlibc-callee-namespace CTbug.cc -- -I googletest-1.14.0/googletest/include`
inside the 'BUG' directory: [BUG.tar.gz](https://github.com/user-attachments/files/15973283/BUG.tar.gz)
Stack dump:
```
0. Program arguments: /LLVM/LLVM-trunk/bin/clang-tidy -checks=-*,llvmlibc-callee-namespace CTbug.cc -- -I googletest-1.14.0/googletest/include
1. <eof> parser at end of file
2. ASTMatcher: Processing 'llvmlibc-callee-namespace' against:
DeclRefExpr : <<invalid sloc>, BUG/CTbug.cc:15:3 <Spelling=col:20>>
--- Bound Nodes Begin ---
func - { CXXMethodDecl A::operator() : <BUG/CTbug.cc:5:3, col:24> }
use-site - { DeclRefExpr : <<invalid sloc>, BUG/CTbug.cc:15:3 <Spelling=col:20>> }
--- Bound Nodes End ---
#0 0x00000000045778e8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/LLVM/LLVM-trunk/bin/clang-tidy+0x45778e8)
#1 0x000000000457500c SignalHandler(int) Signals.cpp:0:0
#2 0x00007fc8d5890ce0 __restore_rt (/lib64/libpthread.so.0+0x12ce0)
#3 0x00007fc8d430fa9f raise (/lib64/libc.so.6+0x4ea9f)
#4 0x00007fc8d42e2e05 abort (/lib64/libc.so.6+0x21e05)
#5 0x00007fc8d42e2cd9 _nl_load_domain.cold.0 (/lib64/libc.so.6+0x21cd9)
#6 0x00007fc8d43083f6 (/lib64/libc.so.6+0x473f6)
#7 0x0000000001804686 clang::tidy::ClangTidyContext::diag(llvm::StringRef, clang::SourceLocation, llvm::StringRef, clang::DiagnosticIDs::Level) (/LLVM/LLVM-trunk/bin/clang-tidy+0x1804686)
#8 0x00000000017fc3be clang::tidy::ClangTidyCheck::diag(clang::SourceLocation, llvm::StringRef, clang::DiagnosticIDs::Level) (/LLVM/LLVM-trunk/bin/clang-tidy+0x17fc3be)
#9 0x0000000000dd4e92 clang::tidy::llvm_libc::CalleeNamespaceCheck::check(clang::ast_matchers::MatchFinder::MatchResult const&) (/LLVM/LLVM-trunk/bin/clang-tidy+0xdd4e92)
#10 0x0000000003196219 clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor::MatchVisitor::visitMatch(clang::ast_matchers::BoundNodes const&) ASTMatchFinder.cpp:0:0
#11 0x00000000031db647 clang::ast_matchers::internal::BoundNodesTreeBuilder::visitMatches(clang::ast_matchers::internal::BoundNodesTreeBuilder::Visitor*) (/LLVM/LLVM-trunk/bin/clang-tidy+0x31db647)
#12 0x000000000319874c clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor::matchWithFilter(clang::DynTypedNode const&) ASTMatchFinder.cpp:0:0
#13 0x00000000031c0561 clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor::TraverseStmt(clang::Stmt*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) ASTMatchFinder.cpp:0:0
#14 0x00000000031c304e clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseImplicitCastExpr(clang::ImplicitCastExpr*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) ASTMatchFinder.cpp:0:0
#15 0x00000000031bf0b9 clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::dataTraverseNode(clang::Stmt*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) ASTMatchFinder.cpp:0:0
#16 0x00000000031c03e0 clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseStmt(clang::Stmt*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) ASTMatchFinder.cpp:0:0
#17 0x00000000031c67a9 clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor::TraverseStmt(clang::Stmt*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (.constprop.9939) ASTMatchFinder.cpp:0:0
#18 0x00000000031cfb35 clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseVarDecl(clang::VarDecl*) ASTMatchFinder.cpp:0:0
#19 0x00000000031bb1cb clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseDecl(clang::Decl*) ASTMatchFinder.cpp:0:0
#20 0x00000000031bbd09 clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor::TraverseDecl(clang::Decl*) ASTMatchFinder.cpp:0:0
#21 0x00000000031bde8b clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::dataTraverseNode(clang::Stmt*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) ASTMatchFinder.cpp:0:0
#22 0x00000000031c03e0 clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseStmt(clang::Stmt*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) ASTMatchFinder.cpp:0:0
#23 0x00000000031c67a9 clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor::TraverseStmt(clang::Stmt*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (.constprop.9939) ASTMatchFinder.cpp:0:0
#24 0x00000000031d0469 clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseFunctionHelper(clang::FunctionDecl*) ASTMatchFinder.cpp:0:0
#25 0x00000000031d0635 clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseCXXMethodDecl(clang::CXXMethodDecl*) ASTMatchFinder.cpp:0:0
#26 0x00000000031bb21c clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseDecl(clang::Decl*) ASTMatchFinder.cpp:0:0
#27 0x00000000031bbd09 clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor::TraverseDecl(clang::Decl*) ASTMatchFinder.cpp:0:0
#28 0x00000000031bc74a clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseDeclContextHelper(clang::DeclContext*) (.part.9771) ASTMatchFinder.cpp:0:0
#29 0x00000000031bb39f clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseDecl(clang::Decl*) ASTMatchFinder.cpp:0:0
#30 0x00000000031bbd09 clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor::TraverseDecl(clang::Decl*) ASTMatchFinder.cpp:0:0
#31 0x00000000031bce83 clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseTemplateInstantiations(clang::ClassTemplateDecl*) ASTMatchFinder.cpp:0:0
#32 0x00000000031bba08 clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseDecl(clang::Decl*) ASTMatchFinder.cpp:0:0
#33 0x00000000031bbd09 clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor::TraverseDecl(clang::Decl*) ASTMatchFinder.cpp:0:0
#34 0x00000000031bc74a clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseDeclContextHelper(clang::DeclContext*) (.part.9771) ASTMatchFinder.cpp:0:0
#35 0x00000000031ce1ce clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseNamespaceDecl(clang::NamespaceDecl*) ASTMatchFinder.cpp:0:0
#36 0x00000000031bb62f clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseDecl(clang::Decl*) ASTMatchFinder.cpp:0:0
#37 0x00000000031bbd09 clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor::TraverseDecl(clang::Decl*) ASTMatchFinder.cpp:0:0
#38 0x00000000031bc74a clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseDeclContextHelper(clang::DeclContext*) (.part.9771) ASTMatchFinder.cpp:0:0
#39 0x00000000031cef05 clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseTranslationUnitDecl(clang::TranslationUnitDecl*) ASTMatchFinder.cpp:0:0
#40 0x00000000031bb733 clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseDecl(clang::Decl*) ASTMatchFinder.cpp:0:0
#41 0x00000000031bbd09 clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor::TraverseDecl(clang::Decl*) ASTMatchFinder.cpp:0:0
#42 0x00000000031bc001 clang::ast_matchers::MatchFinder::matchAST(clang::ASTContext&) (/LLVM/LLVM-trunk/bin/clang-tidy+0x31bc001)
#43 0x00000000020478b8 clang::MultiplexConsumer::HandleTranslationUnit(clang::ASTContext&) (/LLVM/LLVM-trunk/bin/clang-tidy+0x20478b8)
#44 0x000000000229e37c clang::ParseAST(clang::Sema&, bool, bool) (/LLVM/LLVM-trunk/bin/clang-tidy+0x229e37c)
#45 0x0000000002011b69 clang::FrontendAction::Execute() (/LLVM/LLVM-trunk/bin/clang-tidy+0x2011b69)
#46 0x0000000001f9a909 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/LLVM/LLVM-trunk/bin/clang-tidy+0x1f9a909)
#47 0x0000000001841409 clang::tooling::FrontendActionFactory::runInvocation(std::shared_ptr<clang::CompilerInvocation>, clang::FileManager*, std::shared_ptr<clang::PCHContainerOperations>, clang::DiagnosticConsumer*) (/LLVM/LLVM-trunk/bin/clang-tidy+0x1841409)
#48 0x00000000017ef28e clang::tidy::runClangTidy(clang::tidy::ClangTidyContext&, clang::tooling::CompilationDatabase const&, llvm::ArrayRef<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, llvm::IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem>, bool, bool, llvm::StringRef)::ActionFactory::runInvocation(std::shared_ptr<clang::CompilerInvocation>, clang::FileManager*, std::shared_ptr<clang::PCHContainerOperations>, clang::DiagnosticConsumer*) ClangTidy.cpp:0:0
#49 0x000000000183c1ab clang::tooling::ToolInvocation::run() (/LLVM/LLVM-trunk/bin/clang-tidy+0x183c1ab)
#50 0x000000000183ecbd clang::tooling::ClangTool::run(clang::tooling::ToolAction*) (/LLVM/LLVM-trunk/bin/clang-tidy+0x183ecbd)
#51 0x00000000017fb3f9 clang::tidy::runClangTidy(clang::tidy::ClangTidyContext&, clang::tooling::CompilationDatabase const&, llvm::ArrayRef<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, llvm::IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem>, bool, bool, llvm::StringRef) (/LLVM/LLVM-trunk/bin/clang-tidy+0x17fb3f9)
#52 0x0000000000ab3cc2 clang::tidy::clangTidyMain(int, char const**) (/LLVM/LLVM-trunk/bin/clang-tidy+0xab3cc2)
#53 0x00007fc8d42fbcf3 __libc_start_main (/lib64/libc.so.6+0x3acf3)
#54 0x0000000000aa998e _start (/LLVM/LLVM-trunk/bin/clang-tidy+0xaa998e)
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsXF9z4rqS_zTOiwrKlgDjhzwQAudQNTM3lTBzz32iZLkNuiMkryRnwn76LckGbJNkkszmLnM2p-bwR7a7f7_uVnfbSKHG8LUEuAyGV8Hw-oKWdqP05bdb4GwDwl6kKttd_nMDEulSSi7XKBiFTFC57lme7YJRiH5wu0F2A4htgH13x4W43wqesh6jQgD0JN2CKSgDdzpImgrI0MJJRFxahahE1BjQlit5FJcrIdQPp5KpDJCRvCjABmQShNdBuH8dhfW_6ismXDJRZoACMl1bMDbAc__e3wRk1rzUWF0yi_aC4qvqA3KYkCpAU6t0gMcBTlCAx1xa94kpaWxArvZXXR8_-1cL20JQCwGZ2l0BjvpBb63x824JxqKATFBRpoIz5PBxuXbcyKQ6GF-dyl7-62Z2vVrO7paru6-L5Wx1E-BxJS3AydMnN0-bou3OndwhPfvrZjZdrpa3X2cBHk8q2gEeh_4taRFuKLmd_bG4W85uV89C2-tsA1x8uVtOviwXk-Xsicv_5Qbc5UdBbUvtCjABmTrXkFlLQycs_OtkH2PPx1AjuskEBXhut0WA558-ffsc4LmL7V6h1b-BudCqT1ZKmB48WE2PY04Ank_dlyXPdtecrqUylrOpkqbcgu6zogjIJIrHTpG_quJ1PPWq5CID3TxYAwvI5CB6qqSFB1uNZpyuAzx2OKuBO6u5XN9C7uzXEHSnSs3gk2LU2wRP0c-vOSJbXJtq6BPcg_C2n6CDhV0W-KRYn5tvVPBsH04xyikXkPWf81JRUA3Sip339waQBmqURLnSVZrR1GwQN8huqEVHYyOmgVowiMt7pxQZTxCJmqFxs9gJOOaaAMdPojSIyswrNJay78hqygCZjfrhBMU-7Go9QjEff3GAkz76KnOlbSmphT0HbhxeqSy654anAhDP0QIVpUVwD3pnNy7NVbkQGS7XAlDOBfRbE3oDGnKlYW8XNxcQowb2wpnaFgKcWmRA5D2mpKVcQtZHC4s0_FfJNRi0VmrtTjMW3YM2zhBRPxr0Q2QVSgFxaaxL3Fml98eGsw1iVLpjmfohhaIZZCjXaouC4dUf3P5ZpsHwOsDjjbWFjws8d3mX202Z9pnaui9e6-FDnZqpZht-74Y15MZNNrp2b_cVor6lur_-b2_XhUX_Lo1FEiAzNdRSFpR9hwylpfUmSEsubMtsc6URUMNBo9LQNaBFgOMtolnmbE6RpRrVKKraQ4Xw5nV6nGRujbO4113pQ9z64NClPARyIw57vhCagFz3AjwJ8PTJeoimy7Rc9xlDvR7qLRqe6VX8u-aqi9thynBpeAYeboDjq69_uOjNuAZmla7y1_Dq6usfezv-zEmlAd2j1lK22YJ0xOcuDt17NExigsckwPOGwEMl8a93fqZk5bY4ptj2HA_7QZjcaLXWdIuoXpeVmirR1inWvfWsLuX3AM9TLlsp9T9hXY80ckgDMgWVB2SGCqoNaEQtApkhlfv5WZ2J3ZmTu-VnatkGtCNzoxUDY3y_hOOn-yEcI7qm3LcUh5qUXAMTt5DPHgrtu4SATB9LN1PkHT7f03S1ZBiQCXEX3BUghK-U10yJgExw6C7atyK9Xg9dqVJm6IvKwKArWHOJer3evglCKC8lQz3XiaDpX399BrtRmUOGJlXi77ZIFdATSB6RLyMVjIGz5qGNcIpKAz3DLdTK3pX9UXPXAjOZNfgHmIQofAj3_w2GcTyGcaNEml1dAG80l9ZH_lJ7nzZqr6Y_VspYDXQb4JEDXbeR3mgvCvgAX4UPtfrDdHP4og6-YRgydMfXkoo_qcwE6GPXWg2buuMI_f8HQbgWFOdsnA3HScggRKuVBmOVhpW2NVrB09Ggei_sRgPN-ka5WXQVPkSYQdiCR5pSByTMaZIjTbmBU3HMCRpVTIEmeUvQoCUIA4ZwiGiqHsPVEIQjCIctQcOuIJYlaCXFyhW0Vaa2lMs-UyLrhz-RzLKkJXnU4Tom-eh5ljHJRy0RcdOb0TgcjMaj36Hte20k19Ra3Mct7nHOSAo_4-6KQIv5GVGsGLQoJk2KYZYNIMGPU3RQVy5aasa-ZHzZV4wGb18H28SpsattVYVqDr4mzbnMfF3aD9yCKYWt72VdXno1x4rBsfxjErXyJYmSEY4S9Cw4Li1oSUX1LcBjKpXcbVVpUKNEJg3gk7vlN264qzrHwdaIa7CtH_6ZaXzyr3J_0xD7Ql4Z7TRjOqpRm2qWjgbxa6geVS81QH2T18Xvuq7nGbxY6N5Crl96tatrfi1f446vx_GAvbevvbx_cruZc2F9cWtO351c7grw_F_tTtJmw8LhKHpvNktN3c0X3Nmt7WQvPzLppK0tFeKbb-sX20IEZHo8dqM8nIW0N5TrgEwfFxaV7jVVSrRF15d_4t_BmXCpqbvjeVRK1Xc9pXkhc_UT7W_VevhXRfBLnDroOJWEg1ZRuQVWasPvoemZ6Tt6fdZ2vHMjZ9xOqbGu120HwenRj4D4xYAYtgMizcM0OYeAyKil-6Bw6esjG7yD80fdFE8gPAfnf5SBd3Z83HH8KKbv3pV-OPUXnBrgcd83cIVWRT9JSPJSV487rs5TMjynOf6N6mtgoh0Rh8EXR3TSqWNpxNJzonnK8XUEcdglmIX_sSn7y-A7t4ZpBuOz8M5Hl_H-xQbjjy7j_6fju08QPrqMM3fqm7sM3HmukIWD0VncRu7DYV5KZrmSf4Iouk_J9sdeWdOGXcqj82qsWj9Pthl3Dr2Y8qjbg-CInRPlX-5T4t-5yep0-imLB_TcvFP_OvfYNGwcbqSjgmrbT-I4eqkVTm4ESJKfmxV-xc3kd74RIN0bAQZjck7eWdYLVRfSWCotr9bIdbKnoMbsT3wlf9x1Hg3H58T_lx1MfufoHHxkUExIp7FhELGz-o3o8LP_qb87h17s-JPGZoT_XkXjd25syEdj46yQdKdlHp7V_cZSU2mEL5hfJbenXn_0hJcGweCk7YnJWXUOvxrlg25r9DtN0UG3r2Fh-JPFIidrsLY1wDaOyd3yMHfesiSrxtJcpzNo9Sg4HMTjtNWEfS6F5YWAh_2elGq4Wj_aieL_XbQ1mBbaVlOCcQIkbt1031Bt4MRud7Cl9eLa_aOp6v31mCqVLUzDtgWjKG0_7plrZwWZTdh-ZxGZzB6AlRaOe8deZxivowWiVbSjPKFJe8JM1bbgAnTVyzNowaiRtR8EtVG_yYM1jhbQzirWQTRoA7VKCf44iDnd71kIyESXciHvDws4x8Zm1QGzoRqyVWE7Ke9ogcNV1aPGJmku4DOVdA375TQ_FXsz_XNab6LR__Dr3f1N0ono081db1trV5usZdPO6ljI8fiJ1bG6lIcFsm1_P7N6uJo5T_mosqunfU0tTalpLq9rPo6daE13t5AHZHow62rFHh6iqPqSUsPZyvj1t87KG6pbPnADK3t4iusOV3Y-nEGF38tVlbv6eP1Qt4lkIa0uXX28hXwq7Y136vHwfV7n5X_cgxZ058LibmcsbGtJ7SzyxOLhutb8nWP3ECqPF8KkPdcJi2j6ZBwtlRJNfrWh3pYia2XNWTIMO2iApdnTUe2ZKSWaQJ6Dvs-Tb5vTHkwLbdRZ8Z6SPPmY0__nc_oNK_2d51qubfWHIU0JY0-s9Gd7t32mTni1V2eKnBX2_pi8LeQqrS1Y7e04OE9ZTtDKbzRYGUu1a1q5fHbTCqEsJy2hgzZXmiRjQJW4V0P2Fx-l77cNXmSXJEtIQi_gMoqjhOAYh4OLzeVwPBpGWZqycMiGIaTRcJSxUU4yNhqkozi_4Jc4xINwhIfRYEjwoB-TMEpIPBqORnGUsiwYhLClXPRdMPSVXl9wY0q4TEajwfhC0BSE8X8YAeMmWBwMry_0pd8InpZrEwxCwY01RzGWW-H_pELjsuE1enqjotV8vQZtWn8J4aLU4vKZvZo-hE82pHsKJsDzisX9Jf6fAAAA___9tC2o">