<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/87000>87000</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[llvm-cov][MC/DC] "Branch not found in Decisions" when handling complicated macros
</td>
</tr>
<tr>
<th>Labels</th>
<td>
tools:llvm-cov
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
whentojump
</td>
</tr>
</table>
<pre>
Example file `perfmon.c` (It currently looks tedious and should be able to be further minimized, I'll work on that)
```c
// A example simplified from https://elixir.bootlin.com/linux/v6.8.1/source/drivers/iommu/intel/perfmon.c
// Reproducible with clang version 18.1.3 (git@github.com:llvm/llvm-project.git
// 2498e3a07f3df2272fec885f53f09ae13214ca38) and Ubuntu clang version 18.1.3
// (++20240322073153+ef6d1ec07c69-1~exp1~20240322193300.86).
//
// Note that assertions *might* have to be enabled, therefore prebuilt packages
// from apt.llvm.org etc *might* not behave the same. E.g. as of Mar 28,
// llvm-cov-18 from apt.llvm.org ends up with "Segmentation fault", llvm-cov-19
// doesn't fail at least explicitly. On the other hand, if we build LLVM from
// source and enable assertion, we can observe explicit "UNREACHABLE executed"
// messages.
//
// Steps:
//
// $ rm -rf a.out *.profraw *.profdata
// $ clang -Wno-c23-extensions -fprofile-instr-generate -fcoverage-mapping -fcoverage-mcdc perfmon.c
// $ ./a.out
// $ llvm-profdata merge default.profraw -o default.profdata
// $ llvm-cov show --show-mcdc -instr-profile default.profdata a.out
//
// Dummy definitions to make this file compile.
// (Some of them are also kernel code but incomplete or modified)
struct attr {
long config1;
long config2;
};
struct hw_perf_event {
long idx;
long config;
};
struct perf_event {
struct hw_perf_event hw;
struct attr attr;
};
struct iommu_pmu {
long filter;
long cfg_reg;
struct perf_event *event_list[100];
long num_cntr;
long used_mask;
};
long test_and_set_bit(long, long) { return 0; }
long iommu_pmu_validate_per_cntr_event(struct iommu_pmu *, long, struct perf_event *) { return 1; }
void clear_bit(long, long) {}
void writeq(long, long) {}
void writel(long, long) {}
long iommu_config_base(struct iommu_pmu *, long) { return 0; }
long variable_ffs(long) { return 1; }
#define UL(X) X##UL
// Actually copied from kernel source
#define BIT(nr) (UL(1) << (nr))
#define ffs(x) (__builtin_constant_p(x) ? __builtin_ffs(x) : variable_ffs(x))
#define dmar_readq(a) readq(a)
#define dmar_writeq(a,v) writeq(v,a)
#define dmar_readl(a) readl(a)
#define dmar_writel(a, v) writel(v, a)
#define iommu_pmu_en_requester_id(e) ((e) & 0x1)
#define iommu_pmu_en_domain(e) (((e) >> 1) & 0x1)
#define iommu_pmu_en_pasid(e) (((e) >> 2) & 0x1)
#define iommu_pmu_en_ats(e) (((e) >> 3) & 0x1)
#define iommu_pmu_en_page_table(e) (((e) >> 4) & 0x1)
#define iommu_pmu_get_requester_id(filter) (((filter) >> 16) & 0xffff)
#define iommu_pmu_get_domain(filter) (((filter) >> 32) & 0xffff)
#define iommu_pmu_get_pasid(filter) ((filter) & 0x3fffff)
#define iommu_pmu_get_ats(filter) (((filter) >> 24) & 0x1f)
#define iommu_pmu_get_page_table(filter) (((filter) >> 32) & 0x1f)
#define IOMMU_PMU_NUM_OFF_REGS 4
#define IOMMU_PMU_OFF_REGS_STEP 4
#define IOMMU_PMU_FILTER_REQUESTER_ID 0x01
#define IOMMU_PMU_FILTER_DOMAIN 0x02
#define IOMMU_PMU_FILTER_PASID 0x04
#define IOMMU_PMU_FILTER_ATS 0x08
#define IOMMU_PMU_FILTER_PAGE_TABLE 0x10
#define IOMMU_PMU_FILTER_EN BIT(31)
#define IOMMU_PMU_CFG_OFFSET 0x100
#define IOMMU_PMU_CFG_CNTRCAP_OFFSET 0x80
#define IOMMU_PMU_CFG_CNTREVCAP_OFFSET 0x84
#define IOMMU_PMU_CFG_SIZE 0x8
#define IOMMU_PMU_CFG_FILTERS_OFFSET 0x4
#define IOMMU_PMU_CAP_REGS_STEP 8
#define iommu_pmu_set_filter(_name, _config, _filter, _idx, _econfig) \
{ \
if ((iommu_pmu->filter & _filter) && iommu_pmu_en_##_name(_econfig)) { \
dmar_writel(iommu_pmu->cfg_reg + _idx * IOMMU_PMU_CFG_OFFSET + \
IOMMU_PMU_CFG_SIZE + \
(ffs(_filter) - 1) * IOMMU_PMU_CFG_FILTERS_OFFSET, \
iommu_pmu_get_##_name(_config) | IOMMU_PMU_FILTER_EN);\
} \
}
// Part of https://elixir.bootlin.com/linux/v6.8.1/source/drivers/iommu/intel/perfmon.c#L408
static int iommu_pmu_assign_event(struct iommu_pmu *iommu_pmu,
struct perf_event *event)
{
int idx;
iommu_pmu_set_filter(requester_id, event->attr.config1,
IOMMU_PMU_FILTER_REQUESTER_ID, idx,
event->attr.config1);
// iommu_pmu_set_filter(domain, event->attr.config1,
// IOMMU_PMU_FILTER_DOMAIN, idx,
// event->attr.config1);
return 0;
}
// Dummy main
int main(void) {
struct iommu_pmu iommu_pmu;
struct perf_event event;
iommu_pmu_assign_event(&iommu_pmu, &event);
return 0;
}
```
Steps to reproduce:
```shell
rm -rf a.out *.profraw *.profdata
clang -Wno-c23-extensions -fprofile-instr-generate -fcoverage-mapping -fcoverage-mcdc perfmon.c
./a.out
llvm-profdata merge default.profraw -o default.profdata
# Crash
llvm-cov show --show-mcdc -instr-profile default.profdata a.out
```
Message:
```text
Branch not found in Decisions
UNREACHABLE executed at /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp:784!
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: llvm-cov "llvm-cov show" --show-mcdc -instr-profile default.profdata a.out
#0 0x000055cfdb4bf61f llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/Support/Unix/Signals.inc:727:3
#1 0x000055cfdb4bd30f llvm::sys::RunSignalHandlers() /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/Support/Signals.cpp:105:20
#2 0x000055cfdb4bd666 SignalHandler(int) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/Support/Unix/Signals.inc:413:1
#3 0x00007f0aefc5e520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#4 0x00007f0aefcb29fc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#5 0x00007f0aefcb29fc __pthread_kill_internal ./nptl/pthread_kill.c:78:10
#6 0x00007f0aefcb29fc pthread_kill ./nptl/pthread_kill.c:89:10
#7 0x00007f0aefc5e476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
#8 0x00007f0aefc447f3 abort ./stdlib/abort.c:81:7
#9 0x000055cfdb46736e (/users/wtj/have-been/llvm-project/build/bin/llvm-cov+0x45436e)
#10 0x000055cfdb55527f (anonymous namespace)::MCDCDecisionRecorder::processBranch(llvm::coverage::CounterMappingRegion const&) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp:784:5
#11 0x000055cfdb55b030 llvm::coverage::CoverageMapping::loadFunctionRecord(llvm::coverage::CoverageMappingRecord const&, llvm::IndexedInstrProfReader&) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp:879:5
#12 0x000055cfdb55c260 llvm::Error::setChecked(bool) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/include/llvm/Support/Error.h:307:22
#13 0x000055cfdb55c260 llvm::Error::operator bool() /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/include/llvm/Support/Error.h:239:15
#14 0x000055cfdb55c260 llvm::coverage::CoverageMapping::loadFromReaders(llvm::ArrayRef<std::unique_ptr<llvm::coverage::CoverageMappingReader, std::default_delete<llvm::coverage::CoverageMappingReader>>>, llvm::IndexedInstrProfReader&, llvm::coverage::CoverageMapping&) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp:933:71
#15 0x000055cfdb55c8b9 llvm::Error::setChecked(bool) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/include/llvm/Support/Error.h:307:22
#16 0x000055cfdb55c8b9 llvm::Error::operator bool() /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/include/llvm/Support/Error.h:239:15
#17 0x000055cfdb55c8b9 llvm::coverage::CoverageMapping::loadFromFile(llvm::StringRef, llvm::StringRef, llvm::StringRef, llvm::IndexedInstrProfReader&, llvm::coverage::CoverageMapping&, bool&, llvm::SmallVectorImpl<llvm::SmallVector<unsigned char, 10u>>*) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp:992:66
#18 0x000055cfdb55d35a llvm::Error::setChecked(bool) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/include/llvm/Support/Error.h:307:22
#19 0x000055cfdb55d35a llvm::Error::operator bool() /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/include/llvm/Support/Error.h:239:15
#20 0x000055cfdb55d35a llvm::coverage::CoverageMapping::load(llvm::ArrayRef<llvm::StringRef>, llvm::StringRef, llvm::vfs::FileSystem&, llvm::ArrayRef<llvm::StringRef>, llvm::StringRef, llvm::object::BuildIDFetcher const*, bool) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp:1020:80
#21 0x000055cfdb2ad4c2 llvm::Expected<std::unique_ptr<llvm::coverage::CoverageMapping, std::default_delete<llvm::coverage::CoverageMapping>>>::takeError() /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/include/llvm/Support/Error.h:603:15
#22 0x000055cfdb2ad4c2 (anonymous namespace)::CodeCoverageTool::load() /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/tools/llvm-cov/CodeCoverage.cpp:486:41
#23 0x000055cfdb2b118f (anonymous namespace)::CodeCoverageTool::doShow(int, char const**, llvm::function_ref<int (int, char const**)>) (.constprop.0) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/tools/llvm-cov/CodeCoverage.cpp:1143:3
#24 0x000055cfdb2b6d58 (anonymous namespace)::CodeCoverageTool::run((anonymous namespace)::CodeCoverageTool::Command, int, char const**) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/tools/llvm-cov/CodeCoverage.cpp:980:18
#25 0x000055cfdb2b764f showMain(int, char const**) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/tools/llvm-cov/CodeCoverage.cpp:1348:1
#26 0x000055cfdb29908d std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>::~basic_string() /usr/include/c++/11/bits/basic_string.h:672:19
#27 0x000055cfdb29908d main /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/tools/llvm-cov/llvm-cov.cpp:82:5
#28 0x00007f0aefc45d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#29 0x00007f0aefc45e40 call_init ./csu/../csu/libc-start.c:128:20
#30 0x00007f0aefc45e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#31 0x000055cfdb298625 _start (/users/wtj/have-been/llvm-project/build/bin/llvm-cov+0x285625)
Aborted
```
It somewhat looks like https://github.com/llvm/llvm-project/issues/77871 and perhaps has something to do with region ordering.
cc @chapuni @evodius96
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUW1tzo7i2_jXKi8ouEBfDQx4cYs9OVWemT9w9Z9d5oWRY2JoAYiSROOdhfvsuCTDgYMc903PZVakYg9a37tLSkqFSsl0JcIu8O-Td39Ba7bm4fd1DqfgvdVHdbHn6drs60KLKAWcsB4x8qwKRFbycJ8i3MCLBg8JJLQSUKn_DOefPEitIGa8lpmWK5Z7XeYq3gOk2B6y4vsxqofYgcMFKVrD_hxSRCD8gsshz_MrFM-YlVnuqEAmRdY-sZfvft5q_pP1O1ois8RJDK6NkRZWzjEGKM8ELvFeqkshpB0LODkzMt5yrnJXzhBeIrHNW1gdE1i_-PJjbiKwlr0UCiKxTwV5ASETWjBdFrT9LBTki694EQzGeoBI8rROm9Xxlao-TnJY7rEEYL7EdzO25o022Ywq51o6pfb01YjjLPH8x0uQvxawS_BdI1FwPGzIgbhiAQ61F5qQZIQuSQRIEXuY5mRVSsB1iuwl1AkRCY_qv27pU9aQUI1xEAkTuELkjFnEthxBr4dieg8gdZH5qQ2ItEj-c2b_BobJ_6wbZoeNY1jzwEQnnQ7wR9o9cgXElplKCUIyXEiOyLNhurxBZ4j196aICSh0iJhZ0dEDGBeBKwLZmucIVTZ7pDuQI3niZVmquDTfnYodBJSP8kiu8hYbLHrCkBczxar6bYyoxz_AjFVjrH41wjR8S_jKzgykeZSpxXTVORoRsYFdAqajWDme0zhUiRKvRw4Qj-JSDLBFZKJxRlmOqcA5UKgyHKmcJU_nbHP9UGoG5SZQ9LY1dWIZfAWuDpPjTp58fjXAj6CZ8jf8be_aG1wCvgBNaYr6VIF7gyFBr8fXHp9Uy-tfy7tMKwwGSWmlfkBF6AVJqJ5x3-EZBk3LnBmCMiItFgWciw3TOa818Oa8EzwR9PV6nVNEJuiaYZ_9b8llCnBkcFJTSBNUs02QshxkrpRKzHZQgqAI8yxL-AoLuYFbQqmKafnArSRM8ndCa3xyRtRFyQpYuWY2suACxA5yC8f9RnRkf3TqjVRcnerZ8xbOZ_mgka5VpVXuHhd_JNpovGx73dVG8aVJWsiYBFccFfdYZwWQzsSe8qFgO89OJYcML0Gmi9lBgKgDTXHL8DKKEHCc81cGoMCs1fQ4KMBe44KmZg09mb6lEnShMlRIYLe66R2HOyx1OeJmxnY2cyfukv7-4H4wZwO5fY-3FGF6gVO_xWXo4g_0x9BncScb71yGbocr638e8zFITV0X9XoWM5QrEey2yXSxgN8F2KDdZmos4Z1Ih7862LOTdv8Mq6yJOSvWeSS0hjQsqny9oYAYqkCqmZRpLUPGWKUQCfd9MhuYz1IphAaoWJbaQc4c1Ug9wNED8QnOWUgXavEaqRhdEgve2IsueQ4Qn9T9hbY9Yv3CW4iQHKs4LPR78KpiCX68emX8wcqB7E5bxlkr4UNePrPlCBdOLQJxl8ijBBTt06e-Y2QLw10-IBP_WJP9GxEHE-fppYoJZJqqmef6GE14da692jmjLqUn0u4cviASlMBNF90cCw9Q2cjoRciJ8HHRSDh6BGu0OhoQEcWwqBlZqU0pFSxVXx8fOGvfPh3TO8tRah0ss04KKWABNdQxQjTD8Mjn6GDIUkehFkxzvvCASnaXTwPmQS_4hl3ZEhHs2ecsG07M69bkHZSzg1xqkAhGzFJEAeifpcsl8x4j42DrYE6KMoFJeUFaOQTqcI5SzQs4K298AW1F5KtoZVPINqFTJqzCdb5J0B7HSoTVhyRNc91rcHahTJ7VLBBmBH28ebez3LLIsyz7kcvTfCP8SC4d8I4vOl5McBvAG0cmuwmw8ebXMZGj5ayQe-PQ6ww-tMuRwwufhp8fHr_Hnx6_xj18f45_W6_hp9cPmGI3u-fHd2HjzZfX5HcFZsvXDpy-rp_hp9T9fVxt99XDfUFoHy_6Q7P6nx-XDj0du1sEiH9J8Xm46Hg3JBaVakuWXzZAguILHD6v4i97OdES2daUlVr06zRrl2Fd4K1r_oD2wWX0ZCKorrYsU0Y9fnqLl5xGldQiuoFr9PEF3wZCabvPwf6uBdBesqEc35tic8PgwnrRY78Mw-GjR0SVjlzNBXNIC9HLV1kPmsnsa4VgX9PoTusddfnvdTl7Xz-Glv-NIK2RZ0wUJjtLMkLNq2JmEjUdzkL4zmuCb4qiVORgK1dZ5Y3bICsdr9YhtW9FjRO6MnrrkmwwzPeI9MrJCjPGE37vhUwbo6fTEZcqfgcqzbl0-leMkQEg0DTueOU-MdbQVRotoMhdJqLcaQ9jF_VWOPS1rTbX6mQqlt7R_enOQOJ9cKxhv8qhiCWbloKCPmz7sxc3N8Uvfpxroi6c3PC1gOEiHLto1_9GGuHswnYvjKiPCBllHqt7Tzrut-zvR8DgMp1YZEuEmkadIz7AJh7vT1qdnBO8Kl2tEblseFyRvF7oJmd_RXiF6SzvYu10K2qaHY7QZPNSObEszvdU8TjbjPkAfSn0cXewWNJEzGHI2WBHxh7Gp58Zj2A3oLyjZtfSHapkeIlYci7alDn1DcUwl95Dnzb1v6Cj-JU3Ek87hH2wWOjgSVO4HWH-4XThl-cemv3vO3AoOLfWdoGWyN931jNdlilmJ7yFhxozNkKl-MqbaN-taNnPnq_oFkfWevsBsC1Dqabjc0zKBdLZL-Et3IKJVa68HH2yLyPpzo-m9NhVZR61DBpePjbfmSVUhZ7kIXETakvbzp9Vys8Ky3hZMYYq39U4HHBdKh954dRic1Yzk6M5q9PwvZQ1aKdN7Z2WS12lz5pBoz-EtTZ6VoEnXY90omjzjtC6qo7WtObLCz4LvBC0wFbu6gFJpIfoGMSJk5H1EyO8NAIyIY2HrYFmW5XlJlm7dbebbmWGmZXKW8k02F58FK5WR-ItWAZGgHyToa8ylEkALUxpFen1ryoXv6OhNXWnXILL-WjK9Jm_YrqS5nLMy0Y4lC-QsnV4z-0Sz1LEmNXuqywbpX7RMcyNt8CcK30ndhKNtechZEqsXm5yK7fs-Hgmoq8W_3r6u7Wh5e0GdVtBFZlHIEg88YjU1dAt4CPzYd2emhJrtyrp5kMwln_uI3FkHl3jEOtYnGtMdY25JmCU4jiu1F0DT-JnlecyKKof-tE3PsmWlTOE1GDY3Mrs6MPwe37sGv1QgSppfRF4Exnk9sj-FPCS7CBeEJ3CLU-O6Cx_vpPGIQWouEVnPzbc3mUKl46Di0jhPUCbBYJu8GNggGEO77iJzMN3qWc9AqbRxn7nVSGdrjXuEcByi_sLxofX8-XA8mSzNCab-ZMeHJkx1WHiu48Ow_WKPZynP88jC7Ndoycu3gtcS672ErMzMFDZ5_RjdR92C9AQJFymI5kkleAJSNivYaCbr1vPmW8RrHQvtAvIEOx1vpqNsprnvnH-_YyFzll5vI_vERlvLsfB51UaYzc2c03Rdl4k6WuyicUYIzfiBdaIB74cyhQOkD3pl0mo-AdXO-PuNGCzCsRHJiRET4g-NuBKCt0EkQUV7SJ5BG2nLef4ddWlrh_5GPzcbCeZ7vdRZOrH743nHdq4Wnle6qOUCN4J_z_XuKtmJYya8geHdy7JfG72CF01wyVHoLoWgb0-QISeSKm3u1SX7tYa4UgI50dVR3gRuhI8wbYEVp5CDgm-GMn1h_XdtwkRXW-XvT6_Q0TXDou8g296pm4Nt-F-TX_7Vwv_z8mtxWfZvyK81y8fl_0YJE8_ZODi_7fZ3i_iotfkJ4aagef4zJIqLh6LKR3k6eIacqC7NryJTnOypSXXbqrscXf7tGRUSXc35vWODE8emjkf_azIqvFr4f1xGkdOa9ET2KzPq3DI1lTCnq8SZVHrJ2p2tztTNm1RQvEuH78OJb001b67vdEH_cL8GlexBdIXgsk_IvzdxbItYuuDrT9XIuGAmNHUTMgy-QwWJgvSP1gzfpVro6wTzVNFnaJLjr88E33JOMoFMGfKD3VnEU-h0_KLjY5gR31ElxXkuRzvM9ZB1Gx1u4JsWR6_TuJYmW9sOPtxxTuuU8o1p0zVNm8gsK4P0WI5TKmv3X7EwycnMSc550tCkqvnR09w8qASv5tZfbkDbdp2-_aYN6J4Y0E-94PcZUNRlczT77aQRL4ruh9NnTfjXWioM9Dxk9-fuxDux1MJ3M9PafWwOdv4pktuOG_QtQC35uCAmYWgFaT_XxXFyONh282VLJUtiadYR5ERdbXUcrG_ESlCmZPe4WYSOI2ie84Q2NVr3vJsPfxvBDyYQMZrVkuYtB0TWtm16T0prPaRtZriFLrL6X-w7ZDGlaEFZ-Sd6oLvsWhVk1Kkgp208Lw0tHMc522pdqFBxQvM8NkLOte6yft8tbPuRU0TGEp5xeF9tkvCUK7gWNjSsZOqUUXOp0WcG3XQTbRIMWt6IOMcziBHoSJUpLSbBnZOGzskpAAkDn3i4Qf2OLUsSeD7xji3L5ZYLXTmcP2Z7UFjyAl73VLWvTOXsGf7AmdNiESxsc_BUgdjTSuI9lYaH2rNyhxXHKW_eVxFNI9M0RHXI46FgSYKRayV7WtUl05fwwlNWy9AfDbtJb500dEJ6A7f2wrZ9z3dd_2Z_6wVukriQLRLPdcFLfctP3dAPwi2kkG3TG3bbvj8UEMtaEH8OPrhB5m7DxXYBTgqaZ0FZfnzb5sYoeRssLMu6yekWcmneWCOkyRpn2fuCIO_-RtyaG9t6J5Fr5Uwq2YMppnLzxtuRyLtH3t1jhMj6PkLePUaEXD7cJAS_7qE07-TkzLxHUFQ5S6gCPSskgsubWuS3v9-bRtf_BAAA__8RWegn">