<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/154948>154948</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[MLIR] Race condition on DeadCodeAnalysis
</td>
</tr>
<tr>
<th>Labels</th>
<td>
mlir
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
amd-eochoalo
</td>
</tr>
</table>
<pre>
The title specifically mentions DeadCodeAnalysis, but I believe this may affect all DataFlowAnalysis when analyses are issued at the FuncOp level as opposed to the ModuleOp level.
The concrete issue raised by TSan started with [this patch](https://github.com/llvm/llvm-project/pull/150775). TSan found a race condition when `UnsignedWhenEquivalent` and `LowerAffine` are scheduled at the FuncOp level.
I am attaching the read and write traces from TSan.
```
WARNING: ThreadSanitizer: data race (pid=1005165)
Read of size 8 at 0x722800004028 by thread T4:
#0 mlir::iree_compiler::IREE::Util::FuncOp::getInherentAttr(mlir::MLIRContext*, mlir::iree_compiler::IREE::Util::detail::FuncOpGenericAdaptorBase::Properties const&, llvm::StringRef) /home/eochoalo/code/iree-build/compiler/src/iree/compiler/Dialect/Util/IR/UtilOps.cpp.inc (libIREECompiler.so+0xfc20346) (BuildId: 761b80a368cfa643)
#1 mlir::RegisteredOperationName::Model<mlir::iree_compiler::IREE::Util::FuncOp>::getInherentAttr(mlir::Operation*, llvm::StringRef) /home/eochoalo/code/iree/third_party/llvm-project/mlir/include/mlir/IR/OperationSupport.h:570:16 (libIREECompiler.so+0xfb8f4cd) (BuildId: 761b80a368cfa643)
#2 mlir::OperationName::getInherentAttr(mlir::Operation*, llvm::StringRef) const /home/eochoalo/code/iree/third_party/llvm-project/mlir/include/mlir/IR/OperationSupport.h:393:23 (libIREECompiler.so+0x7dd33c4) (BuildId: 761b80a368cfa643)
#3 mlir::Operation::getInherentAttr(llvm::StringRef) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/IR/Operation.cpp:341:20 (libIREECompiler.so+0x7dd33c4)
#4 mlir::Operation::getAttr(mlir::StringAttr) /home/eochoalo/code/iree/third_party/llvm-project/mlir/include/mlir/IR/Operation.h:536:51 (libIREECompiler.so+0x7df9408) (BuildId: 761b80a368cfa643)
#5 mlir::StringAttr mlir::Operation::getAttrOfType<mlir::StringAttr>(mlir::StringAttr) /home/eochoalo/code/iree/third_party/llvm-project/mlir/include/mlir/IR/Operation.h:551:46 (libIREECompiler.so+0x7df9408)
#6 getNameIfSymbol(mlir::Operation*, mlir::StringAttr) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/IR/SymbolTable.cpp:31:14 (libIREECompiler.so+0x7df9408)
#7 mlir::SymbolTable::SymbolTable(mlir::Operation*) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/IR/SymbolTable.cpp:129:23 (libIREECompiler.so+0x7df9408)
#8 std::__detail::_MakeUniq<mlir::SymbolTable>::__single_object std::make_unique<mlir::SymbolTable, mlir::Operation*&>(mlir::Operation*&) /usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/unique_ptr.h:1070:34 (libIREECompiler.so+0x7e0124d) (BuildId: 761b80a368cfa643)
#9 mlir::SymbolTableCollection::getSymbolTable(mlir::Operation*) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/IR/SymbolTable.cpp:996:24 (libIREECompiler.so+0x7e0124d)
#10 mlir::SymbolTableCollection::lookupSymbolIn(mlir::Operation*, mlir::StringAttr) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/IR/SymbolTable.cpp:954:10 (libIREECompiler.so+0x7e00ee6) (BuildId: 761b80a368cfa643)
#11 mlir::SymbolTableCollection::lookupSymbolIn(mlir::Operation*, mlir::SymbolRefAttr, llvm::SmallVectorImpl<mlir::Operation*>&)::$_0::operator()(mlir::Operation*, mlir::StringAttr) const /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/IR/SymbolTable.cpp:971:12 (libIREECompiler.so+0x7e087ad) (BuildId: 761b80a368cfa643)
#12 mlir::Operation* llvm::function_ref<mlir::Operation* (mlir::Operation*, mlir::StringAttr)>::callback_fn<mlir::SymbolTableCollection::lookupSymbolIn(mlir::Operation*, mlir::SymbolRefAttr, llvm::SmallVectorImpl<mlir::Operation*>&)::$_0>(long, mlir::Operation*, mlir::StringAttr) /home/eochoalo/code/iree/third_party/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:12 (libIREECompiler.so+0x7e087ad)
#13 llvm::function_ref<mlir::Operation* (mlir::Operation*, mlir::StringAttr)>::operator()(mlir::Operation*, mlir::StringAttr) const /home/eochoalo/code/iree/third_party/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12 (libIREECompiler.so+0x7dfca9a) (BuildId: 761b80a368cfa643)
#14 lookupSymbolInImpl(mlir::Operation*, mlir::SymbolRefAttr, llvm::SmallVectorImpl<mlir::Operation*>&, llvm::function_ref<mlir::Operation* (mlir::Operation*, mlir::StringAttr)>) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/IR/SymbolTable.cpp:416:19 (libIREECompiler.so+0x7dfca9a)
#15 mlir::SymbolTableCollection::lookupSymbolIn(mlir::Operation*, mlir::SymbolRefAttr, llvm::SmallVectorImpl<mlir::Operation*>&) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/IR/SymbolTable.cpp:973:10 (libIREECompiler.so+0x7e010ea) (BuildId: 761b80a368cfa643)
#16 mlir::SymbolTableCollection::lookupSymbolIn(mlir::Operation*, mlir::SymbolRefAttr) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/IR/SymbolTable.cpp:959:14 (libIREECompiler.so+0x7e0100e) (BuildId: 761b80a368cfa643)
#17 mlir::SymbolTableCollection::lookupNearestSymbolFrom(mlir::Operation*, mlir::SymbolRefAttr) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/IR/SymbolTable.cpp:989:26 (libIREECompiler.so+0x7e011b2) (BuildId: 761b80a368cfa643)
#18 mlir::call_interface_impl::resolveCallable(mlir::CallOpInterface, mlir::SymbolTableCollection*) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/Interfaces/CallInterfaces.cpp:196:25 (libIREECompiler.so+0x10530569) (BuildId: 761b80a368cfa643)
#19 mlir::detail::CallOpInterfaceTrait<mlir::iree_compiler::IREE::Util::CallOp>::resolveCallableInTable(mlir::SymbolTableCollection*) /home/eochoalo/code/iree-build/llvm-project/tools/mlir/include/mlir/Interfaces/CallInterfaces.h.inc:156:14 (libIREECompiler.so+0xfb885e2) (BuildId: 761b80a368cfa643) #20 mlir::detail::CallOpInterfaceInterfaceTraits::Model<mlir::iree_compiler::IREE::Util::CallOp>::resolveCallableInTable(mlir::detail::CallOpInterfaceInterfaceTraits::Concept const*, mlir::Operation*, mlir::SymbolTableCollection*) /home/eochoalo/code/iree-build/llvm-project/tools/mlir/include/mlir/Interfaces/CallInterfaces.h.inc:303:56 (libIREECompiler.so+0xfb885e2)
#21 mlir::CallOpInterface::resolveCallableInTable(mlir::SymbolTableCollection*) /home/eochoalo/code/iree-build/llvm-project/tools/mlir/include/mlir/Interfaces/CallInterfaces.cpp.inc:44:14 (libIREECompiler.so+0x10530797) (BuildId: 761b80a368cfa643)
#22 mlir::dataflow::DeadCodeAnalysis::visitCallOperation(mlir::CallOpInterface) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp:362:32 (libIREECompiler.so+0x104ec31f) (BuildId: 761b80a368cfa643)
#23 mlir::dataflow::DeadCodeAnalysis::visit(mlir::ProgramPoint*) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp:301:5 (libIREECompiler.so+0x104eb40a) (BuildId: 761b80a368cfa643) #24 mlir::DataFlowSolver::initializeAndRun(mlir::Operation*) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/Analysis/DataFlowFramework.cpp:134:26 (libIREECompiler.so+0x104c4eb9) (BuildId: 761b80a368cfa643)
#25 (anonymous namespace)::ArithUnsignedWhenEquivalentPass::runOnOperation() /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/Dialect/Arith/Transforms/UnsignedWhenEquivalent.cpp:130:23 (libIREECompiler.so+0xe4e7503) (BuildId: 761b80a368cfa643)
```
```
Previous write of size 8 at 0x722800004028 by thread T2:
#0 __tsan_memcpy <null> (iree-compile+0x99d7f) (BuildId: 302c91be97368fb1)
#1 mlir::RegisteredOperationName::Model<mlir::iree_compiler::IREE::Util::FuncOp>::copyProperties(mlir::OpaqueProperties, mlir::OpaqueProperties) /home/eochoalo/code/iree/third_party/llvm-project/mlir/include/mlir/IR/OperationSupport.h:661:31 (libIREECompiler.so+0xfb8f7f5) (BuildId: 761b80a368cfa643)
#2 mlir::OperationName::copyOpProperties(mlir::OpaqueProperties, mlir::OpaqueProperties) const /home/eochoalo/code/iree/third_party/llvm-project/mlir/include/mlir/IR/OperationSupport.h:445:23 (libIREECompiler.so+0x7dd3829) (BuildId: 761b80a368cfa643)
#3 mlir::Operation::copyProperties(mlir::OpaqueProperties) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/IR/Operation.cpp:366:8 (libIREECompiler.so+0x7dd3829)
#4 (anonymous namespace)::ModifyOperationRewrite::rollback() /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:712:11 (libIREECompiler.so+0xfd8eb00) (BuildId: 761b80a368cfa643)
#5 mlir::ConversionPatternRewriter::cancelOpModification(mlir::Operation*) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:1954:10 (libIREECompiler.so+0xfd707ce)
...
#14 applyConversion(llvm::ArrayRef<mlir::Operation*>, mlir::ConversionTarget const&, mlir::FrozenRewritePatternSet const&, mlir::ConversionConfig, (anonymous namespace)::OpConversionMode) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:3573:8 (libIREECompiler.so+0xfd7a13a)
#15 mlir::applyPartialConversion(llvm::ArrayRef<mlir::Operation*>, mlir::ConversionTarget const&, mlir::FrozenRewritePatternSet const&, mlir::ConversionConfig) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:3589:10 (libIREECompiler.so+0xfd7a210) (BuildId: 761b80a368cfa643)
#16 mlir::applyPartialConversion(mlir::Operation*, mlir::ConversionTarget const&, mlir::FrozenRewritePatternSet const&, mlir::ConversionConfig) /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:3596:10 (libIREECompiler.so+0xfd7a210)
#17 (anonymous namespace)::LowerAffine::runOnOperation() /home/eochoalo/code/iree/third_party/llvm-project/mlir/lib/Conversion/AffineToStandard/AffineToStandard.cpp:564:16
```
I tried applying the following patch to avoid resolving the call, but the error moves to AbstractSparseForwardDataFlowAnalysis.
```diff
diff --git a/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp b/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp
index 10874fd0feb5..a04dd30482b7 100644
--- a/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp
+++ b/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp
@@ -20,6 +20,7 @@
#include "mlir/IR/ValueRange.h"
#include "mlir/Interfaces/CallInterfaces.h"
#include "mlir/Interfaces/ControlFlowInterfaces.h"
+#include "mlir/Interfaces/FunctionInterfaces.h"
#include "mlir/Support/LLVM.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Debug.h"
@@ -359,15 +360,28 @@ LogicalResult DeadCodeAnalysis::visit(ProgramPoint *point) {
void DeadCodeAnalysis::visitCallOperation(CallOpInterface call) {
LDBG() << "visitCallOperation: " << call.getOperation()->getName();
- Operation *callableOp = call.resolveCallableInTable(&symbolTable);
+ Operation *parent = call->getParentOfType<FunctionOpInterface>();
+ if (analysisScope == parent) {
+ return;
+ }
// A call to a externally-defined callable has unknown predecessors.
- const auto isExternalCallable = [this](Operation *op) {
+ const auto isExternalCallable = [this](CallOpInterface call) {
+ Operation *parent = call->getParentOfType<FunctionOpInterface>();
+ if (analysisScope == parent) {
+ return true;
+ }
+
+ Operation *callableOp = call.resolveCallableInTable(&symbolTable);
+
+ if (isa_and_nonnull<SymbolOpInterface>(callableOp)) {
+ return true;
+ }
// A callable outside the analysis scope is an external callable.
- if (!analysisScope->isAncestor(op))
+ if (!analysisScope->isAncestor(callableOp))
return true;
// Otherwise, check if the callable region is defined.
- if (auto callable = dyn_cast<CallableOpInterface>(op))
+ if (auto callable = dyn_cast<CallableOpInterface>(callableOp))
return !callable.getCallableRegion();
return false;
};
@@ -375,8 +389,8 @@ void DeadCodeAnalysis::visitCallOperation(CallOpInterface call) {
// TODO: Add support for non-symbol callables when necessary. If the
// callable has non-call uses we would mark as having reached pessimistic
// fixpoint, otherwise allow for propagating the return values out.
- if (isa_and_nonnull<SymbolOpInterface>(callableOp) &&
- !isExternalCallable(callableOp)) {
+ if (!isExternalCallable(call)) {
+ Operation *callableOp = call.resolveCallableInTable(&symbolTable);
// Add the live callsite.
auto *callsites =
getOrCreate<PredecessorState>(getProgramPointAfter(callableOp));
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzkW9tS47jTfxpxoyJly4c4F1yYQLaomlkoYHcvU7LdTvShSF5JBjJP_5VkO3EC5MAAM1v_rS3GkaVW968PakltqjWbCYAzFJ2j6OKE1mYu1RldFKcg87mkXJ5kslie3c8BG2Y4YF1BzkqWU86XeAHCMCk0vgBajGUBqaB8qZlGZIyz2uArnAFn8AjYzJnGC7rEtCwhN5hyji-ooRMun7pR-GkOAlP3CzSmCjDTuoYCU4PNHPCkFvl1hTk8AsdUY1lVUkOBjXSvv8ui5tB1GCAvRV5qWc-lyBWYlhxWlNlR2RLf31GBtaHKQIGfmJljFJ07Vitq8jmKLhBJ5sZUGgUpIhNEJjNm5nU2yOUCkQnnj90_p5WS_we5QWRS1ZwjMvEjbziMEBkNmnlKWYsCU6xo7lgqmAWvERrF3l_CKaP4Zw7i8t-aPVIOwqDYw1QUtsM3-QQqLUsmwLUqwDqfg5X5VYQGuEHgCtMFpsbQfM7EzHVTQAtH9kkxA9hYljQulVw4VlvoUOy1_3vpP-ntn1d__oGCFN_P7fA7KphhP0DZpoKaVi5EkooVKLjwPS_yYys-8lKMb-2MssSa_QCcWHa95yEhied5XuiRxGrDOML4PrQksRuGSODhBWd2FhSkTAFMc7moGIe26er28rJ5-ssw3jw1KDTPMzBXYg4KhEmNUYgka3Lfv13djqUw8GwQSa3RHj1VAYZuTvsHCFAsTwtaGanOqYbm7Y2SFSjDQFvla4NIbGd0JuQ63BnFxOwWSkRGGJHJXC4AkUnniYhMclnYFsvaaVYzXri2lkUy0Spv3262XzDKG8t0fJPJ1W37fF3pQV5VAyZyqznOMivjuB060BKRc--5zIkXhHHDVnJuJ74qrI6GsZ8lHg3iJC9pHAadsp3e_B6YtzBj2oCC4roCRa3d_0kXLTDfZQEcBeN3q_lyv6ZX07Z6fifqiEzMnKliWlFlli89301IJkzkvHaD2gYH-IqHu7qqpDKDOQrSaOihIPXjXfBnSRnmxZHwE_yK9GvQPwAsZ8W_ALJgFKAgJcEOyIZFEQR5eBBkeI1Z8Bpmb-H1uSbEWfYCBOuqVv7Qt_J7B8m_Fi7cKdwLI2iEapq_yjEajwhi-9ffKV45Cr3kSI-I8GvS7UXlurxfVrARn3rYBJe_CWqRNYpwVxxZo7bGJMYzMDYqXJV3y0Um-c5A8Mly9my-YeaeZhw6q7fy-eGBVrEScNhnek30ZcPbcn-NfD4Z7Y9qLxWYYG2KhuvptJ-MTL_TB_hLsH83LbcPwWU3TjMx4zCVmeV3TXBBH2BaC_ZvDW8S2bCKTdzibefYft0gW2uLTcYEIpPBYAXTLLfJzHMST-PwlDNRP5_ORG3T6qDruPVn7SY5Iufu_6Zzxoy2EzlJppVRzmN8zy29wU6TAs8n4bFL7-h1mxtLbtOwfnz5nQxwNLJxlxwKxzrP8w4Tl0v5UFdNhyvx28aZURQ649gNgwdwdD7sfyZOrvstlA1UGznbgnL-N-RGqqtFtZlobxC03mqFal4hEk695lG6XtLmB_b1ezT3obnibv0N3UJBdusvGdJjvdp_NaNGJO1hXdbCaXKqoHwTaPweBFfROqecZzR_mJbiraD8e1uUXRO4FLNdS8fnhYD2xGa9VrQN6cW9Naf7b5NWhZRfPhtFtVsrwvhwm-pZTPC1pvHb-On7QI5He0EuypyO6LGOG-JND3BG--VeMP4yY_iilTL0nVeMDlSY04dVR_QfWQe_aLkKDkg3fA8Os_oezPHXwfxVmdlo7xbQQuXBEQHCIvXGHvF1pP4EqkC3mftEycVvDVniNpU7TwXA8_2MHBtTk55oNiWZMmFAlTSHKXPeZV8o0JI_wphy_mKLYxuvq6tu1GtgbWvhM_ZC3fx2g2hZWjd0-_JmWxTtgND3osCL4tGxGPb3if2t-xY094oy857z8YbOKj3Y0saVeLnv_BncVzcSW3gbKbnedZi1QwXzARO5VUIU73P9MkuSCA6zY3c-7h2G_qYa9E9eWRyvkmNZG0uRQ2W6O6b04DT7N1V94NkFMtpzQdKqvnf90d9tb8ea_6o7tFd1NvcK9_mDC0rD0fDYa6P-LreghpZcPjW_Xlzyu9ZHpplpAF6Z1q4w_8EBfF1xMOnKCezjFqvdGXJM7N9dWwzfCyEP_PJY2IL3wLaB1I2SM0UXN5IJ8xlL3XFIeb71uj1AZaF3YFra-8-i1b-L6pi5s97YRVPBDKOc_YBUFLf1rrT081GaKLqAJ6keuowgCPclVb4X5iFkx2YETZZBhRTLhaw1FnQBumrcppE9VczMX68UuaG6tS1Vi2vRd8cPR2ldUeAYQmRyr6jQpVQLi9zrDK7g8_ZddEAIw8gLDkWvX6ey9RPfKHhkFsum0uXAChQbJtZq8fB0ajQV0wUs8mqJUTAWNecouLTsuWDfrvyO-9GoGL4SPwKP5CM_g9EwiJMy81vN_4pKiVxWy3U5ypZz0X9r6L_cTB-23_6Kmok49t2F4J6aiWEZfWzNhIXtuvow4H5V_UQYRofUTyTk2PC1o3ziKIv7kiKK2O4okoMw6NdQ7InP32XByuVqsltwYacNy7I5uf-MgLwZfg1zKWYbpcdSPILSa9mHvo1v_k7_KRLIPO8nKizWs95QY0B1WKzODEQO_LpygLH8ZeL4qav8UXD5B1wJlsXQGzZ24NagwaCtoVyfQdOq4ss18Y0KolQpurzdcRbsDiXHr8J7T9UMzEZN4brbRMkf0EHfKuLuzd5romMpSuauaPYY_HW1HvTdaeNXqiqI3HHqLrcuiyH1A7p5EtM3XKenG6psAvpfU9evxd4dNu5zE0r8Y8PKxlH2m-o55JDjf0IN7sDyQDX0QB7uc_V-_fkX7TP6Cp40U9_LO0NFQVXxSlOLQRSHbVHti83BFTaKQdFE464cvpScyyf7y5X9YyMxfZSswM0ZUdctp5x3XzbY36CUVHghH0HbIWmmjaK5uauo0jCR6omqYvsbh660vsdYwcoSean9B5-ezpjB9P17d5z9xL7fS5ko4Bn7XjIMy8IrIYsGA-qFRRF4YUKyIfY9Lw5D5KWnp6c_w6cFoC3SOv9JnlHoodDDp8RDZGx35efuaYibF-0mq02QMSKknyH_TXkNt1TMYDBHhLzdeddR5eEDpTBKcivPy_EOjH0UupvzQ6dvE39EJt--_f39jb7t9fy675hqw8Ts0O4XkNWrzp06gmiEyNiPrEKC2GqEJK1K8Dc5Yznlt6Brbl5-PbRxQtY_F8OIpFVzQDbCaHje5ljOV484ntw6lGwdu6OIv12c_9FFs2CMApsEkVcIBRYY0vWxRAYzMFsB8RQFl22NbVuXEdhJTvGqnxUqb0-hryuMgouG1psH1IjEul842JK0nrRBtKIKLGYtwZaTG9e6qmruDGrjfPyyz6qli1nZLA8Ntne5rMAStrSbaXoasf0xVmBqJXok0PBilRM331Lh1DHm4i2GZ7vMUs6XpwXYsF7gDhU8pxrX4kHIJ4ErBQXkoLVULpqe4nYnTWsjMdOXLZ0ONyd_-1lX80HXBkiy2uL8SGK7banF4tPU8h7FdKrBRtWwQavVEHmL8w-y0m3mmaZTKoqpkKI5Vxs3Fy8vZF_Pj9rDiQPkaoRqj557VufUKWujWQFuOe8wxNqByDSmYmWVqyGNyTWMI-JvAG9VyXQqctBNGZZsGd2WeO_AbUk7CV6RsS_ZtZmDemLaXafnc8gf7IRd7uIkVjCz2mQat17W-tDKkqzh531zL5ZimlNtUDAer9ja0sxbgr6P2l7pEfFX-piB6QjdOtn6TtIfVFKu15hZs2hspFuvhhEi48QtV8moeWxeffDystLW_fXFtV1E0qLAullMcSkVFlKcNq6zgq79Nla4wEfVcoCvnF436G2ES0vEBdda29GAn2TNC7yg6gFTjefUpbUKaD6HAlegNVswbVi-QbJkz-16O8ayMy5MbbrsWK2UrOiMmvWHpQ7qR5tVaetdrXX9jKNjt-OKHSFE_JdBeU9kWLncmyNfjPnwqLcRforCYcXZY2MbmhkXVlwn5zHtrPaFdtHcS7FNLdRYATV2fbhZr4J3xjVZ3Ow60kuX0tLAq9GkMfxuA3JSnAXFKBjREzjzh1GUDD2SjE7mZ3FJSByXZe7HWRb6vp9EtCQ0iRI_9ukwPmFnxCORlxDiB2EYjgaJ72eQ-TQro2hERzEKPVhQxgc2ZxxINTtxn2Cf-VE4CpMTTjPg2n1-3mWsBEUXJ-rM7QqzeqZR6HGmjV5TcB-i2zHfv13dougC325-UC3FC2c9qRU_O_o7bseqdl9yO24fz8j_BwAA__9M0ux4">