<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/67862>67862</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [libtooling] DefineImplicitCopyAssignment crashes on structure with array member
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          smcpeak
      </td>
    </tr>
</table>

<pre>
    When using the Clang C++ libtooling API, if I call [`Sema::ForceDeclarationOfImplicitMembers`](https://clang.llvm.org/doxygen/classclang_1_1Sema.html#a13e40364e7b40a2311e03d010610bd34) to declare implicit class members, then call [`Sema::DefineImplicitCopyAssignment`](https://clang.llvm.org/doxygen/classclang_1_1Sema.html#a9602b94884ae339923cea1858fb2c029) to define the copy assignment operator, for a class that has an array-typed member, it crashes inside `Sema::PushOnScopeChains`.

Example input:

```c++
// test.cc
// Test input for define-implicit.exe.

struct HasArray {
  int arr[2];
};

// EOF
```

Program to run:

```c++
// define-implicit.cc
// Force definition of implicit members.

#include "clang/AST/RecursiveASTVisitor.h" // clang::RecursiveASTVisitor
#include "clang/Frontend/ASTUnit.h" // clang::ASTUnit
#include "clang/Frontend/CompilerInstance.h"               // clang::CompilerInstance
#include "clang/Frontend/CompilerInvocation.h" // clang::CompilerInvocation
#include "clang/Frontend/Utils.h" // clang::createInvocation
#include "clang/Sema/Sema.h"                               // clang::Sema
#include "clang/Serialization/PCHContainerOperations.h" // clang::PCHContainerOperations

using clang::dyn_cast;


// Declare and define all implicit class members.
class DefineImplicit : public clang::RecursiveASTVisitor<DefineImplicit> {
public:      // data
  // The ASTUnit we want to process.
  clang::ASTUnit *m_astUnit;

public:      // methods
  DefineImplicit(clang::ASTUnit *astUnit)
    : m_astUnit(astUnit)
  {}

  ~DefineImplicit()
 {}

  clang::Sema &getSema()
    { return m_astUnit->getSema(); }
  clang::ASTContext &getASTContext()
    { return m_astUnit->getASTContext(); }
  clang::SourceManager &getSourceManager()
    { return m_astUnit->getSourceManager(); }

 // Visit everything.
  bool shouldVisitTemplateInstantiations() const
 { return true; }
  bool shouldVisitImplicitCode() const
    { return true; }

  bool VisitCXXRecordDecl(clang::CXXRecordDecl *decl);
 bool VisitCXXMethodDecl(clang::CXXMethodDecl *decl);
};


bool DefineImplicit::VisitCXXRecordDecl(clang::CXXRecordDecl *decl)
{
 getSema().ForceDeclarationOfImplicitMembers(decl);
  return true;
}


bool DefineImplicit::VisitCXXMethodDecl(
 clang::CXXMethodDecl *decl)
{
  // Check the the common preconditions for a method that can be
  // implicitly defined.
  if (!( decl->isDefaulted() &&
         !decl->doesThisDeclarationHaveABody() &&
         !decl->isDeleted() )) {
    return true;
  }

 clang::SourceLocation loc = decl->getLocation();

  llvm::outs() << "visiting method \"" << decl->getNameAsString()
               << "\" with type \"" << decl->getType().getAsString()
               << "\" at " << loc.printToString(getSourceManager())
               << "\n";
  llvm::outs().flush();

  if (auto ctor = dyn_cast<clang::CXXConstructorDecl>(decl)) {
    if (ctor->isDefaultConstructor()) {
 getSema().DefineImplicitDefaultConstructor(loc, ctor);
    }

 else if (ctor->isCopyConstructor()) {
 getSema().DefineImplicitCopyConstructor(loc, ctor);
    }

    else if (ctor->isMoveConstructor()) {
 getSema().DefineImplicitMoveConstructor(loc, ctor);
    }
  }

 else if (auto dtor = dyn_cast<clang::CXXDestructorDecl>(decl)) {
 getSema().DefineImplicitDestructor(loc, dtor);
  }

  else if (decl->isCopyAssignmentOperator()) {
 getSema().DefineImplicitCopyAssignment(loc, decl);
  }

  else if (decl->isMoveAssignmentOperator()) {
 getSema().DefineImplicitMoveAssignment(loc, decl);
  }

  return true;
}


int main(int argc, char **argv)
{
 std::vector<char const *> commandLine;
 commandLine.push_back(CLANG_LLVM_INSTALL_DIR "/bin/clang");
  for (int i = 1; i < argc; ++i) {
    commandLine.push_back(argv[i]);
  }

 std::shared_ptr<clang::CompilerInvocation> compilerInvocation(
 clang::createInvocation(llvm::ArrayRef(commandLine)));
  if (!compilerInvocation) {
    return 2;
  }

  // Boilerplate.
 std::shared_ptr<clang::PCHContainerOperations> pchContainerOps(
    new clang::PCHContainerOperations());
  clang::DiagnosticOptions *diagnosticOptions =
    &(compilerInvocation->getDiagnosticOpts());
 clang::IntrusiveRefCntPtr<clang::DiagnosticsEngine> diagnosticsEngine(
 clang::CompilerInstance::createDiagnostics(
      diagnosticOptions /*callee takes refcount ownership*/));

  // Run the Clang parser to produce an AST.
  std::unique_ptr<clang::ASTUnit> ast(
 clang::ASTUnit::LoadFromCompilerInvocationAction(
 compilerInvocation,
      pchContainerOps,
 diagnosticsEngine));
  if (ast == nullptr || diagnosticsEngine->getNumErrors() > 0) {
    return 2;
  }
 clang::TranslationUnitDecl *tu =
 ast->getASTContext().getTranslationUnitDecl();

  llvm::outs() << "---- before ----\n";
  tu->dump(llvm::outs());
 llvm::outs().flush();

  llvm::outs() << "---- defining implicit members... ----\n";
  llvm::outs().flush();
  DefineImplicit di(ast.get());
  di.TraverseDecl(tu);

  llvm::outs() << "---- after ----\n";
  tu->dump(llvm::outs());
 llvm::outs().flush();

  return 0;
}


// EOF
```

`Makefile`:

```
# define-implicit/Makefile

# ---- Configuration ----
# Set to 1 if I am using a build from source, 0 for a binary
# distribution.
USE_SOURCE_BUILD := 0

ifeq ($(USE_SOURCE_BUILD),1)
  # Use my own build.
  CLANG_LLVM_SRC_DIR = $(HOME)/wrk/clang/llvm-project
  CLANG_LLVM_INSTALL_DIR = $(CLANG_LLVM_SRC_DIR)/build

else
  # Installation directory from a binary distribution.
  # Has five subdirectories: bin include lib libexec share.
  CLANG_LLVM_INSTALL_DIR = $(HOME)/opt/clang+llvm-16.0.0-x86_64-linux-gnu-ubuntu-18.04

endif

# Let the user override my defaults.
-include pre-config.mk


# ---- llvm-config query results ----
# Program to query the various LLVM configuration options.
LLVM_CONFIG := $(CLANG_LLVM_INSTALL_DIR)/bin/llvm-config

# C++ compiler options to ensure ABI compatibility.
LLVM_CXXFLAGS := $(shell $(LLVM_CONFIG) --cxxflags)

# Directory containing the clang library files, both static and dynamic.
LLVM_LIBDIR := $(shell $(LLVM_CONFIG) --libdir)

# Other flags needed for linking, whether statically or dynamically.
LLVM_LDFLAGS_AND_SYSTEM_LIBS := $(shell $(LLVM_CONFIG) --ldflags --system-libs)


# ---- Compiler options ----
# C++ compiler.
CXX = $(CLANG_LLVM_INSTALL_DIR)/bin/clang++

# Compiler options, including preprocessor options.
CXXFLAGS =
CXXFLAGS += -Wall
CXXFLAGS += -Werror

# Silence a warning about a multi-line comment in DeclOpenMP.h.
CXXFLAGS += -Wno-comment

# Get llvm compilation flags.
CXXFLAGS += $(LLVM_CXXFLAGS)

ifeq ($(USE_SOURCE_BUILD),1)
  # When using my own build, I need to separately point at clang includes.
  CXXFLAGS += -I$(CLANG_LLVM_SRC_DIR)/clang/include
  CXXFLAGS += -I$(CLANG_LLVM_INSTALL_DIR)/tools/clang/include
endif

# Tell the source code where the clang installation directory is.
CXXFLAGS += -DCLANG_LLVM_INSTALL_DIR='"$(CLANG_LLVM_INSTALL_DIR)"'

# Switch to enable creation of .d files.
GENDEPS_FLAGS = -MMD


# Linker options.
LDFLAGS =

# Pull in clang+llvm via libclang-cpp.so, which has everything, but is
# only available as a dynamic library.
LDFLAGS += -lclang-cpp

# Arrange for the compiled binary to search the libdir for that library.
# Otherwise, one can set the LD_LIBRARY_PATH envvar before running it.
# Note: the -rpath switch does not work on Windows.
LDFLAGS += -Wl,-rpath=$(LLVM_LIBDIR)

# It appears that llvm::raw_os_ostream::~raw_os_ostream is missing from
# libclang-cpp, so I have to link with LLVMSupport statically.
LDFLAGS += -lLLVMSupport

# Get the needed -L search path, plus things like -ldl.
LDFLAGS += $(LLVM_LDFLAGS_AND_SYSTEM_LIBS)

# Optional custom modifications.
-include config.mk


# ---- Recipes ----
# Default target.
all:
.PHONY: all

# Pull in automatic dependencies.
-include $(wildcard *.d)

# Compile a C++ source file.
%.o: %.cc
        $(CXX) -c -o $@ $(GENDEPS_FLAGS) $(CXXFLAGS) $<

OBJS :=
OBJS += define-implicit.o

# Executable.
all: define-implicit.exe
define-implicit.exe: $(OBJS)
        $(CXX) -g -Wall -o $@ $(OBJS) $(LDFLAGS)

# Test.
.PHONY: check
check: define-implicit.exe test.cc
        ./define-implicit.exe test.cc

.PHONY: clean
clean:
        $(RM) *.o *.d *.exe
        $(RM) -r out


# EOF
```

Output of `lldb -- ./define-implicit.exe test.cc`:

```
[...]
visiting method "operator=" with type "HasArray &(const HasArray &)" at test.cc:4:8
Process 406256 stopped
* thread #1, name = 'define-implicit', stop reason = signal SIGSEGV: invalid address (fault address: 0x8)
    frame #0: 0x00007fffef85d019 libclang-cpp.so.16`clang::Sema::PushOnScopeChains(clang::NamedDecl*, clang::Scope*, bool) + 25
libclang-cpp.so.16`clang::Sema::PushOnScopeChains:
-> 0x7fffef85d019 <+25>: testb  $-0x80, 0x8(%rdx)
    0x7fffef85d01d <+29>: jne    0x7fffef85d03f            ; <+63>
    0x7fffef85d01f <+31>: nop 
    0x7fffef85d020 <+32>: movq   0x168(%r15), %rdi
(lldb) bt
* thread #1, name = 'define-implicit', stop reason = signal SIGSEGV: invalid address (fault address: 0x8)
  * frame #0: 0x00007fffef85d019 libclang-cpp.so.16`clang::Sema::PushOnScopeChains(clang::NamedDecl*, clang::Scope*, bool) + 25
    frame #1: 0x00007fffef861392 libclang-cpp.so.16`clang::Sema::LazilyCreateBuiltin(clang::IdentifierInfo*, unsigned int, clang::Scope*, bool, clang::SourceLocation) + 738
    frame #2: 0x00007fffefb8313a libclang-cpp.so.16`clang::Sema::LookupBuiltin(clang::LookupResult&) + 3930
    frame #3: 0x00007fffefb8fda6 libclang-cpp.so.16`clang::Sema::LookupName(clang::LookupResult&, clang::Scope*, bool, bool) + 742
    frame #4: 0x00007fffef94520c libclang-cpp.so.16`buildMemcpyForAssignmentOp(clang::Sema&, clang::SourceLocation, clang::QualType, (anonymous namespace)::ExprBuilder const&, (anonymous namespace)::ExprBuilder const&) + 716
    frame #5: 0x00007fffef92ede2 libclang-cpp.so.16`buildSingleCopyAssign(clang::Sema&, clang::SourceLocation, clang::QualType, (anonymous namespace)::ExprBuilder const&, (anonymous namespace)::ExprBuilder const&, bool, bool) + 178
 frame #6: 0x00007fffef92e748 libclang-cpp.so.16`clang::Sema::DefineImplicitCopyAssignment(clang::SourceLocation, clang::CXXMethodDecl*) + 2872
    frame #7: 0x0000555555558af4 define-implicit.exe`DefineImplicit::VisitCXXMethodDecl(clang::CXXMethodDecl*) + 756
    frame #8: 0x000055555564b35d define-implicit.exe`clang::RecursiveASTVisitor<DefineImplicit>::WalkUpFromCXXMethodDecl(clang::CXXMethodDecl*) + 93
    frame #9: 0x000055555556aeef define-implicit.exe`clang::RecursiveASTVisitor<DefineImplicit>::TraverseCXXMethodDecl(clang::CXXMethodDecl*) + 79
    frame #10: 0x000055555555a5ec define-implicit.exe`clang::RecursiveASTVisitor<DefineImplicit>::TraverseDecl(clang::Decl*) + 2620
    frame #11: 0x00005555555e9ff8 define-implicit.exe`clang::RecursiveASTVisitor<DefineImplicit>::TraverseDeclContextHelper(clang::DeclContext*) + 200
    frame #12: 0x00005555555683f5 define-implicit.exe`clang::RecursiveASTVisitor<DefineImplicit>::TraverseCXXRecordDecl(clang::CXXRecordDecl*) + 213
    frame #13: 0x000055555555a2bb define-implicit.exe`clang::RecursiveASTVisitor<DefineImplicit>::TraverseDecl(clang::Decl*) + 1803
    frame #14: 0x00005555555e9ff8 define-implicit.exe`clang::RecursiveASTVisitor<DefineImplicit>::TraverseDeclContextHelper(clang::DeclContext*) + 200
    frame #15: 0x000055555556f251 define-implicit.exe`clang::RecursiveASTVisitor<DefineImplicit>::TraverseTranslationUnitDecl(clang::TranslationUnitDecl*) + 513
    frame #16: 0x000055555555aaf6 define-implicit.exe`clang::RecursiveASTVisitor<DefineImplicit>::TraverseDecl(clang::Decl*) + 3910
    frame #17: 0x0000555555558ee3 define-implicit.exe`main + 899
    frame #18: 0x00007fffed50f0b3 libc.so.6`__libc_start_main + 243
    frame #19: 0x00005555555586fe define-implicit.exe`_start + 46
```

The above is observed with Clang-16.0.0.  The same thing happens with a trunk build from 2023-09-13.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUW1lz2zi2_jXMC0oqCtT6kAdZS-JbdpxrOdOZJxVEHkkYQwAbAGVrHua338JCiptsOT1dfdvV7cgkcPCdg-8sWESUojsO8DkY3ASD-SeS6b2Qn9UhToE8f9qI5PT5tz1wlCnKd0jvAc0Y4Ts0C_BNgG8QoxstBDMvp99vAzxDdItuUUwYQ0bmMFzBgQTRNIimSyFjmEPMiCSaCv6wvT2kjMZU38NhA1IFwzAYzAM83mudKtMJLwO8jM2IXcaOh66QuwAvE_F62gF3r5Sy79e9dc8M1d3rAwtwRHoR9MNo2IfRph8SHPV6EEZJ2AuHvXCTRP0AT5AWKLF4AFEPBVmR6OAR4ZlRmrcrNIct5ZArMRPpaWrteQCu_6u6TIYh3kz643GfQBRNJjiKgfTGg_F2g-MQTwpdDB47S7FIT4gUaJBIQRItpFFoKyQiXk-9JxrtiUKEIyIlOXX0KYXE62_nU6NYErUHhShXNAFUscH3TO0f-CoWKcz2hHIzid0gnAfh1P1evJJDygBRnmba9Cm9M0ay_8WOTv6ptRTSoHQ3jivPnkBpJ8lq4RTu5HPXhVeojK20zGKNvhI1NbqhYOSHQIhybRQOBjfYzFOUjz0qfS6PvHhY1jCXG32XYifJwUyCzPhHtKyrUFPY-oxrRI3PILE9U9WTtFuFG1Ees8zME8aWTgFeTldPAV4-QpxJRY8wXT39gyqqhezuA4yRH8y1ttPa0vQt-UspuAaeuKF-cKovCfavrxQ2E4eUMpC3XGnCY3BSqz_NMeq9PjzYUcQ2Ql1SotnyyiF-aMrUJamxBKLhOpnWAd0_bTap_zQHswLeHEBSwui_HRK8_D77OhNcE8pBPthgQgW_qEp76zJPXUIpdUlOfB0TpevuV_aGuQ_WhCd5sDNxuT12e7dwz6qhGgXRFKXZhtH4PdJHs2rXIFqcw4gTYYSVrZwQTfIwk8etPSDPfPQC6IVwbWJFKkUMKkeKWvwEBXh6WBOlrdNUTdM--gH0XiQqF1lDj8ftY-Qj4EneEVkjncfG42YbY4jRvIwJof80Rjx3aGtf4yQK8HAH2vF7XMUzukESdCb5GVYniBbV5tENKsaoW9RwEl61H-P84AMjNTpdHG8lMhnDPeFkBzJXq_zsI_q19CsPnNvXUcByF8ER5EnvKd8V_NoIwZDai4wlts0THFJmY44JlJp6N7XyUSy40ueJy6FpmUFN6brYc0WUQIuwqqoNeRWpVt7s589HiIVMjP9XKVx5ZYic2CaTwlWqYu6tc7SKOb9qE9NSF9jfVno9QhiJvwzcD5fDr5C7-34JjccNC9QsfVbo49pU7OfFX2PGmlI5UWd7iJ9tvepq1sNBcJRKiAVPbLmjfLHqgpqrVmPC0QZqkvIUwE4-MSQF6ekWWev1Ajy25b7xKarmsCUZ05B4hgZ4aP4rKOpjai_vkQhQT3vTr7D-V3KE6Y1ITleKMJ0ZlIe0lXvJLu1zhRrO0Qgzd75mQEzEKIjmhaI70Pm7Im5U_cwsRpwokenc-YNoFkQzUxAczdSbXO3nIBjMAoxt2ndtSiN9IweYqpWW1NQQ1ehWrkYK4U4YeqF6j8zC403pT6fUh5OuCcS_MA4xob8QzUTcTSXl-kkUoi7E2msG4Oaf85S1mbW7ZZnaX5gHx1OSaYFiLaSbxaIomlXdbGbiqVncCGm9MVqUPL_OKSfZtK1QvySjUBNdijzVqNAqgYnYLBjdX-X40-QvMAUNWGYB_QcwNbt_ABBC7ZjuxRH-AKZm92swvWkvS5DkXYLM4Up-vD3NTeRJA3nDliW059BX3R55KPYjPj7JpU2WM6pG0rsOlZmgP46qKuVDqK7OzZRrdCDURHG3d7FzRNoTU1xOTQ0vd8eWZKt04lhxhNitaGwfW5HZntHCpl7CkzvKS1mn9LCbZmq_3pD4OcDj2d3025f13d0_7te331ZP07u79fz20UZBvNxQnm9z2Qdl5U0u9_CpZW_PFH7m48zpY8pAu0VCGzHsEhir9OCG2s22tyxdmEHtiYRknWpZc5rmot5Zpv60rfJprN3x-JwA7ObTI2xNZCkZ2uWVCuiiVmkbtr1SwG-xy1dHN8LIsqV-91pzXFjCRwuUxvvSG3W2B0KIw8sV-wBFUj1DL3WaU7LjQmkaP6SuCDSVZPNhNC_FTlN6jZtW86VDRWTb-KXhb7mWmaJHeITtjOvvdcOcZakF31mPWaCk8bC1Pq5vTJW4UxJbsShCLaqbaZ3GhDEApMkzKCRhG4uMayReOEi1p6kNCsuaojViPGa8tKmfEqlA-o2JJIsBEY6mq6eilC5Ik3H6ewZN0uS7e9ECmaTUZoOiifnjTpBkKcWh6XvTuOZrLQ4xK1upwcr8bcvUtHodMeEwmpu4xDPGUi1RMJoFo1lTQl7uZoeFlEKei-YFCj_kp2XDPEnCFbOqGQPlSyidlZhO1KV9CFMSt0j4tZq_0-l00Aa2QgIyn5vVrc7smig7pJVId5ZWsfCHa-Fr8LlNcb5r7od3uxdQX42jvm-GEuoYYszcFr4S2n2S5AhSgTe7zn5VMbLVIP8au3uuhm-XIlcdiQTD8J48w5YyMG8uHInkAqP6QUiAl0X3ytCRtQyaCb6lu8xlFGesosEK7O5qz51FkoM_vSRok1GWoK0UB6TsKs9UUKHfY9hQTuSpBIgqLekmswcB7vGP1WK9evjxOFusb37c3s2RNe4cVRSnW_jdZfF-gMf1LnaKZr3yJiqO0A8F6HAysdthLCJuqdZaPc5cnRXNkZP99eF-YeUtX-TzuepammnvpFL8C2LdIqhStBXCmiM50RZPWT9TR5ex22TGXNhBCZW2yjw5K-dWbTOm6_2VKLSlR0Aq2-SdKaggmpquKD-ZYHRj_odXiJGtWNos1K7Y2Uoi1Wcr3Vgr9YbdsBt2XsfD9bDfYZRnr50dzzrZJuM66_TG3bBfUZ4ndFsn5J3h2x5QZrKnOIKUNLHzmbhlcr7B38m1SSV0Ykvg7uG5zb88yS1E1xD9noE8IQnKCKwRvnT86JoZNEciqcgUMqZBccVdhKsjPCxru9nDt-Xtl5zQDUqUTOtpYev8EsC6AvkNgTxx54MakMBVJgFNb27ta6LphjKqTxVAP38u76ZfVlVIag-M-c8l3CaKdjrx6-uWkZ06L4IKNPOCl7ErEvLrDJYNhlrS0NSEG3vovxF6j5QmmsbutOnEyYHGZYB3tzeOaNfCY9QwvAXcg96DRBY64gAJJDYkMcqf7a7UDL3swbZxiAhjJyRkDsr8WQE2t4ZbT7_N16t_rp4WFutHDMkSB6bTUSel4WCgN6xaj8e1aa4ytM4Gj3f282d7CLrAt9x3z6fo5xFqAOzdBetvZqpTCf6wTcga_UtEm9ef4BuDrvMbYezSKzAVYB3MijLgpn5GL0RarpGNyDQi6JAxTU2gcfvdYNbC3B5sPqTA77939w1Y-UhcdHyX-nBfQNtY4c3rnNxO4QVh5Xn3r2rT-ytZrHRTqJzMzEzcWmIb31eQEkk0sBNKhd3J0N4JfXQ8H4c2THD7dqrK858X9AExDbppIZi6JLI1CTwZfzIRxVUWKBYJGL-VUIoztD1X0kvz1JlfABnNAzyyGyzvaIJNuzo7X6iO9y4Qkw0DZFeg_nZJN3FR0CP6svg2X3xfrQsXQZ37-9aaMEJ3lD9D3b18NDp7VyltZYwZ9pczMjpSYsKxfdaJ07SrhIuANN7bm0rnc00bqDONqDrLFJydEDkSyqxmRCGSx8k8yteBeVOzYsg6zqmUhO_ABmV_UGVCTZIXN5bVRBqT7m2pklDpGxNdG7WI9y9U2fJTmEhAOFK-iLibm2j9OH385_r79OkrAn48EpmvxmTG3ZpHl-R9ExpMwWS6d2RKTOpyU5wIUIgLjV6EfEaCo98oT8RLY27yEMMCPHMSLMOKIOFyXUvqutWIpCkQ6a-SnVcckryshVoLpSUQ_-w_1YeIKnSgygYMUy6exZYJYIykBLpFe3IEY2uTF92RkcG2ytJUSF1KjZfmt9S6LYAa6_ns27nLJ9SaAs9QyjKjIeU7hRh9BtRhCWsfqGy29kzcVgJYnyEMxZnS4oAOIqFbGpOyJxXl4zWl4yPENIV6GvbnNkgTuYOcQia55cuz7vevD9_-achUpLymv5JMi4MtjRJIgSfAYwoNlM4OL5QlMZEJCvC0m7Ro7vM2IkWN4AOoiUIFyQddYUCZD8UNuXDio9_Pn7ZsiVFH2FH7oR-8ErzciavvUHkSzcqgHm7-J6-Vyg_c5Nav64m6OotXiDNtYk_Fum1XFd37thdWU4PUDF2yWU3hnatMGmr7XjkT52353aUslXPgPO_xHmJPLPexHXztemY46QZ4eUW72mAMiL_n5j6etwm8ro_3TpNpVzgK2d-F9WrtOhKJTLe7xdvbFQ-ZTjNtEmAwDBlLNqjTQe_p9O6-xuCm2-0GA0-kxlE6xsW9XBNuKwfhGJ-vrfrNba7Kd1nNw4k_1c4BRdN-EE39nul3V_CifjjEgyFSWqQp5Et5bNKFBGJQRD0T4jg5gC_GR43NmJGNwlqkSAJRgtuGiu5MyFrdflktvvzDzCflR8JogkiSSDN0gMcu4PgHpk34Wj2w30o7MI5C9zYMw3C03W5hOx4kYW9Srwa6vWEwDOtXGS9cRq7cuflGDuAvr0zt2VlJhunjH2-EYI50NwgPHNA_giGnSMfuD79WdDOxB9_gQRAtbAYHpTemmO53wtdxaLenjLnGAR7I5LVit4qkJJc08ZL-xaHeKNpW7y7c-D7DyPRpl7v1baKel8tFitrb4jBvi33bgzj-bhv1hrkOvYFbOiCrEM3JODYeZ2y-0f_P-GmA_C0YWnGlXgPosBdN8AeA3pF_U3aa2aOpm4wybU-ey8dkCXBNtxTkLd8KDyzj9vskCaJcv4t_dvkaU67cKBq3aIfr2m3GUS9qLBve0k6I5yxt1cu9erT7bC7GWiTRJApboERNKNuEDD8MxUz8OzjetWaZFaM-bkHbr6Od9Ac4jNvR2rX7PRzi9LQUsnxJogrU3YpoAKzNZ-Xl_2aEudtcM3vyxgU_HUSmrI-rlMT2jM42Xbym0sxTAv7Kgh_ql7p52_SGLbYZNGyDIYELLmNts6J8x-B8I-Vva5Z2CvVGue8VNhq22GjUH3-A7e_c5rnWUrWrqNMiGI5HbbwfnXEP_M-YbPutRfkwvPoC7BWARoM2ro3reIb9TTRILuD5-DcUXOPfCHv-kdrj9Y8Dn0QtuCcNOw4JwPa_jDs_SP0Vc7fVlb2wOf1kAPGfBLuJtk7SIW5LJb1eAyZMttvxnwjT3yD4Ciy1V11rmIsLBmfoYSty3OTFONoO_jxeXHWrvoy710bnXtRCDLzZ_FXE6I3DVpj9vy0xBk1ibPGg9ychb7__8vYVm5IOg3aSDFtIQrbDv4ok0aTXauq2HAfQuFfhYR4I5VbceNIaMse1TJ8Mwm24cRuzJsObBL9em7_WShOp14VA3G-1YjN1DMbDLVyA54Raef3hG7s2T3tAZCOOgKhCYqNAHiFxuyj2Sps_3-8i-w08ZcDYTVy0J2kKXLmmBGmZ8efy9RAc4qgTTjq9yG-QfUo-R8kkmpBP8Lk3nAxDPBhHw0_7z5MomoyxWf6OR8koGYyh30-GQ-j3JqNwMO5_op-NsHCCJxj3Rr1hl2wmoxA2_VEfDyISR0E_hAOhrPha-CeqVAafh6PxEH9iZANM2S_oY8zhBdmX9isH80_ysz2B32Q7FfRDRpVWZymaama_2X_-kn4wmKO3SrDiq96CI3f1O5PgjWR3ndwVq0-ZZJ-rX2zfUb3PNt1YHPy1gPo9FLy0wFWAl1ax_wsAAP__K74Iuw">