<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/66934>66934</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
clang crash with HWASan after D159172
</td>
</tr>
<tr>
<th>Labels</th>
<td>
compiler-rt:hwasan
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
thurstond
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
thurstond
</td>
</tr>
</table>
<pre>
N.B. I think I have a fix/workaround for this. This bug report is largely for recordkeeping, instead of dumping all the details in the git commit message.
# Reproducer
clang tip-of-tree (9/20/23) crashes with:
```
/my/path/to/clang \
--target=aarch64-linux-gnu \
-flto=thin \
-fsanitize=hwaddress \
-O1 \
-c crash.c \
-o /tmp/crash.o
```
```
void a();
void b(char *c, char e) {
int d;
while (e) {
if (c[d]) {
while (1) {
}
}
d++;
}
}
void f() {
char g[1];
a(g);
}
```
## Backtrace
```
clang: /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Analysis/ScalarEvolution.cpp:6392: llvm::ConstantRange llvm::ScalarEvolution::getRangeForUnknownRecurrence(const llvm::SCEVUnknown *): Assertion `L && L->getHeader() == P->getParent()' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0. Program arguments: /usr/local/google/home/thurston/llvm-projectC/build/bin/clang --target=aarch64-linux-gnu -flto=thin -fsanitize=hwaddress -O1 -c comp-interesting2-preproc.c -o /tmp/comp-interesting2-preproc.bc
1. <eof> parser at end of file
2. Optimizer
#0 0x00005557a6d1413d llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Support/Unix/Signals.inc:723:11
#1 0x00005557a6d1462b PrintStackTraceSignalHandler(void*) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Support/Unix/Signals.inc:798:1
#2 0x00005557a6d12656 llvm::sys::RunSignalHandlers() /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Support/Signals.cpp:105:5
#3 0x00005557a6d139ae llvm::sys::CleanupOnSignal(unsigned long) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Support/Unix/Signals.inc:368:1
#4 0x00005557a6c3c364 (anonymous namespace)::CrashRecoveryContextImpl::HandleCrash(int, unsigned long) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Support/CrashRecoveryContext.cpp:0:7
#5 0x00005557a6c3c722 CrashRecoverySignalHandler(int) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Support/CrashRecoveryContext.cpp:391:1
#6 0x00007f628b25a540 (/lib/x86_64-linux-gnu/libc.so.6+0x3c540)
#7 0x00007f628b2a812c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#8 0x00007f628b25a4a2 raise ./signal/../sysdeps/posix/raise.c:27:6
#9 0x00007f628b2444b2 abort ./stdlib/abort.c:81:7
#10 0x00007f628b2443d5 _nl_load_domain ./intl/loadmsgcat.c:1177:9
#11 0x00007f628b2533a2 (/lib/x86_64-linux-gnu/libc.so.6+0x353a2)
#12 0x00005557a5878d8c llvm::ScalarEvolution::getRangeForUnknownRecurrence(llvm::SCEVUnknown const*) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Analysis/ScalarEvolution.cpp:6393:8
#13 0x00005557a587b216 llvm::ScalarEvolution::getRangeRef(llvm::SCEV const*, llvm::ScalarEvolution::RangeSignHint, unsigned int) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Analysis/ScalarEvolution.cpp:6794:45
#14 0x00005557a58b76e3 llvm::ScalarEvolution::getSignedRangeMin(llvm::SCEV const*) /usr/local/google/home/thurston/llvm-projectC/llvm/include/llvm/Analysis/ScalarEvolution.h:996:12
#15 0x00005557a586b961 llvm::ScalarEvolution::isKnownNonNegative(llvm::SCEV const*) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Analysis/ScalarEvolution.cpp:10723:32
#16 0x00005557a586f59d llvm::ScalarEvolution::getGEPExpr(llvm::GEPOperator*, llvm::SmallVectorImpl<llvm::SCEV const*> const&) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Analysis/ScalarEvolution.cpp:3806:55
#17 0x00005557a58780c3 llvm::ScalarEvolution::createNodeForGEP(llvm::GEPOperator*) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Analysis/ScalarEvolution.cpp:6229:10
#18 0x00005557a58808f4 llvm::ScalarEvolution::createSCEV(llvm::Value*) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Analysis/ScalarEvolution.cpp:8016:5
#19 0x00005557a587285f llvm::ScalarEvolution::createSCEVIter(llvm::Value*) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Analysis/ScalarEvolution.cpp:7397:19
#20 0x00005557a586cd06 llvm::ScalarEvolution::getSCEV(llvm::Value*) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Analysis/ScalarEvolution.cpp:4518:15
#21 0x00005557a5919e2d (anonymous namespace)::StackSafetyLocalAnalysis::offsetFrom(llvm::Value*, llvm::Value*) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Analysis/StackSafetyAnalysis.cpp:276:55
#22 0x00005557a5917a20 (anonymous namespace)::StackSafetyLocalAnalysis::analyzeAllUses(llvm::Value*, (anonymous namespace)::UseInfo<llvm::GlobalValue>&, llvm::StackLifetime const&) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Analysis/StackSafetyAnalysis.cpp:517:13
#23 0x00005557a5912bd1 (anonymous namespace)::StackSafetyLocalAnalysis::run() /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Analysis/StackSafetyAnalysis.cpp:550:3
#24 0x00005557a59126bf llvm::StackSafetyInfo::getInfo() const /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Analysis/StackSafetyAnalysis.cpp:876:32
#25 0x00005557a59132d1 llvm::StackSafetyGlobalInfo::getInfo() const /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Analysis/StackSafetyAnalysis.cpp:891:29
#26 0x00005557a5914d29 llvm::StackSafetyGlobalInfo::isSafe(llvm::AllocaInst const&) const /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Analysis/StackSafetyAnalysis.cpp:977:15
#27 0x00005557a6e67421 llvm::memtag::StackInfoBuilder::isInterestingAlloca(llvm::AllocaInst const&) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Transforms/Utils/MemoryTaggingSupport.cpp:172:24
#28 0x00005557a6e670a7 llvm::memtag::StackInfoBuilder::visit(llvm::Instruction&) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Transforms/Utils/MemoryTaggingSupport.cpp:119:9
#29 0x00005557a8e98631 (anonymous namespace)::HWAddressSanitizer::sanitizeFunction(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp:0:11
#30 0x00005557a8e98162 llvm::HWAddressSanitizerPass::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp:433:20
#31 0x00005557a70d64a7 llvm::detail::PassModel<llvm::Module, llvm::HWAddressSanitizerPass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /usr/local/google/home/thurston/llvm-projectC/llvm/include/llvm/IR/PassManagerInternal.h:89:17
#32 0x00005557a64937ea llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /usr/local/google/home/thurston/llvm-projectC/llvm/include/llvm/IR/PassManager.h:521:7
#33 0x00005557a70c06f1 (anonymous namespace)::EmitAssemblyHelper::RunOptimizationPipeline(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>&, std::unique_ptr<llvm::ToolOutputFile, std::default_delete<llvm::ToolOutputFile>>&) /usr/local/google/home/thurston/llvm-projectC/clang/lib/CodeGen/BackendUtil.cpp:1109:5
#34 0x00005557a70ba5b5 (anonymous namespace)::EmitAssemblyHelper::EmitAssembly(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>) /usr/local/google/home/thurston/llvm-projectC/clang/lib/CodeGen/BackendUtil.cpp:1173:3
#35 0x00005557a70b9a77 clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>) /usr/local/google/home/thurston/llvm-projectC/clang/lib/CodeGen/BackendUtil.cpp:1336:3
#36 0x00005557a88c4ce4 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) /usr/local/google/home/thurston/llvm-projectC/clang/lib/CodeGen/CodeGenAction.cpp:386:7
#37 0x00005557aae23a23 clang::ParseAST(clang::Sema&, bool, bool) /usr/local/google/home/thurston/llvm-projectC/clang/lib/Parse/ParseAST.cpp:183:12
#38 0x00005557a7d88a01 clang::ASTFrontendAction::ExecuteAction() /usr/local/google/home/thurston/llvm-projectC/clang/lib/Frontend/FrontendAction.cpp:1186:1
#39 0x00005557a88bfe36 clang::CodeGenAction::ExecuteAction() /usr/local/google/home/thurston/llvm-projectC/clang/lib/CodeGen/CodeGenAction.cpp:1208:5
#40 0x00005557a7d883fc clang::FrontendAction::Execute() /usr/local/google/home/thurston/llvm-projectC/clang/lib/Frontend/FrontendAction.cpp:1074:7
#41 0x00005557a7ca6f28 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /usr/local/google/home/thurston/llvm-projectC/clang/lib/Frontend/CompilerInstance.cpp:1054:23
#42 0x00005557a7f52f78 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /usr/local/google/home/thurston/llvm-projectC/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:272:8
#43 0x00005557a31e010f cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /usr/local/google/home/thurston/llvm-projectC/clang/tools/driver/cc1_main.cpp:286:13
#44 0x00005557a31cfcaa ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) /usr/local/google/home/thurston/llvm-projectC/clang/tools/driver/driver.cpp:366:5
#45 0x00005557a31d161d clang_main(int, char**, llvm::ToolContext const&)::$_0::operator()(llvm::SmallVectorImpl<char const*>&) const /usr/local/google/home/thurston/llvm-projectC/clang/tools/driver/driver.cpp:506:7
#46 0x00005557a31d15ed int llvm::function_ref<int (llvm::SmallVectorImpl<char const*>&)>::callback_fn<clang_main(int, char**, llvm::ToolContext const&)::$_0>(long, llvm::SmallVectorImpl<char const*>&) /usr/local/google/home/thurston/llvm-projectC/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:5
#47 0x00005557a7b46dd9 llvm::function_ref<int (llvm::SmallVectorImpl<char const*>&)>::operator()(llvm::SmallVectorImpl<char const*>&) const /usr/local/google/home/thurston/llvm-projectC/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:5
#48 0x00005557a7b43558 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::$_1::operator()() const /usr/local/google/home/thurston/llvm-projectC/clang/lib/Driver/Job.cpp:440:34
#49 0x00005557a7b43525 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::$_1>(long) /usr/local/google/home/thurston/llvm-projectC/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:5
#50 0x00005557a59b5b89 llvm::function_ref<void ()>::operator()() const /usr/local/google/home/thurston/llvm-projectC/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:5
#51 0x00005557a6c3c17a llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) /usr/local/google/home/thurston/llvm-projectC/llvm/lib/Support/CrashRecoveryContext.cpp:427:3
#52 0x00005557a7b42e77 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const /usr/local/google/home/thurston/llvm-projectC/clang/lib/Driver/Job.cpp:440:7
#53 0x00005557a7adfe3f clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const /usr/local/google/home/thurston/llvm-projectC/clang/lib/Driver/Compilation.cpp:199:15
#54 0x00005557a7ae0047 clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const /usr/local/google/home/thurston/llvm-projectC/clang/lib/Driver/Compilation.cpp:253:13
#55 0x00005557a7afac32 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) /usr/local/google/home/thurston/llvm-projectC/clang/lib/Driver/Driver.cpp:1883:7
#56 0x00005557a31cf768 clang_main(int, char**, llvm::ToolContext const&) /usr/local/google/home/thurston/llvm-projectC/clang/tools/driver/driver.cpp:542:9
#57 0x00005557a3204d2d main /usr/local/google/home/thurston/llvm-projectC/build/tools/clang/tools/driver/clang-driver.cpp:15:3
#58 0x00007f628b2456ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#59 0x00007f628b245785 call_init ./csu/../csu/libc-start.c:128:20
#60 0x00007f628b245785 __libc_start_main ./csu/../csu/libc-start.c:347:5
#61 0x00005557a31ce401 _start (/usr/local/google/home/thurston/llvm-projectC/build/bin/clang+0x1d46401)
clang: error: clang frontend command failed with exit code 134 (use -v to see invocation)
clang version 18.0.0 (https://github.com/llvm/llvm-project.git 903a7e487b4b3ee0f52f5675a5fc4ca188c1a3c0)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/google/home/thurston/llvm-projectC/build/bin
clang: note: diagnostic msg:
********************
```
# Theory
This first started happening after "[HWASAN] Inline fast pass of instrumentMemAccessOutline" (https://reviews.llvm.org/D159172) landed. Some of the blocks end up being split by insertShadowTagCheck, which results in some cached analyses becoming invalid. Per the backtrace above, HWASan relies on a global stack safety analysis, which may use some stale analysis results, leading to the crash.
# Tentative fix
The tentative fix (pull request coming very soon) is to invalidate the DominatorTreeAnalysis after each function is sanitized.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsXFtzo7qy_jXMiyouEPeHPDhOvGbWmUtqkln70SVEY-sEEFsSuaxff0oCDCJxkpnxZE2dvatSsQ2i6e_rVktqXYiUbFsDnDrhmYOx2rVCKl7nDsZOeP6OtGrHxen-8ruM5w-nnxdnC_QBqR2rb9AHtCO3gAgq2L2D13dc3BDB2zpHBRe6jFyg6x2TKGu3SEDDhUJMopKILZQPppAAykV-A9CweuvgFWK1VEByxAuUt5W-ikhZIrUDlIMirJSI1ebnlilEeVUxhSqQkmxh4bjnjrvs_2MffYVG8LylIKZ3aEnqLVKsOeHFiRIAyMFJ6uA1dvU_38EpooLIHUh0x9TO8QeRkdv_9W9YVw8OXjdE7Ry8VtzB6062E666IgghdHKiNGDl-OeECLqLgpOS1e39ybZuJyVPilJxxz_X1M4EFJLUTLG_wfHPd3ckzwVIOSvzxZtdoB2GBZ1d50jrWjVaWVOAPw3O_nnLWY6IgxMHp45_NqXT3MocnNAdEcjBS6rtaH6AptKJz4bXs1qhfP84Qnc7Vhr25wURYoW-Tp3wLHfCc_v2_jHv0WMIOfH5-HP_Y7yUO_hM_41ajIXs0gZY0WGevsVA2zrhmac1s8lAhqStxdJe6ozhwU21p54ReqMEoYCsm_YTxrkcf6kt2Erh4HXJKSkdvN5yvi3Bwesdr_THUGt1kfK2OmkE_1-gatX_1h8sc_B6WZPyQTLp4PUVJSURF7e8bBXj9YI2jeMvIz_F-o3mKX_p-MsVr6UitfpK6i1Mrs-e7y5uoSu35uJbfVPzu_or0FYIqClo82pZUxmri7_6ctqRDItLtJQShJaJnMj9iBwcOThCH08c_2IL6j2QHMRgJf_c8c_RZX_vkgioVe-1OEYFYSXkfZi4_HixvLpAss10CCHTIKU42inVSK0VXmt-mdq12YLyasLghFgHr5mULWgiEalzxGpatjmYQGWqGcoGC-va0QgdmShICTmSvBXdZf0kkZJTRhTkSLQ1klSwRvUqXylCb0xc3Mckd4EuBd8KUiEitm0FtZI_6yJZy8pcf7J6H9KejWJW7DoQrnSE0kGJV80JqxUIkIrVW3zSc7Ggdmw6WC6jHXJvgRx_Bbxw_AvUECFBIKIQ1KbxKFgJXTm86ALDl0axiv09tAXIwb6L3HvXdd0wDGMS5V7g-fnEHeWD7L5cClYrQ_51Z8FkLCTI3YZLJYBUxjN1E6aMLx6rkl61jfZKB6-_1aahvWLbmpRywWrq-MsY-46_9LwRljeHFeEMzTB0Mt6TOi9N7dHBrqtyb6d4mmjFR73xTG8chdFT5vja1pb6cqj9x1d80LiLhp4bOv4yHDX2Zxr7KYGnNF6VQOq2-dLr7eCkrU3vK0cl1x2ft2Pdj2asBxYG6lM_CnTjSmpeP1S8lagmFcjGOH7a49Eh7StQfgviYcVrBffqQ9WU3d3OLKaMgxNTHVboLQA_pVZvOlc73Ag6nIOOMUbW4_MK8utq9TNa-6lnGyvq9Y6LCCcZDkkYuMi4fy_2Pok209jc3aALyReRg8_ce5-GgasNuZcZ2zJJ4mGKNptG7QSQfHPDynLDqqYE3bgQ0xAvHLyuG6XxT4sttIMFgaY6GuUnc50DgpEgTIKRI_sqsV6YXw8yh0a3ow2Xxn1NSSMZx7pHMgpObcFBEGQYkUy34EaUyjtOzCUjIfFGN9CB0p1L8PMQbepyU3KSb3JeEdaBZbUBqy9XcktJJ87zYq1SOgr0Zlh9n-DvtE_oE7y3j5ZphcUwiZM8oT_Z8Xq6y2W6Y8duBF7TxdQNWDIC9meAM-xFrwX8FYpH-CbAVi_JMUJ03X8_j1vHDgAvExOnuioF4chMYDOTxRH4r2DmyiAw0D7pPt1hfo6Cr-_8jheegapH12ka6cqER5yhjTPK0sh7CSeT_6O9-DOvP8OWKHb72NH_IQ_33K6P5k8QRjOERZjmr7DkHxeXF_eNsJD9cXH5pQFBFBePfbwiZfkXUMVF1z6vDjHiXwzfo7dlx09cbf5w4ubxPOK59EU3pwKIgs881zHvj4vLZyl602qMTa_Jc0d8iY0vcZMieB0-bTML2V-kbOHNMSWuF409YQ0pnZkMJ2HxekgfFIjfAFbsp7o998bGF7uzekpz9zVt0W9ipyD0TG9_NBS2Bodh6qWA85e6-2bYeEUKUA8ftcr795q7vCgkqLXg1QHE04D0y3kYVR2u9lzgeBZmMJ5RERPs_hwVRP_6G5Zl-U2CPEjHC-_4JuFDXXArWP9R8oyUnRD_os80TPxQq_WRFaBYBb8-kB8kOfRMBfJHkv0ZyTjLvZ8jWbT1sQf8r8MW6kHkBFowhxZlxdwmnaTOnH1sMD86AF0C9G1hJKYeTPoiOJzh8HHuPY2j88LfCo0ZIU-GSziaoQlynL4ODZP6ulVrl6VG8UHjmlaqfwJpasaa01BudZMiiOIAT-1WQaXIdoJaIz1rWZmDGAB_GDOsHdTXoD8a7mtBallwUWnk3xQr9ecnqLh4uCbbLau3fZZk6EjHWBs7GClI5hS4JP4uCm6ZZMoCreGKlprm_J_G66VWegFbvawE0iTyXwym7_-17FLwV31avkc-ZOnXbd2DnZAwXpw1NINTfiI12WpRqyce6huoX8VcZ6F9NsrB68cYJ2m_ITXuYN_O-GsCvQhP0D2Wc0mk1eyMZT_xvNVQvoOg_pHfh57A1-NSPA5N7LmD2M2jwKpQ3Rx8PytCpPzEcyifwmhxcoBWq8ylAAniFvKOQJA_Qqv--31t9Sgv8uGrg9eGxk4BE41rUpqsSGJGjWOycjY9EqR-DGRK4CjnRYP8R7BpWAyxnfK1p2xil7pR8WIIvaiYWkoJVVY-vIeyGULo17buZxVNTbtkDZSsNjPb_VS94y_PCL2BOl_28XSFpMq7O23N_t3CplE2V4LcbZo7wRRshnnFyUM5FKQt1SaHEhS88GBnxM5QL732mvPyS6uaVq1Z5y-veefsqfGFP2fjjr8hvK14Dn-ALteTqdvOfRvpplYqwp7Qit2MhFn4oxaeXv_tzPp2FMe-NfKxp89iN0tJHKMJOZq2Xk7nHDZ354xsay4Vo_Ki3poaY1x0UqRb1nEFRNCdrmO8lpM-qFW0V_2FUtdm-cILhT6SevtUkenwQbB6a2YZppeHkLicCXzkJdN-phKtZLfwFYpVrS5n7nJb9P0OXa-uHqQCY_f_347m-5HtaNZgLkloQCF4gt8Vr2VbDZW2m7Q1faLSBOZvNZt54PLqup9p_YXBqv_WGX-f7Y7s9sgaxBHAPsH-FOElERKWV9e2_ldQkd43M87L8fOYSMyrh8_l1fVgpcS3p2t8axQW50lCXA_ZbK-FpntfE7oocQ-0VTBUjp9O6djaD2-cfLUs4XnGFJPBgT26SrIC_OiJQPN2EJ53JQ-7idXyBe7cDn5BpwCeMcLb0-_GgVUTAnvoQUlU4MSmv2pYqXvJUpGawtMWOAz32BV9gnCu2rheSGPEY0ALrE58XIS4iC2QPZxR4C2n5DG0R1z8fEb9aXDXJqqsD6q1T65jaw4_sLrZvgeu5xaIUm9TkdkM9FII8qAbVH9lVtZOZiT3C4mnE_hHWqk2wFWcmzRMLtgtaFmDkgOyLkpMTBjY0GhBCUEDQSuvYyx5bg72Mc5ZL0PL6Nuno2XeDgLuvgztU2RP7AWhjTb3Ii_vHHYwZb9QQoMydlm-Ckt308HBxu2nkfYTtN1y3e9n8Bh52dexFLp2Kx5Ec5bCbsXIhIeiz45thPF1ffOHQO6H5ZSUZUbozaaodeEjm-RCK8e7TRk_YIlfsozk_NrB66vrj0OikZQX90oQaUb6QWg7rtWxirMgyvP0V5rj9_DfH-MumnUkkhl3fhharVRfK7qmaOWteFWROp93KJ6M8fuBCG86New1KfvhVT_0mIxcNht6f-953Y-MSEb1MIVpnVadp08K6wsbJQhTcrg9E0fM5IY22HhfF1mOnenl3iZj1fAOWPu44adrhM-H4PMnz4aMbWAmIccpkCB9ZCscmkbysLObu8NmnsPR5L-2nobB3yCmhfZqlDQLs-SZmPaUmX-R3x4l7ITefFW2F08z3E8tlN4nYq9IASZH91o63nwxd2DWL48dyRDPai4GO4v2H1fz3iJ0jp220J4KIHkBfnGQfzPyIY_GzYNRrNHZ7EFd4FDG8ZmiSyvB8wspmmAbBq5paq81CO2kOgHXDQ776gGu_uSZPEzUnzz7yKyVBs93PPcu1hAmuh7c93A7nRr5BxjGoW8PK0M7p04KQn18CM355Ls1NH8iVXDIMm_I8DETE3tOz6cDMi8xSclJ5Y7mo_Q4So4xbn2L0WWArWUfoTWU8bEb5DhHZm_KMbZ5DsoczojoGyeWil5oN2WzPT5BGFGCNpuSZbr5IEJtdP9ys99PQ2X7eMdPv6PoqYdMd8EkDCcvne__CeMkROYRVjM1f0_3VQs_McK7HTw4sRdARPMtQUaoheQpEE8K94PY6t9E3swnIXA91EntNwkdc8-u2U7k5UEUuN5-Q9F-DzkIoRvlZVcnUNHn-8yRCroad3ulzQEICO7NWQs5IM83ewNbCejkFimOJABikyTl9DXoFoRkvEZesnAXZmnt922rXmyZQqnrkxiCJM6CzAdwixAXYRSHJCxoQImXJNQjPh33tF33G5WXaNip3HYbnCa7rrqCZucaqro1LEvU7Tgzt0xetSwhP2fimNupbRvUXIH-zPfzoaiS3Q7_3md-4u_wOQLjARnXO-DiYXrVnNdRMCEVMn4JOdqRpoHanMRRKBDIHBBy9v5fy6vlZyc8Rx_qktWACiIVaoiUiBfmGI9uDdInqJaUgpRfWtUtjsCPHUHALYM7udDULbjQUejcC1MvxjrilqTOIV-gK16BFq52gLKS0xtpdnu3DcpAqyebkimUPei3g1BXO5Lzu2uyXe2A3ujgfrdjdIcEyLZU5hwRqSVSQneQI9KvO0IZUF5peay-JSXLF-gSRPfS_SkNJOO3Zo2EpoHUSEDJQCJeI4K2Zlmppo_eIGmWcvbCmRy1qMgD0tXIqKCdDfaFBg1NewQk17ooPp4l8Oick-turdctmJNYLGsCUtObmvqmLUsk4N8tmN6WgapHK0hyU4MRk_p1PXqiulMMznVB3ZG_FgDDUp_eI4DQHRpGW_rxYW3hcNbCu_zUz1M_Je_g1IvSEPt-kHjvdqdZnhEvLoosD4sswdQL8jQvgOIizdMi9t-xU-xi302x6yWe5_kLP6BhWiRu7GUBjWnuBC5UhJV733lnTmI4jaLUD96VJINS9kfc0H724kTo6LC7I5LU_Wk34tTU2qzdSidwSybV6IzvFFMlnHYhrTvMwUTF3vQdBb27vmtFefrjZ0cYpf8vAAD__9HtXUc">