<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/77877>77877</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[Flang] Compilation of a large array of a derived type with an initialized member needs a lot of memory
</td>
</tr>
<tr>
<th>Labels</th>
<td>
flang:ir
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
yus3710-fj
</td>
</tr>
</table>
<pre>
This is an issue from Fujitsu testsuite.
Flang-new terminates abnormally when compiling the following program.
When I checked with the `top` command, `%MEM` gradually increased to 100%.
It seems that a lot of memory was used.
There is no problem with gfortran compiling on the same machine.
The following are the test program, Flang-new and gfortran compilation result, and the stack trace of Flang-new.
```fortran
! test.f90
type t1
complex :: c = (0.0, 0.0)
end type t1
type(t1) val(1000000)
print *, val(500000)
end
```
```console
$ flang-new -v test.f90
flang-new version 18.0.0git (https://github.com/llvm/llvm-project.git 2af0695b875911144ed1f7b4e5679be500b86a77)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /path/to/install/bin
Found candidate GCC installation: /opt/gcc/11.2.0/lib/gcc/aarch64-unknown-linux-gnu/11.2.0
Selected GCC installation: /opt/gcc/11.2.0/lib/gcc/aarch64-unknown-linux-gnu/11.2.0
Candidate multilib: .;@m64
Selected multilib: .;@m64
"/path/to/install/bin/flang-new" -fc1 -triple aarch64-unknown-linux-gnu -emit-obj -fcolor-diagnostics -mrelocation-model pic -pic-level 2 -pic-is-pie -target-cpu generic -target-feature +neon -target-feature +v8a -mframe-pointer=non-leaf -o /tmp/test-f371a2.o -x f95-cpp-input test.f90
flang-new: error: unable to execute command: Killed
flang-new: error: flang frontend command failed due to signal (use -v to see invocation)
flang-new version 18.0.0git (https://github.com/llvm/llvm-project.git 2af0695b875911144ed1f7b4e5679be500b86a77)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /path/to/install/bin
flang-new: note: diagnostic msg:
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
flang-new: note: diagnostic msg: /tmp/test-e5be39
flang-new: note: diagnostic msg: /tmp/test-e5be39.sh
flang-new: note: diagnostic msg:
********************
```
```console
$ gfortran -v test.f90
Driving: gfortran -v test.f90 -l gfortran -l m -shared-libgcc
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/aarch64-redhat-linux/8/lto-wrapper
Target: aarch64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl --disable-libmpx --enable-gnu-indirect-function --build=aarch64-redhat-linux
Thread model: posix
gcc version 8.3.1 20190507 (Red Hat 8.3.1-4) (GCC)
:
$
```
```
#0 0x00007ffff090ff7b in llvm::Constant::getAggregateElement (this=0x7ffc5236d810, Elt=117955)
at /path/to/llvm-project/llvm/lib/IR/Constants.cpp:423
#1 0x00007ffff08f021c in llvm::ConstantFoldInsertValueInstruction (Agg=0x7ffc5236d810, Val=0x555555967600, Idxs=...)
at /path/to/llvm-project/llvm/lib/IR/ConstantFold.cpp:605
#2 0x00007ffff0ad9596 in llvm::ConstantFolder::FoldInsertValue (this=0x7fffffffb9b8, Agg=0x7ffc5236d810, Val=0x555555967600, IdxList=...)
at /path/to/llvm-project/llvm/include/llvm/IR/ConstantFolder.h:145
#3 0x00007fffdfa3d743 in llvm::IRBuilderBase::CreateInsertValue (this=0x7fffffffb940, Agg=0x7ffc5236d810, Val=0x555555967600, Idxs=..., Name=...)
at /path/to/llvm-project/llvm/include/llvm/IR/IRBuilder.h:2498
#4 0x00007fffdfa177e4 in convertOperationImpl (opInst=..., builder=..., moduleTranslation=...)
at /path/to/build/tools/mlir/include/mlir/Dialect/LLVMIR/LLVMConversions.inc:211
#5 0x00007fffdfa2bccb in (anonymous namespace)::LLVMDialectLLVMIRTranslationInterface::convertOperation (this=0x5555555ed730, op=0x5555558fbb90,
builder=..., moduleTranslation=...) at /path/to/llvm-project/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp:415
#6 0x00007fffe487ab27 in mlir::LLVM::ModuleTranslation::convertOperation (this=0x7fffffffbc00, op=..., builder=..., recordInsertions=false)
at /path/to/llvm-project/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp:753
#7 0x00007fffe487ba28 in mlir::LLVM::ModuleTranslation::convertGlobals (this=0x7fffffffbc00)
at /path/to/llvm-project/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp:925
#8 0x00007fffe4880201 in mlir::translateModuleToLLVMIR (module=0x5555556752c0, llvmContext=..., name=...)
at /path/to/llvm-project/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp:1566
#9 0x00007ffff6c17c69 in Fortran::frontend::CodeGenAction::generateLLVMIR (this=0x5555555998b0)
at /path/to/llvm-project/flang/lib/Frontend/FrontendActions.cpp:777
#10 0x00007ffff6c192f7 in Fortran::frontend::CodeGenAction::executeAction (this=0x5555555998b0)
at /path/to/llvm-project/flang/lib/Frontend/FrontendActions.cpp:1148
#11 0x00007ffff6c10650 in Fortran::frontend::FrontendAction::execute (this=0x5555555998b0)
at /path/to/llvm-project/flang/lib/Frontend/FrontendAction.cpp:112
#12 0x00007ffff6be0c11 in Fortran::frontend::CompilerInstance::executeAction (this=0x555555594970, act=...)
at /path/to/llvm-project/flang/lib/Frontend/CompilerInstance.cpp:173
#13 0x00007ffff71952b7 in Fortran::frontend::executeCompilerInvocation (flang=0x555555594970)
at /path/to/llvm-project/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:221
#14 0x000055555555e2c5 in fc1_main (argv=..., argv0=0x7fffffffe4ca "/path/to/build/bin/flang-new")
at /path/to/llvm-project/flang/tools/flang-driver/fc1_main.cpp:67
#15 0x0000555555557509 in executeFC1Tool (argV=...) at /path/to/llvm-project/flang/tools/flang-driver/driver.cpp:66
#16 0x00005555555579de in main (argc=19, argv=0x7fffffffe1d8) at /path/to/llvm-project/flang/tools/flang-driver/driver.cpp:109
```
The following is a similar program but an array size is smaller.
```fortran
! small_test.f90
type t1
complex :: c = (0.0, 0.0)
end type t1
type(t1) val(100)
print *, val(50)
end
```
That can be compiled normally, but Flang generates large MLIR with LLVM dialect.
I suspect this is the cause of the abnormal termination.
```console
$ flang-new -Xflang -save-temps small_test.f90
$ cat small_test-llvmir.mlir
module attributes {dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<i1, dense<8> : vector<2xi64>>, #dlti.dl_entry<!llvm.ptr, dense<64> : vector<4xi64>>, #dlti.dl_entry<f16, dense<16> : vector<2xi64>>, #dlti.dl_entry<i32, dense<32> : vector<2xi64>>, #dlti.dl_entry<i16, dense<[16, 32]> : vector<2xi64>>, #dlti.dl_entry<i8, dense<[8, 32]> : vector<2xi64>>, #dlti.dl_entry<f64, dense<64> : vector<2xi64>>, #dlti.dl_entry<i128, dense<128> : vector<2xi64>>, #dlti.dl_entry<f128, dense<128> : vector<2xi64>>, #dlti.dl_entry<i64, dense<64> : vector<2xi64>>, #dlti.dl_entry<"dlti.stack_alignment", 128 : i64>, #dlti.dl_entry<"dlti.endianness", "little">>, fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.data_layout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128", llvm.target_triple = "aarch64-unknown-linux-gnu"} {
llvm.func @_QQmain() attributes {frame_pointer = #llvm.framePointerKind<"non-leaf">} {
%0 = llvm.mlir.constant(1 : i32) : i32
:
llvm.return
}
:
llvm.mlir.global internal @_QFEval() {addr_space = 0 : i32} : !llvm.array<100 x struct<"_QFTt1", (struct<(f32, f32)>)>> {
%0 = llvm.mlir.constant(0.000000e+00 : f32) : f32
%1 = llvm.mlir.undef : !llvm.struct<"_QFTt1", (struct<(f32, f32)>)>
%2 = llvm.mlir.undef : !llvm.struct<(f32, f32)>
%3 = llvm.insertvalue %0, %2[0] : !llvm.struct<(f32, f32)>
%4 = llvm.insertvalue %0, %3[1] : !llvm.struct<(f32, f32)>
%5 = llvm.insertvalue %4, %1[0] : !llvm.struct<"_QFTt1", (struct<(f32, f32)>)>
%6 = llvm.mlir.undef : !llvm.array<100 x struct<"_QFTt1", (struct<(f32, f32)>)>>
%7 = llvm.insertvalue %5, %6[0] : !llvm.array<100 x struct<"_QFTt1", (struct<(f32, f32)>)>>
%8 = llvm.insertvalue %5, %7[1] : !llvm.array<100 x struct<"_QFTt1", (struct<(f32, f32)>)>>
%9 = llvm.insertvalue %5, %8[2] : !llvm.array<100 x struct<"_QFTt1", (struct<(f32, f32)>)>>
%10 = llvm.insertvalue %5, %9[3] : !llvm.array<100 x struct<"_QFTt1", (struct<(f32, f32)>)>>
:
%106 = llvm.insertvalue %5, %105[99] : !llvm.array<100 x struct<"_QFTt1", (struct<(f32, f32)>)>>
llvm.return %106 : !llvm.array<100 x struct<"_QFTt1", (struct<(f32, f32)>)>>
}
llvm.mlir.global linkonce_odr constant @_QFE.c.t1() comdat(@__llvm_comdat::@_QFE.c.t1) {addr_space = 0 : i32} : !llvm.array<1 x struct<"_QM__fortran_type_infoTcomponent", (struct<(ptr, i64, i32, i8, i8, i8, i8)>, i8, i8, i8, i8, array<4 x i8>, i64, struct<"_QM__fortran_type_infoTvalue", (i8, array<7 x i8>, i64)>, struct<(ptr, i64, i32, i8, i8, i8, i8, ptr, array<1 x i64>)>, struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>, ptr, array<1 x i64>)>, struct<(ptr, i64, i32, i8, i8, i8, i8, array<2 x array<3 x i64>>, ptr, array<1 x i64>)>, struct<"_QM__fortran_builtinsT__builtin_c_ptr", (i64)>)>> {
%0 = llvm.mlir.constant(0 : index) : i64
%1 = llvm.mlir.constant(0 : i64) : i64
%2 = llvm.mlir.constant(0 : i8) : i8
%3 = llvm.mlir.constant(4 : i8) : i8
%4 = llvm.mlir.constant(2 : i8) : i8
%5 = llvm.mlir.constant(1 : i8) : i8
%6 = llvm.mlir.undef : !llvm.array<1 x struct<"_QM__fortran_type_infoTcomponent", (struct<(ptr, i64, i32, i8, i8, i8, i8)>, i8, i8, i8, i8, array<4 x i8>, i64, struct<"_QM__fortran_type_infoTvalue", (i8, array<7 x i8>, i64)>, struct<(ptr, i64, i32, i8, i8, i8, i8, ptr, array<1 x i64>)>, struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>, ptr, array<1 x i64>)>, struct<(ptr, i64, i32, i8, i8, i8, i8, array<2 x array<3 x i64>>, ptr, array<1 x i64>)>, struct<"_QM__fortran_builtinsT__builtin_c_ptr", (i64)>)>>
%7 = llvm.mlir.undef : !llvm.struct<"_QM__fortran_type_infoTcomponent", (struct<(ptr, i64, i32, i8, i8, i8, i8)>, i8, i8, i8, i8, array<4 x i8>, i64, struct<"_QM__fortran_type_infoTvalue", (i8, array<7 x i8>, i64)>, struct<(ptr, i64, i32, i8, i8, i8, i8, ptr, array<1 x i64>)>, struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>, ptr, array<1 x i64>)>, struct<(ptr, i64, i32, i8, i8, i8, i8, array<2 x array<3 x i64>>, ptr, array<1 x i64>)>, struct<"_QM__fortran_builtinsT__builtin_c_ptr", (i64)>)>
%8 = llvm.mlir.addressof @_QFE.n.c : !llvm.ptr
%9 = llvm.mlir.constant(40 : i32) : i32
%10 = llvm.mlir.zero : !llvm.ptr
%11 = llvm.getelementptr %10[1] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<1 x i8>
%12 = llvm.ptrtoint %11 : !llvm.ptr to i64
%13 = llvm.mlir.undef : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%14 = llvm.insertvalue %12, %13[1] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%15 = llvm.mlir.constant(20180515 : i32) : i32
%16 = llvm.insertvalue %15, %14[2] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%17 = llvm.mlir.constant(0 : i32) : i32
%18 = llvm.trunc %17 : i32 to i8
%19 = llvm.insertvalue %18, %16[3] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%20 = llvm.trunc %9 : i32 to i8
%21 = llvm.insertvalue %20, %19[4] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%22 = llvm.mlir.constant(0 : i32) : i32
%23 = llvm.trunc %22 : i32 to i8
%24 = llvm.insertvalue %23, %21[5] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%25 = llvm.mlir.constant(0 : i32) : i32
%26 = llvm.trunc %25 : i32 to i8
%27 = llvm.insertvalue %26, %24[6] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%28 = llvm.insertvalue %8, %27[0] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%29 = llvm.mlir.constant(1 : i64) : i64
%30 = llvm.mlir.constant(40 : i32) : i32
%31 = llvm.mlir.zero : !llvm.ptr
%32 = llvm.getelementptr %31[1] : (!llvm.ptr) -> !llvm.ptr, i8
%33 = llvm.ptrtoint %32 : !llvm.ptr to i64
%34 = llvm.mul %33, %29 : i64
%35 = llvm.mlir.undef : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%36 = llvm.insertvalue %34, %35[1] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%37 = llvm.mlir.constant(20180515 : i32) : i32
%38 = llvm.insertvalue %37, %36[2] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%39 = llvm.mlir.constant(0 : i32) : i32
%40 = llvm.trunc %39 : i32 to i8
%41 = llvm.insertvalue %40, %38[3] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%42 = llvm.trunc %30 : i32 to i8
%43 = llvm.insertvalue %42, %41[4] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%44 = llvm.mlir.constant(1 : i32) : i32
%45 = llvm.trunc %44 : i32 to i8
%46 = llvm.insertvalue %45, %43[5] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%47 = llvm.mlir.constant(0 : i32) : i32
%48 = llvm.trunc %47 : i32 to i8
%49 = llvm.insertvalue %48, %46[6] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%50 = llvm.extractvalue %28[0] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%51 = llvm.mlir.constant(0 : i64) : i64
%52 = llvm.mlir.constant(1 : i64) : i64
%53 = llvm.insertvalue %50, %49[0] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
%54 = llvm.insertvalue %53, %7[0] : !llvm.struct<"_QM__fortran_type_infoTcomponent", (struct<(ptr, i64, i32, i8, i8, i8, i8)>, i8, i8, i8, i8, array<4 x i8>, i64, struct<"_QM__fortran_type_infoTvalue", (i8, array<7 x i8>, i64)>, struct<(ptr, i64, i32, i8, i8, i8, i8, ptr, array<1 x i64>)>, struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>, ptr, array<1 x i64>)>, struct<(ptr, i64, i32, i8, i8, i8, i8, array<2 x array<3 x i64>>, ptr, array<1 x i64>)>, struct<"_QM__fortran_builtinsT__builtin_c_ptr", (i64)>)>
%55 = llvm.insertvalue %5, %54[1] : !llvm.struct<"_QM__fortran_type_infoTcomponent", (struct<(ptr, i64, i32, i8, i8, i8, i8)>, i8, i8, i8, i8, array<4 x i8>, i64, struct<"_QM__fortran_type_infoTvalue", (i8, array<7 x i8>, i64)>, struct<(ptr, i64, i32, i8, i8, i8, i8, ptr, array<1 x i64>)>, struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>, ptr, array<1 x i64>)>, struct<(ptr, i64, i32, i8, i8, i8, i8, array<2 x array<3 x i64>>, ptr, array<1 x i64>)>, struct<"_QM__fortran_builtinsT__builtin_c_ptr", (i64)>)>
:
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsXFtz2ziy_jX0C4oqEiRF8sEPsmRlXetsMhnvzHlTgWBTQkKCPADo2Pn1pwDeZV1sx07t1knKY4u4NPprNPprABwRKdmWA1xawZUVrC5IrXaluHyspRe6jp19vUjK9PHybsckYhIRjpiUNaBMlAVa11-ZkjVSIJWsmYKZ5awsZ9H8XueEb20O35ECUTBOFEhEEl6KguT5I_q-A45oWVQsZ3yL1A5QVuZ5-V0_VaLcClK0Av_WTW8Q3QH9Bin6ztTOtLfmjiora-5oOQXhqYWXutDCwcfrj7p8K0ham-EYpwKIhBSpErmObtNKv1FIAhQSqR1RiKC8VKjMUAFFKR7RdyJRLSGdYLvbgQBtEF5qVZMcikarbVYKJcgYWMmNrpIUgApCd4zDvqwRcCLANNc27aygUQ3WJDzdH4YoVnIkQNa50o11EzOmIvQbUoJQ0Ih6GZPxtb3MTyuzLcWu0WGWxU5TgpB6rAApt3tEZvQcHpDlLSxvgSiyvBWycOTMHK2G-RN3zUErNZGgnywcKdfCMbonuYUj1zH_-m5d50owrpCFF1pu0zSYtgSe7uHZe6Qll2UOHTwfZb1J7fseK2rqh7p7EFJb141mzszZMq1FtFOqkho1Xlt4vWVqVyczWhYWXuf5fffHrkT5Faia6V6YZM48DpIoDGLXdX0fUjcLEx-CeRgnEDhOEs1JGPaA7ojYgtJ2JUTQ3dy3a_6Nl9-5nTNeP9hbXncOJICkqChTyHXzqpTsoXVtLhXJc0hXTOgqC68ronYWXqvSwmvWVFt4nbB23tdlzVNECU9ZShSgD8slapsZL2ullJXSwCm18Np1Z1jP9DpnSV94XOe-gxnvT8iBKkjffaBlD6moc8W0CG-BZpZ3ZflOMff31DnVCFkYn7QkXvf-Y2GM7Iy6yFaCVTkcn0xkQ8GUXSZfdYcyL4WdMrLlpVSMSmQXAvKSGtvYZq5RxSiyK0btHO4hR7h5YNKuGCBbGf-xaVWjLXAQunFblgFRtQBk4SsOJT9Ufh8RZBeZIAXYVcm4AmF5K15yOweSIbvUk6OKSv8GqezMC12CZyWyH1AWBzatKpvxqlZ7UWQwjLdAIERp_LLmJMlBR2Z4AFor6AO6t0D_ZNqDT3U3pZqTuNJRpu2LMsJySFFaG8ma6EiuV28twSz5Usd9xPh9a9Z-6f2_Xf0T8_JSgf47eCEq5NYIamPoT_yMovvn2-vFn9docXe3WP4D3f3jGq0_3d5--vvmXx_Q-ub2-k9098kUX_37A_py_fnTlztt_KavgEqUFKQmdlnWgmpGkZpQtAcQKUvKiF7QouZIUsF0PGkbCEBmRUGKiOpFPtcGE_eHIAFv33teLmAmd6-ZiLeajucyZ59-PCXOlWD3jBvlDray81F5jgpkyx0RkNo5S3RAN0L-LXUqlNQsVzbjSFZAZZuzLD_d3l4v7zYflkvLW20nOUtXd3v3afP3l8Xnz9dfLG9l4XUtRcMaOro8YQ4B6Y6oZl1ZeB3ppqq0vwtSVSCOLcdJr2b4kmdsW4s2QzXMMbPwmnblyLbBBDo7KUsllSDVUKQnvCZbkJa3ohZeUgtfmZ9lhxEvc1Ui264EZOyhR4ZsW0c7vcQHrMaoFl4X2sw241l5pIGuQratFbaTeluL3PJWOsD18S2ptz9YnpNZg7gNdF3pAKCZx-FZmcCk4ZiQNFSYNN74yEpArnPyoa6j3U4l-SgVFPaPpqhttNnQB7IhCh6YQradMtlYkCU1_854asMDhUpHdDl02vLarjn73xo0xQJVI9Mz_g2Erf0ttVnajb2l1C7I11LYLQvYJc8fu9q2047InS3VYw7aHTWLd1KrvN4yPjwzzlTGOLOJEKQXw2Q-hVBUD1OlmZ5boMrOak5Nom83qlre6rgznqCFLaU9r0Uzb-Yi7LixEzihJrcvkKJ_ENXU2L4OlBaO9HLTn9r8x-tjjn86dHTNPAc5DzpfD7Msy5zYybIwQYwjQ5hm-7AsNR9x1TxtQS22WwFbouA6hwJM-h-pHdMe5TyEWUYD7M3TyDV7jetcWd7KdcM4CEabDoSI2ue9MTmPKNvklDdfLLzuNJEzWul14GOvx-GiCZAoc7BLDwNZl3l6wyUI9RfJa9BsLOpmBi0cLbbbg0D-IrkpD8y_eB7OHVN-kz5o5DMdUt4GntavRTh3gh4hngAkaRzE8-MAdVqoy_bA7s-V-ZfESaShvAL6LZPqJ9AzTvM6haHgiSFAzHTEdv3BEN7IEGlGvDT0vakhbr5c6YUI4opIaG0jgCg4bwnfeaUleidYon-RAt7cKD0mYw_sx1FvEH9qEDcMwdcGoSW_B6E-VSBMHn1TVCbPLivt84O-SSN4KCjKtM7hThAuu03fM9A0wU8_lLnUHJczMYHTFqwYyRvAt7d_fTTg9Iel0VZHPzljnGqQrttjDKYYcUKpiVMWjggv-WNR1hJxUoCsiM4142bateB2vGawEagbvXnKdGvTdN9aEwdpJjyANPTMhJfVqDjKkiTWxYN1XmDS837R2q0JFW3GMzLeEXvelU8Qd3HTHRbTfGRX8KOQJDjUdjVj9iZsPn18iuGs4fqVRZ3BcMf8TgAtRRuutB9Y3iojuYSXLaMz5nqCorVKGAxsEu5ZJSE4ep1VPuRlQnJ5wia_AFqMhwmPptAiBzvuFJpq-0MrrvUjDaHx4pHrz8MAUzOxWtOl3ug_jCILf2UkfCVON5jPe6DxmC_n1A3pPNZA123abrB2ZxMdgabwAfiCDtNojmiIgsEG-zEhjqPkhdNodpE9vnWnw_Cx0aDLc8IwHPIcZw9WjLPw5bDa45wFPRbp3h-V6_oDhbnuHixnHjhnYE3FTnD9WkQ9IDzgmWRr8wQc6rpnp6moWA7CHA_xjpbOz5Qfh2YFEvqqVOwoyH19OpjhKOse52JZ6MYBTs55YwtokN4d82lwjTJP0f08oLuyzC28vj42eosO4yHncLvEKujoH9NAo8uouylIm32I7f0Q8PSTMwny4FNy4GC6S5aeHku_DmyXdDWSUsHuQUfQTtNuPzEKJMEeuDBwTHxs52e9dLXJWoh_vSBdOaNS86FTaIjX7nxfoTgFw0yDpaneS8adoad2dtPozdVznfjwxvnADSGTiCDJCpYT0d0QoqRWiHDUHC1I9sNcTsqC5DmIZ972mdab977zO3Lp97wLv_OXfa29iEKUcJRAe0EKKerunZuEUDWXoaijXYlyzf7o4-3Nl-YmVxMxSpuUt7soRrKWFVCFVHsfrnaAKKmluV7VD939dn_nrVf8Qfufuo78n-ZCw5bkHmwFRSUPzo7uRYka1dnaB5mYmbzGtGkyKUSUEiypNVArvEpzxWZpvtFg2vnzxmWWtxyVAFfi0fKWzNW2S4Hrve4ysrxr7QToHqgqheUt8QOb-5Z3rX_wEh2QYGFXKzirlBiLMr2msvyzsjJ3Ppbhzl-hD_PwWIaHXyNjqocVXDUFHraC1WvkRXviop-Rls39M5Z-DkI80Uk_vkKTN5HC3gCPhbEpMm9HbEjOtrwArgwlLpGLIyOwlXJaBPCUEc5Byra3hXHOlMpBP_dKZEzMUshInatvjKftksPEpX4aMT_3hd_21y11k4JUXau2xiyclCiyycljWauuGuxCJzs2iyxvof_zsK190luYX_pJI1nMfdtMpLdwcWRz7eu67E8zLcMIzU3wpr2s7hQ9fseOrXClQ0oXt42QrOYUWb6z-eMPTaoWbhlzHIPM1fKmvVruglDTW9d8bir-yXQ6p-3dXT23hp2OipCFA8dIMSJ0_JvR7kAZR24zpXq5x_3Hvu9wnq0fjAABqha8K7TC1f7JNxoNtDV7b2QUNlfMGvn6umEtM2J4RdJUbMyZkdHS6bXQQMxtYBMaDYPr5eE46AE1J8aNATZ_rO80a7Z-Fo3qoqwJZOZPbJwubrzvJUZyZs3LN2DhK6dRMBsslo0tZuHA3RNU8xSyCZSfVH48GH7JYE8FjkV5gyhmDoDu21PawGl0C7AVXDlWsHq2fDQZwD87gKdJ4vUDBEcH8NsB3DMIXjEdUxXmZ-fjjf14Mnp41ABBa4D5IQO8-dIa6xSd1Sk8NOvvqlN8VqfICq7wL9XJdc4qFVvBlffrlBrFdKPf_KyCrhNYwVUc_zodR5w0KPnui22gvadklzP-reQUNmUqUEciHfPN6EwPariPlkVKNL3ouo2Ws2mLzAZy2uN1VPkE88fNpt3ebvR2c8N4Vt7pnWDJh0RvzxrtnqRNMNudQZOM7_-O27TucO0SdYr56EGXtI0bwc9Q1PjboORUZvhEZqfNK8EsUdt4bM4u-f1p2WOh3WdvGKCR_isUwG-nwHTezFtKjMu7TfdxQzdGYD-Bwyy9Jitr3J-n8NAnr_2LqIdTsae95_6xvvuZ1dO-Ud81OpZI7ff0T_f0j_fEp3sGZ1P8Yz1fkLH8Die_w8l_VTg5lhw_a1_227l_O_d_rnMf2WIZz9Z5IkhZZn3ayWd04ula9JEN0RPKck4eEe3tXEzvHyDKk8O5I2LegoLmNcZKiUbcdD8YTQ7HY2SbPGF6YH6IqhoHnww74vRKCVU2NymNOhNtkSpHCYFusk_qpw9aXhoHhnGOH5K4rSsE7tljkhcOv7cRPZFLYMeNnKbFaZc4vld0-82if2iP_XYw9uP90wTuhP6jJaWEObRtJZq2xj2maZR7_EzBjTrE80Mb-DdDjJ0DSscndMbuUZ1xdyTnxlZw5b-fzufT7OOzhL0DgDE-hfj48sJeixi7VnAVvB_iE8vrBGLdc34IbnAK7vEDQTzv4OplOH8_uMfP_7plgcNz58o_p8EJcnPP7QK9ExvQ88zo7W9AzzKjh08wo-e-nBn396beYQr08GkKbHuPN6h13gjsZjFGhy247-_vwZztUMdZx-tuALzgXcnTO8E6zyVP7_iS8cIOxvxdydM7sWbOer1_iIe8U0TkHyciv78bit6VPH18SGnnlNLHL8z8LlXz3XdlT__EgdHpm13dOTiA2PdPIT6-vvwuq_O9d2VP_3VZne55KKXzT6V0_vGUzu-4y5-_K3uOzz_hQQlCRwwevStt_tTh6anT07Oce-Imur8p9uP3BX88Tww6wjuXtfw-Qvp9hPRUgf-cI6Q9jz_-8kQX2gP_TOr02-N_e_x_iceP_k_t7r3ji_TSS2MvJhdw6YZO4PiO78cXu8uMhpSQGM-zAJw4oXEWJS4NCHbiOI4DuGCX2MG-47rYmWPHj2ckdtyYehnFfui5QC3fgYKwfGZWTCm2F-bLwi7DMArDi5wkkEvzRWMYt___xYIZGMHqQlya1-eTeist38mZVHIQo5jKzVeUmZe29dJcjr73qswQaV_fbt5_NwUpCHYP7evn5o1uwhHjTDGSsx-QogKKBATiAKnc_9avi1rkly_7mhcLrw1aaeG1Afx_AQAA__9qBxVt">