<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/63025>63025</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
AArch64 SVE VLS: ISel crashes with <8 x float> argument
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:AArch64,
SVE
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
kawashima-fj
</td>
</tr>
</table>
<pre>
`llc` crashes with the following IR.
```llvm
source_filename = "reproducer.c"
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-unknown-linux-gnu"
declare void @bar(<8 x float>) #0
define void @foo() #0 {
call void @bar(<8 x float> undef)
ret void
}
attributes #0 = { vscale_range(2,2) "target-features"="+sve" }
````
```console
$ /opt/llvm/16.0.4/bin/llc reproducer.ll
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: /opt/llvm/16.0.4/bin/llc reproducer.ll
1. Running pass 'Function Pass Manager' on module 'reproducer.ll'.
2. Running pass 'AArch64 Instruction Selection' on function '@foo'
#0 0x0000ffffb7ea4e20 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/llvm/16.0.4/bin/../lib/libLLVM-16.so+0xd64e20)
#1 0x0000ffffb7ea3110 llvm::sys::RunSignalHandlers() (/opt/llvm/16.0.4/bin/../lib/libLLVM-16.so+0xd63110)
#2 0x0000ffffb7ea327c SignalHandler(int) Signals.cpp:0:0
#3 0x0000ffffbe7b066c (linux-vdso.so.1+0x66c)
#4 0x0000ffffb6cf2c1c raise (/lib64/libc.so.6+0x32c1c)
#5 0x0000ffffb6ce07a8 abort (/lib64/libc.so.6+0x207a8)
#6 0x0000ffffb9dd8db8 llvm::AArch64TargetLowering::LowerCall(llvm::TargetLowering::CallLoweringInfo&, llvm::SmallVectorImpl<llvm::SDValue>&) const (/opt/llvm/16.0.4/bin/../lib/libLLVM-16.so+0x2c98db8)
#7 0x0000ffffb86b7da0 llvm::TargetLowering::LowerCallTo(llvm::TargetLowering::CallLoweringInfo&) const (/opt/llvm/16.0.4/bin/../lib/libLLVM-16.so+0x1577da0)
#8 0x0000ffffb86c0f6c llvm::SelectionDAGBuilder::lowerInvokable(llvm::TargetLowering::CallLoweringInfo&, llvm::BasicBlock const*) (/opt/llvm/16.0.4/bin/../lib/libLLVM-16.so+0x1580f6c)
#9 0x0000ffffb86da3b8 llvm::SelectionDAGBuilder::LowerCallTo(llvm::CallBase const&, llvm::SDValue, bool, bool, llvm::BasicBlock const*) (/opt/llvm/16.0.4/bin/../lib/libLLVM-16.so+0x159a3b8)
#10 0x0000ffffb86cb9f0 llvm::SelectionDAGBuilder::visitCall(llvm::CallInst const&) (/opt/llvm/16.0.4/bin/../lib/libLLVM-16.so+0x158b9f0)
#11 0x0000ffffb86edf04 llvm::SelectionDAGBuilder::visit(llvm::Instruction const&) (/opt/llvm/16.0.4/bin/../lib/libLLVM-16.so+0x15adf04)
#12 0x0000ffffb87403cc llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, false, false, void>, false, true>, llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, false, false, void>, false, true>, bool&) (/opt/llvm/16.0.4/bin/../lib/libLLVM-16.so+0x16003cc)
#13 0x0000ffffb87412ac llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/opt/llvm/16.0.4/bin/../lib/libLLVM-16.so+0x16012ac)
#14 0x0000ffffb874346c llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (.part.1092) SelectionDAGISel.cpp:0:0
#15 0x0000ffffb828d19c llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.80) MachineFunctionPass.cpp:0:0
#16 0x0000ffffb7fe5a1c llvm::FPPassManager::runOnFunction(llvm::Function&) (/opt/llvm/16.0.4/bin/../lib/libLLVM-16.so+0xea5a1c)
#17 0x0000ffffb7fe5b78 llvm::FPPassManager::runOnModule(llvm::Module&) (/opt/llvm/16.0.4/bin/../lib/libLLVM-16.so+0xea5b78)
#18 0x0000ffffb7fe6698 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/opt/llvm/16.0.4/bin/../lib/libLLVM-16.so+0xea6698)
#19 0x00000000004134c0 compileModule(char**, llvm::LLVMContext&) llc.cpp:0:0
#20 0x000000000040bfd0 main (/opt/llvm/16.0.4/bin/llc+0x40bfd0)
#21 0x0000ffffb6ce0be4 __libc_start_main (/lib64/libc.so.6+0x20be4)
#22 0x000000000040c69c _start (/opt/llvm/16.0.4/bin/llc+0x40c69c)
```
# Environment
At least LLVM 16.0.4 and the latest `main` branch (commit aaa33b6a98de2be7cdc827b13e60c103206d6461) can reproduce this error.
# Quick Survey
## SVE VLS/VLA, NEON
This error only occurs with **SVE VLS** (a.k.a. fixed-length).
- SVE VLS (`attributes #0 = { vscale_range(2,2) "target-features"="+sve" }`: **crash**
- SVE VLA (`attributes #0 = { "target-features"="+sve" }`: no crash
- NEON (`attributes #0 = { "target-features"="+neon" }`: no crash
## Types
If the type size <= 128, this error doesn't occur.
- `<4 x float>`: no crash
- `<8 x float>` **crash**
- `<16 x float>` **crash**
- `<2 x double>`: no crash
- `<4 x double>`: **crash**
- `<8 x double>`: **crash**
## Assertion
With the debug build of the latest `main`, an assertion at `llvm/lib/Target/AArch64/AArch64ISelLowering.cpp:6859` fails.
```
$ /opt/llvm/main/bin/llc reproducer.ll
llc: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp:6859: void analyzeCallOperands(const llvm::AArch64TargetLowering&, const llvm::AArch64Subtarget*, const llvm::TargetLowering::CallLoweringInfo&, llvm::CCState&): Assertion `!Res && "Call operand has unhandled type"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: llc reproducer.ll
1. Running pass 'Function Pass Manager' on module 'reproducer.ll'.
2. Running pass 'AArch64 Instruction Selection' on function '@foo'
#0 0x00007f173cc297ea llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) llvm/lib/Support/Unix/Signals.inc:602:22
#1 0x00007f173cc29baf PrintStackTraceSignalHandler(void*) llvm/lib/Support/Unix/Signals.inc:675:1
#2 0x00007f173cc2728e llvm::sys::RunSignalHandlers() llvm/lib/Support/Signals.cpp:104:20
#3 0x00007f173cc29102 SignalHandler(int) llvm/lib/Support/Unix/Signals.inc:413:1
#4 0x00007f173c43c520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#5 0x00007f173c490a7c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#6 0x00007f173c490a7c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
#7 0x00007f173c490a7c pthread_kill ./nptl/pthread_kill.c:89:10
#8 0x00007f173c43c476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
#9 0x00007f173c4227f3 abort ./stdlib/abort.c:81:7
#10 0x00007f173c42271b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#11 0x00007f173c433e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
#12 0x00007f17431484cc analyzeCallOperands(llvm::AArch64TargetLowering const&, llvm::AArch64Subtarget const*, llvm::TargetLowering::CallLoweringInfo const&, llvm::CCState&) llvm/lib/Target/AArch64/AArch64ISelLowering.cpp:6829:0
#13 0x00007f1743149b7c llvm::AArch64TargetLowering::LowerCall(llvm::TargetLowering::CallLoweringInfo&, llvm::SmallVectorImpl<llvm::SDValue>&) const llvm/lib/Target/AArch64/AArch64ISelLowering.cpp:7134:0
#14 0x00007f17415a7753 llvm::TargetLowering::LowerCallTo(llvm::TargetLowering::CallLoweringInfo&) const llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:10244:24
#15 0x00007f174159a927 llvm::SelectionDAGBuilder::lowerInvokable(llvm::TargetLowering::CallLoweringInfo&, llvm::BasicBlock const*) llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:7949:3
#16 0x00007f174159b3b0 llvm::SelectionDAGBuilder::LowerCallTo(llvm::CallBase const&, llvm::SDValue, bool, bool, llvm::BasicBlock const*) llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:8079:27
#17 0x00007f174159dfa2 llvm::SelectionDAGBuilder::visitCall(llvm::CallInst const&) llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:8630:16
#18 0x00007f174156a4be llvm::SelectionDAGBuilder::visit(unsigned int, llvm::User const&) llvm/include/llvm/IR/Instruction.def:209:1
#19 0x00007f1741569cc3 llvm::SelectionDAGBuilder::visit(llvm::Instruction const&) llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:1178:22
#20 0x00007f174167e795 llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void>, false, true>, llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void>, false, true>, bool&) llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:689:79
#21 0x00007f1741684352 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1705:33
#22 0x00007f174167d306 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:483:7
#23 0x00007f17430d0fbc (anonymous namespace)::AArch64DAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp:58:0
#24 0x00007f1740a65b48 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) llvm/lib/CodeGen/MachineFunctionPass.cpp:91:33
#25 0x00007f173d59019a llvm::FPPassManager::runOnFunction(llvm::Function&) llvm/lib/IR/LegacyPassManager.cpp:1435:20
#26 0x00007f173d590470 llvm::FPPassManager::runOnModule(llvm::Module&) llvm/lib/IR/LegacyPassManager.cpp:1481:13
#27 0x00007f173d5908db (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) llvm/lib/IR/LegacyPassManager.cpp:1550:20
#28 0x00007f173d58b558 llvm::legacy::PassManagerImpl::run(llvm::Module&) llvm/lib/IR/LegacyPassManager.cpp:535:13
#29 0x00007f173d5911eb llvm::legacy::PassManager::run(llvm::Module&) llvm/lib/IR/LegacyPassManager.cpp:1678:1
#30 0x0000559342b3ecde compileModule(char**, llvm::LLVMContext&) llvm/tools/llc/llc.cpp:759:66
#31 0x0000559342b3c5ab main llvm/tools/llc/llc.cpp:420:35
#32 0x00007f173c423d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#33 0x00007f173c423e40 call_init ./csu/../csu/libc-start.c:128:20
#34 0x00007f173c423e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#35 0x0000559342b3b205 _start
```
## Debug
`analyzeCallOperands` function, which has the assertion, is:
```c++
static void analyzeCallOperands(const AArch64TargetLowering &TLI,
const AArch64Subtarget *Subtarget,
const TargetLowering::CallLoweringInfo &CLI,
CCState &CCInfo) {
const SelectionDAG &DAG = CLI.DAG;
CallingConv::ID CalleeCC = CLI.CallConv;
bool IsVarArg = CLI.IsVarArg;
const SmallVector<ISD::OutputArg, 32> &Outs = CLI.Outs;
bool IsCalleeWin64 = Subtarget->isCallingConvWin64(CalleeCC);
unsigned NumArgs = Outs.size();
for (unsigned i = 0; i != NumArgs; ++i) {
MVT ArgVT = Outs[i].VT;
ISD::ArgFlagsTy ArgFlags = Outs[i].Flags;
bool UseVarArgCC = false;
if (IsVarArg) {
// On Windows, the fixed arguments in a vararg call are passed in GPRs
// too, so use the vararg CC to force them to integer registers.
if (IsCalleeWin64) {
UseVarArgCC = true;
} else {
UseVarArgCC = !Outs[i].IsFixed;
}
}
if (!UseVarArgCC) {
// Get type of the original argument.
EVT ActualVT =
TLI.getValueType(DAG.getDataLayout(), CLI.Args[Outs[i].OrigArgIndex].Ty,
/*AllowUnknown*/ true);
MVT ActualMVT = ActualVT.isSimple() ? ActualVT.getSimpleVT() : ArgVT;
// If ActualMVT is i1/i8/i16, we should set LocVT to i8/i8/i16.
if (ActualMVT == MVT::i1 || ActualMVT == MVT::i8)
ArgVT = MVT::i8;
else if (ActualMVT == MVT::i16)
ArgVT = MVT::i16;
}
CCAssignFn *AssignFn = TLI.CCAssignFnForCall(CalleeCC, UseVarArgCC);
bool Res = AssignFn(i, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, CCInfo);
assert(!Res && "Call operand has unhandled type");
(void)Res;
}
}
```
When SVE 256-bit VLS, `ArgVT` is `{SimpleTy = llvm::MVT::v8f32}`. Which means the backend tries to use the 256-bit SVE register. The `AssignFn` function cannot handle this case and returns `false`.
When SVE VLA, `ArgVT` is `{SimpleTy = llvm::MVT::v4f32}`. The output assembly code seems to use two NEON registers.
I don't know whether trying to use a 256-bit SVE register is bad or the `AssignFn` function is bad.
# `<8 x float>`
This crash was observed when compiling a complex C++ code with `-march=armv8-a+sve -msve-vector-bits=256`. The code uses SVE ACLE. A reference (or a pointer) of something is used as an argument. The `ArgumentPromotionPass` seems to promote the reference to a `<8 x float>` value.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcW9tz4yqT_2vIC2WXBLo-5MFx4rOpynwzO8nJeXQhhGy-yOAClMv567cAyZZkO5dJZvd8m0ocGaHuX1-AphsRrflKMHYO4gsQX56RxqylOn8gT0Sv-YZMqn-fFbJ8OQdJUNcUJAGkiug10_CJmzU0awYrWdfyiYsVvP45BcElCGbtZxL437p-3PgmLRtF2bLiNRNkwyDAlxAgpNhWybKhTE0pQMj3NUStmIElMaQmL7IxXW822QA8YxOeATyzfxhNeJgAPHMf9lsSATxLogkPke0QomwiMPJtt7ZtxMQovq13cAhRdJ1Ek0Y8CPkkJjUXzfNkJZrdY_6zZLQmisFHyUsIoqAgClh-8ww-w6qWxAB8BVAOAcLB8MGKi_1zlZT2ubYjBOmF7wYhJXX9OnnYiJJVAOXtI4oZ90DLLr3s8yXGKF40humWk5U3vYCPmpKaLRURKwZQhgCaIw8HeQVNKkZMo5i2GsCX9hNd6EcGEIJ7Hp297e8xP6BSaFmzthVFEKCF3BqAFs5D0CJMpsE0AmhRcOFaKey5Rl1D_-iPm6vZ7RXUTbHhBhJYNCvbTyoDjYRrY7Ya4BlAC4AWK27WTTGlcrNnY_9Ntkr-m1HLnGvdWMkWkIgSckHrpmTOtZ2vw4LQB6MIZa133xpCH2DZbLaWi2sKptD9_FBypcgGErVqNkwYi-PDUnqSYUvyZyOEHVxboq3V0kUjqOFSwB-24RsRZMUUQCmUAm5k2Vg3RumQIEpb6OgE0dnMeTy8FtqoxtO_ZTVzVy3xqmMMUNo5bdp6nfOm4DkIgqCqqqpIGYkYCqCTGM8AnukX7S9-KC6MU-Gd1SlA2b6TIk9LqY1iZANQAtAccmG8I2ZvaHE6tbd44T9vbu6_TcJkqiVAF8FzmVg0-0ECEA5HcHEYHoX7sxG3fCVI_V9ElDVTejdSP4nIMhwgQmNEKKVwwBugrNWHb9ZTurU-GLi_HSHcJ8TSIkgSavH6aeyx1HKq5TR0OJKEDkBE_WcTWiEaUqgI16yVuOZFEvn_1JJJHBls-w0IxUNCLEhJBklhx-hrhJDtNyCU9AnlZZmVRdYzVOu5d26aupFPTHGx8rfctzmx_t_zsWM9baeu5VpUsnW-_UO3G1LX94waqa432xrgee_e5T2pG-am-sQax05z5rMOgmhuJR2oIu2rIkuKtCR9n31VB3fy17TwReKEcWrRDsTJhuLQoEpoX-fd_HM5--Oi4XXJlL9RW4zX4lE-kKJmnzfuBdGcXtSSPnhZAZp9wQgP48wKNJA4H0pcEjzw5ZMSn7KibbogmnW4x17beiaaw0LKuv__90ufW-F20tsZNxjZu8ir4D3SP3LNzcE4tg12uerJ_hU2s6AGqMMhalZWQfRu1APE_cX1S0ETi2kAerCWZGkUYHpqaF3fsrrfuveHAXhec22W3DBFjFSDCdDfKpkhvKUkZMmWcms56EHXngqsF1ak1mxw4UJXO5P22oxqZ9e-2_4z8Pjh9CVWTAJrpIEV8ciKISLvteLMTQytIfXAkrsA8it9MAksuAH6aIQeRyen9z161Yjv4huhay5YB3SA_uBeB3-6JcpMwyB3O5cx9cNIyUIcBCkZysow70Mc8bIBdw_lUXincGV2UoFHCB4HNgh60orFJOwDW_ywj3ax_4chfcbSjFgsA0OnY7BFmr0D7De3WRkat236IqBFOlyAshHQJMn7QGu2IvSl3aXsIfuAr4X9G-FaNAO4XbTgf6IQRzSAVG62vGY75dE1UW7Jng3nR0t-LoVhz90Qr2t61NlQMOQTFFUZwA3h4h0y1TV18P1TffgoHO8AChbB5dLG-0ttiDLLHo9Tu4GCDRY2hEZYaZJT6Ml9CK19bk_4aNYCYXglHrmSwu7k-7dmBtaMaAOtkqHn4XIHZs1gTQyz8XISWPFAEsBCEUHXFh6VG5exIATjIiF5VjJUsJSWNENpEWKWBDQMMAqSMomS0EXfROyzA9CsuYZMKammY6z_3XD6AG8b9cheRvfs7dv7K3h_cwvQ4v7Gucq_rr7_q9_vbkcaSlG_QElpo9o0n3ewHQn7xYpDpg9TMoUVf2blpGZiZdYA5QNkk46xs04S_LYMVBL4VIvF5tI27aAYoJi9geKD3IT0GaKOiVXppzgIZqfp0ywGFr172TLdb7-unAOaly2Dmv_NIMBzy9flO-c934GlZFoAlBpv5ZHFHOt51M9hHpfXd8yGHeFpI_j-YTJ64I3-CD7DUjZ2q_cGkuhIzzeIZ-9_ZKD8mdZMuVW1d--vLiVesqJZwcJuB6Csjk8L1iSQCEg6SpC4212O0q0Tfj8L0KJNc-yvbFDT7WrbaT3J4tzqsyK81scz8adTrw7VW4lXO3_iGfwkRDzzKW0iSP3yN7Mbue9bpogotZsj7aburQSP3-qe6HvbFKZFNTvW7ZeyBPP5rSGmXe2tDDsXcK6Ewp9urCcAJXaUW3pQerHgmmjYiLXL4pVugLrxnjpTsXL6H5nW_n-Wt06rMMWUojxl5Mvy1oORcttsrTEBWvwp-LNtaLO4XNhhlQQI4FlXYernqHfQClLBEY5xgthtWH0K50PM0xjgWXiYje54pyhjH8mPn2A-TFyHQWRFPpK73okcBuhUEvwj8kUhHsoXDRhFmMYo2MeiAC2es2SZRP3a3yg4jVA8qinEQ5p5QFIKl8utWStGyuUDr-sl32xrZscQcT5ptwRia2qAFv1uU4fZKidNDlPhr9IXhilB6lcpp64oGhxmlgeU-4-9Si7LR-SysXKjNIEr7SziKPnLbk-kX3TJtnaq2krtjOcqDo42Sq13HqZQW9IIpRVu6wqOlCm9-VyTRxdaiQ_TkHsKYQGXol7WkpTLUrpdiaXFhRPXNm_0ihJPLgxTC-lIhrCTFrM8-Zgr4ZzlydEEnqUZ4TDKIkpPLJhvLJUncsPjpbKX_J1_cKk8wWGwYH4qZnDrbXCYF-uUkxcp_U8oCf26DtIQR0Md9OevKIxJmsb4f6sWNJBjLkv2B7NRYz_nNvraZsZ30z5ycxuKDlNxrTw5yVH6DyoGfVbkNI-sE-PDFF8ncIGLd1VD_g9qQZ8VPgvS3E_lBznDTvqyIuiLa0GfRp3gwJ8pOkggtqgTEhXsI7WgRrjjVqUPD_ua_1MzdQx9G7bvg_zrn_ZjH-5OS1a5GCrfxzf95GEHNacUf23Z6tOzQOjCkN2Rql4m0oNOUpbm8T-wbOUKQP-cqtVH4fSKVh-3Ya-Ykri4Lz2S8m3tl0U4PjWqP1uw-hTyMA3sdgfjw8Ry53olDpLfVa36FPYow4N4Fg2joaAMqsId9yFCipeNbDQUZMP01m1a80GIdDn7405-uUSvRzYdz1acOBsWIwZxTUCSuIiyLy3JnVD-6dJcHo5cZbDNK-M8CHPyRcW5ATg31d-4olSPYufCEY57e2eLKxnjitLgC-pwH8Hk9lphT1fpGFNWFm8557ffDzSOg5HysiHQrIjjr6sNvh9Z7Kza12A-0mAYsuJtYF8KKkx8wmAHapc0i-McR6jAjJbsU6VJB8VIWeuuTLfY1ytTlzRO9oHYLjPW8acxKXzJ8g1SEbKGx_GeFBqlA3CZB8MyJSV1vdxlBahuDvMWbWbk2EPTdTfL9SLJUZ4rQphFgTvtveSCmzEjf2mpTxx1n4hwR9t7PjzOaXmihxXX9xDHLmLvqSkeabxAQdwWXl8vogKE4SUrmtWoIHEsmZEEu2ytdZmnNadrlzw3a7YvlLj8qt4lqceHzAG6sL_-fQNDDKdvlxuOZ04ASu5urgGad8fxX_8ZkNonVgCa9QoSH6L1ruwLQMm8j7LNu7j2ud_j5oN3ChzpfnRhu7p_-BLOb66nNv7AXX_Lj4vVXIrHNvq8dG2Mzee7J2yD77FjY6NMeK3viZqp1a5j19Dr2OLZp1MAnl_fXnpm3xuzbYx9AM0hRgBfWbDfG6N3JO2XQ74e4l9cJJHruTPBBOArrntSuT4AZZ1Qbh266PsWhLuN27-azUytPHPLeKr538ynvHsYKqngYLvn-gcAX9hLFNpvLSXb5j2Wj-wE4bf7OzhTq_u7HTsQX3AQX07v73rcINypa6ZWi5qs9N0L7C4PnnWtYwmd1v7UzFuntazfPPQZ8crKtTPiGDCEvjoFvwv4FxelfNK-8sz8IYF9AQlyAQl8JIqolX_LhSjmyjpudwz_-PFTH6FrpLQEtYSN9rWslsR8Do20eneHJNjGfuPCsBVTULEV14apribqKXai9BzliDzwQCl-IzUUOr2ErNbs7YcBCvumuNYLq5ZDcvuvozd49sgBCnvUh9Bbbf3BjD8N0NagpeIrLki9M8NAIVfW26hpSO0drr13d3M9XTHjskd3rnKZ2eh9xcwlMeTGvZnVDgA0dwPSuXV80Rf0u-KrmVpdi5I92-93L_v5yoGdzepaPv3pX7hyEcOi3dfmI-1828H81g6MDvSU61tXXule0cCL_b0VM_7m_d3u9syPrrH6vfKuqx4briEPAVrwzH6ELrf2xKBey6YuoWYG3kh6f-e8Luv1O-JxA-wW_jeLwGUAQgjSOUjn8JU-vTcC2p_9DNHvNZTJeefb_JN3EQ-TAfUjHjqfz9yLhQthV7_9Nb507rS_vZBdNn4_-87h0K8HzNw85Srt1vAtFYAybp_z1uxfzOf3pPbduv1WXbc9_DzoOrWr5ICTDzf8QPt4aX9Ia1eXzX-y3lq119zhK3T9YyVrJtwBJhQnk4IbfwhrDkESeEGTwDqofSq98E5-9-IU1Iv8O-s9ZhVG_nzRFP7lAqwNI8KHWAWhD0yU0CjOtHXmbpbtOFsU3XQ6hXdr5kB0ZuiFb5ASIaSBXjH-7BElmrmzCIqZRgmH2C8xSTA9KnB7VO3XBI16glqk0oUSzq6bon6BVJYMasY2e0mfpD_DNV4x2vNVsJT-1JSdpeDTmpk1U9CoFxsstjTIUV1Z2AUpoVROnaeU5nsdHO07es7q4OyeP9XxRDSUhWbqkZUWomi3ZRYicdc1e4ZzH3J4Hfgjfkkw2RBF1wBfErV5zCbEH3mDk41-ZJNHF5pZwTTAlyhOdnp1NBrNtJN4Nr-5msIZVKxiignq3huTChK4la42badeWUEtN8ysLSqu7dMlJNodh-qWpp13tQ0_lNzIXc4nCfam27o73lH3bI2E5MQJtUe7lrVaPivPcZnjnJyx8zDJ4jhMwzg_W58HaVQVWRHHeRgHUZnHJWMxKaOwiuOCovCMn6MA4SDGYZCGCOfTMmIopDjPM5rkJM9AFLAN4fXUeudUqtWZO5JznuAAxWc1KVit3YvXCLUDb5-Zc5PIHCB0e39lr-PLM3XuDvgUzUqDKKi5NnpP2XBTs_PuOEx3UhPP4PUtq4fvbI9fIO40ftao-vzXTxk5qf4nAAD__7_VWsE">