From 285153f621a1e67212ef61686188eff3e9c80a4e Mon Sep 17 00:00:00 2001 From: Blake Eggleston Date: Fri, 12 Oct 2018 16:21:03 -0700 Subject: [PATCH] Legacy sstables with multi block range tombstones create invalid bound sequences Patch by Blake Eggleston; Reviewed by Sam Tunnicliffe and Aleksey Yeschenko for CASSANDRA-14823 --- CHANGES.txt | 1 + .../SSTableReversedIterator.java | 118 ++++++++++++++---- ...ted_multi_block_rt-ka-4-CompressionInfo.db | Bin 0 -> 43 bytes ...y_ka_compacted_multi_block_rt-ka-4-Data.db | Bin 0 -> 17848 bytes ..._compacted_multi_block_rt-ka-4-Digest.sha1 | 1 + ...ka_compacted_multi_block_rt-ka-4-Filter.db | Bin 0 -> 176 bytes ..._ka_compacted_multi_block_rt-ka-4-Index.db | Bin 0 -> 303 bytes ...ompacted_multi_block_rt-ka-4-Statistics.db | Bin 0 -> 4490 bytes ...a_compacted_multi_block_rt-ka-4-Summary.db | Bin 0 -> 92 bytes ...y_ka_compacted_multi_block_rt-ka-4-TOC.txt | 8 ++ ...hed_multi_block_rt-ka-1-CompressionInfo.db | Bin 0 -> 43 bytes ...acy_ka_flushed_multi_block_rt-ka-1-Data.db | Bin 0 -> 17569 bytes ...ka_flushed_multi_block_rt-ka-1-Digest.sha1 | 1 + ...y_ka_flushed_multi_block_rt-ka-1-Filter.db | Bin 0 -> 16 bytes ...cy_ka_flushed_multi_block_rt-ka-1-Index.db | Bin 0 -> 306 bytes ..._flushed_multi_block_rt-ka-1-Statistics.db | Bin 0 -> 4478 bytes ..._ka_flushed_multi_block_rt-ka-1-Summary.db | Bin 0 -> 92 bytes ...acy_ka_flushed_multi_block_rt-ka-1-TOC.txt | 8 ++ .../io/sstable/LegacySSTableTest.java | 26 ++++ 19 files changed, 140 insertions(+), 23 deletions(-) create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-CompressionInfo.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-Data.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-Digest.sha1 create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-Filter.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-Index.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-Statistics.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-Summary.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-TOC.txt create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_flushed_multi_block_rt/legacy_tables-legacy_ka_flushed_multi_block_rt-ka-1-CompressionInfo.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_flushed_multi_block_rt/legacy_tables-legacy_ka_flushed_multi_block_rt-ka-1-Data.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_flushed_multi_block_rt/legacy_tables-legacy_ka_flushed_multi_block_rt-ka-1-Digest.sha1 create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_flushed_multi_block_rt/legacy_tables-legacy_ka_flushed_multi_block_rt-ka-1-Filter.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_flushed_multi_block_rt/legacy_tables-legacy_ka_flushed_multi_block_rt-ka-1-Index.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_flushed_multi_block_rt/legacy_tables-legacy_ka_flushed_multi_block_rt-ka-1-Statistics.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_flushed_multi_block_rt/legacy_tables-legacy_ka_flushed_multi_block_rt-ka-1-Summary.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_flushed_multi_block_rt/legacy_tables-legacy_ka_flushed_multi_block_rt-ka-1-TOC.txt diff --git a/CHANGES.txt b/CHANGES.txt index 6ca14a02f8..78c0c47823 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.18 + * Legacy sstables with multi block range tombstones create invalid bound sequences (CASSANDRA-14823) * Expand range tombstone validation checks to multiple interim request stages (CASSANDRA-14824) * Reverse order reads can return incomplete results (CASSANDRA-14803) * Avoid calling iter.next() in a loop when notifying indexers about range tombstones (CASSANDRA-14794) diff --git a/src/java/org/apache/cassandra/db/columniterator/SSTableReversedIterator.java b/src/java/org/apache/cassandra/db/columniterator/SSTableReversedIterator.java index f8c0e77b85..2d95dab432 100644 --- a/src/java/org/apache/cassandra/db/columniterator/SSTableReversedIterator.java +++ b/src/java/org/apache/cassandra/db/columniterator/SSTableReversedIterator.java @@ -20,7 +20,7 @@ package org.apache.cassandra.db.columniterator; import java.io.IOException; import java.util.*; -import com.google.common.base.Preconditions; +import com.google.common.base.Verify; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.db.*; @@ -79,6 +79,8 @@ public class SSTableReversedIterator extends AbstractSSTableIterator protected boolean skipFirstIteratedItem; protected boolean skipLastIteratedItem; + protected Unfiltered mostRecentlyEmitted = null; + private ReverseReader(FileDataInput file, boolean shouldCloseFile) { super(file, shouldCloseFile); @@ -122,7 +124,7 @@ public class SSTableReversedIterator extends AbstractSSTableIterator // Note that we can reuse that buffer between slices (we could alternatively re-read from disk // every time, but that feels more wasteful) so we want to include everything from the beginning. // We can stop at the slice end however since any following slice will be before that. - loadFromDisk(null, slice.end(), true, false, false); + loadFromDisk(null, slice.end(), false, false, null, null); } setIterator(slice); } @@ -155,7 +157,9 @@ public class SSTableReversedIterator extends AbstractSSTableIterator { if (!hasNext()) throw new NoSuchElementException(); - return iterator.next(); + Unfiltered next = iterator.next(); + mostRecentlyEmitted = next; + return next; } protected boolean stopReadingDisk() @@ -163,13 +167,20 @@ public class SSTableReversedIterator extends AbstractSSTableIterator return false; } + // checks if left prefix precedes right prefix + private boolean precedes(ClusteringPrefix left, ClusteringPrefix right) + { + return metadata().comparator.compare(left, right) < 0; + } + // Reads the unfiltered from disk and load them into the reader buffer. It stops reading when either the partition // is fully read, or when stopReadingDisk() returns true. protected void loadFromDisk(Slice.Bound start, Slice.Bound end, - boolean includeFirst, boolean hasPreviousBlock, - boolean hasNextBlock) throws IOException + boolean hasNextBlock, + ClusteringPrefix currentFirstName, + ClusteringPrefix nextLastName) throws IOException { // start != null means it's the block covering the beginning of the slice, so it has to be the last block for this slice. assert start == null || !hasNextBlock; @@ -220,16 +231,82 @@ public class SSTableReversedIterator extends AbstractSSTableIterator && !stopReadingDisk()) { Unfiltered unfiltered = deserializer.readNext(); - // We may get empty row for the same reason expressed on UnfilteredSerializer.deserializeOne. - if (!unfiltered.isEmpty() && (!isFirst || includeFirst)) - buffer.add(unfiltered); - isFirst = false; + if (isFirst && openMarker == null + && currentFirstName != null && nextLastName != null + && (precedes(currentFirstName, nextLastName) || precedes(unfiltered.clustering(), currentFirstName))) + { + // Range tombstones spanning multiple index blocks when reading legacy sstables need special handling. + // Pre-3.0, the column index didn't encode open markers. Instead, open range tombstones were rewritten + // at the start of index blocks they at least partially covered. These rewritten RTs found at the + // beginning of index blocks need to be handled as though they were an open marker, otherwise iterator + // validation will fail and/or some rows will be excluded from the result. These rewritten RTs can be + // detected based on their relation to the current index block and the next one depending on what wrote + // the sstable. For sstables coming from a memtable flush, a rewritten RT will have a clustering value + // less than the first name of its index block. For sstables coming from compaction, the index block + // first name will be the RT open bound, which will be less than the last name of the next block. So, + // here we compare the first name of this block to the last name of the next block to detect the + // compaction case, and clustering value of the unfiltered we just read to the index block's first name + // to detect the flush case. + Verify.verify(!sstable.descriptor.version.storeRows()); + Verify.verify(openMarker == null); + Verify.verify(!skipLastIteratedItem); + Verify.verify(unfiltered.isRangeTombstoneMarker()); + buffer.add(unfiltered); + if (hasNextBlock) + skipLastIteratedItem = true; + } + else if (isFirst && nextLastName != null && !precedes(nextLastName, unfiltered.clustering())) + { + // When dealing with old format sstable, we have the problem that a row can span 2 index block, i.e. it can + // start at the end of a block and end at the beginning of the next one. That's not a problem per se for + // UnfilteredDeserializer.OldFormatSerializer, since it always read rows entirely, even if they span index + // blocks, but as we reading index block in reverse we must be careful to not read the end of the row at + // beginning of a block before we're reading the beginning of that row. So what we do is that if we detect + // that the row starting this block is also the row ending the next one we're read (previous on disk), then + // we'll skip that first result and let it be read with the next block. + Verify.verify(!sstable.descriptor.version.storeRows()); + isFirst = false; + } + else if (unfiltered.isEmpty()) + { + isFirst = false; + } + else + { + buffer.add(unfiltered); + isFirst = false; + } if (unfiltered.isRangeTombstoneMarker()) updateOpenMarker((RangeTombstoneMarker)unfiltered); } + if (!sstable.descriptor.version.storeRows() + && deserializer.hasNext() + && (end == null || deserializer.compareNextTo(end) < 0)) + { + // Range tombstone start and end bounds are stored together in legacy sstables. When we read one, we + // stash the closing bound until we reach the appropriate place to emit it, which is immediately before + // the next unfiltered with a greater clustering. + // If SSTRI considers the block exhausted before encountering such a clustering though, this end marker + // will never be emitted. So here we just check if there's a closing bound left in the deserializer. + // If there is, we compare it against the most recently emitted unfiltered (i.e.: the last unfiltered + // that this RT would enclose. And we have to do THAT comparison because the last name field on the + // current index block will be whatever was written at the end of the index block (i.e. the last name + // physically in the block), not the closing bound of the range tombstone (i.e. the last name logically + // in the block). If all this indicates that there is indeed a range tombstone we're missing, we add it + // to the buffer and update the open marker field. + Unfiltered unfiltered = deserializer.readNext(); + RangeTombstoneMarker marker = unfiltered.isRangeTombstoneMarker() ? (RangeTombstoneMarker) unfiltered : null; + if (marker != null && marker.isClose(false) + && (mostRecentlyEmitted == null || precedes(marker.clustering(), mostRecentlyEmitted.clustering()))) + { + buffer.add(marker); + updateOpenMarker(marker); + } + } + // If we have an open marker, we should close it before finishing if (openMarker != null) { @@ -333,7 +410,7 @@ public class SSTableReversedIterator extends AbstractSSTableIterator // formats (see next comment) if (!iterator.hasNext() && nextBlockIdx > lastBlockIdx) { - Preconditions.checkState(!sstable.descriptor.version.storeRows()); + Verify.verify(!sstable.descriptor.version.storeRows()); continue; } @@ -362,26 +439,21 @@ public class SSTableReversedIterator extends AbstractSSTableIterator boolean canIncludeSliceStart = !hasNextBlock; boolean canIncludeSliceEnd = !hasPreviousBlock; - // When dealing with old format sstable, we have the problem that a row can span 2 index block, i.e. it can - // start at the end of a block and end at the beginning of the next one. That's not a problem per se for - // UnfilteredDeserializer.OldFormatSerializer, since it always read rows entirely, even if they span index - // blocks, but as we reading index block in reverse we must be careful to not read the end of the row at - // beginning of a block before we're reading the beginning of that row. So what we do is that if we detect - // that the row starting this block is also the row ending the next one we're read (previous on disk), then - // we'll skip that first result and let it be read with the next block. - boolean includeFirst = true; + ClusteringPrefix currentFirstName = null; + ClusteringPrefix nextLastName = null; if (!sstable.descriptor.version.storeRows() && currentBlock > 0) { - ClusteringPrefix lastOfNext = indexState.index(currentBlock - 1).lastName; - ClusteringPrefix firstOfCurrent = indexState.index(currentBlock).firstName; - includeFirst = metadata().comparator.compare(lastOfNext, firstOfCurrent) != 0; + currentFirstName = indexState.index(currentBlock).firstName; + nextLastName = indexState.index(currentBlock - 1).lastName; } loadFromDisk(canIncludeSliceStart ? slice.start() : null, canIncludeSliceEnd ? slice.end() : null, - includeFirst, hasPreviousBlock, - hasNextBlock); + hasNextBlock, + currentFirstName, + nextLastName + ); setIterator(slice); } diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-CompressionInfo.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-CompressionInfo.db new file mode 100644 index 0000000000000000000000000000000000000000..d320406f7c54f783124edefb561fd222722d29bd GIT binary patch literal 43 gcmZSJ^@%cZ&d)6P!#UVv^UM9iJS;7Ok+GP4B94NF`7gn1IkR4RT^MO70D#C8 z000680EGe`)Hzf`oAK`+!J7BA0FcCQQTlN@z{1(*ub%F>@l&ULf6gAe1&Y(4@@?Q5 zCA01+EhmK*K~BuNM^kqpKY@Vrzv+k>>Qkk$dwK*&I_KuAD70FeK34F-VH0D%(#;Anup)a!x=R=NL#SrU$}gytAdcf>Am zo%Uy<{7X2HBzgjxi<(OkMk@u)p@-NA`mDf?lXEn^ZbvJdsu~c5ZKLLKMs&ldB&im9 z)V47XcJ+a06&rpd1xhGttt@PnMgFTAR4;?XqzOPN{eQ6s^$CfC`KGK6HP{t_tiO{# zTjSMrw`H30s?1Li6EVEU8o9o_; zXcDg;z|I|XR+_k64W%$n0x-kQBeXo-k6*Qpt*6U*^#F)a01NOhA~Zk&NP9T9jtofn zze0~o10e%T13>}<2!Uwe0l*Lc{{RruK>uI(|2?3HKn)=%Y@akLuzP*(<6Dw6rf1qf zk8034!)iapAVQ&PxeTF~CTS!o*&>jMn^%r9;3p_t6P3w`x1F>qKat<>3O;tsaKA zg%Bqe^afGbn{SZX4XN&<74Y|aKoo^X4>|gxoPJDJYquXpI1_@Ctd<4)Rp7%vc~zb_ zvB)T``}vZ&JvJ1&kxxd#Y(UXbltps(xivTpSwpum47nrgXJunt30pac5^y-3U+@b# zDg}#R<*dK*RBE`&oT2!LYQj0vBLlxxJ?rb;ife1_?w@3fYFXthKI$}wg^H|-^d80 ze$kN6aF8R(f>Bhu_D`vyR{eA^b+O)i6;Irr#?xn1kF(Xu`fKyYv0h2?Dgmy0GL!x^ z0Bx^7@NYv1bPWHF{CvYviKvH6Ilrew~wX zy(E@gjYW}GL6sAbtoXF<0+o*Zd+2RP52aj|;)_{H0nf|4<=S|*!UwtSWGxIv|M%lD zSQ>95L!&maB>}$EtkULj~iY1?ayOX&bWWa7)8e_mTqjf^s#&2M!MVi50{+Z*j0O5K-LY0Tib;m57%Pr0Tp

!jQubj`;C1 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 M003kF01%6A6U(-5F8}}l literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-Digest.sha1 b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-Digest.sha1 new file mode 100644 index 0000000000..63993fced0 --- /dev/null +++ b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-Digest.sha1 @@ -0,0 +1 @@ +3417730863 \ No newline at end of file diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-Filter.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-Filter.db new file mode 100644 index 0000000000000000000000000000000000000000..aa97e86d5728ea77e14f75a61ed9626e215afc4d GIT binary patch literal 176 ncmZQzU|?lnU=Rgjg1~{G3Y-d5voEZ3!jc5FiY7)>^gmub%5KV%+u_!{f4y+Sqoyke4b@@;aLVd#w T7G?*#faO0#jjIKOW;zT2v_}zK literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-Statistics.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_compacted_multi_block_rt/legacy_tables-legacy_ka_compacted_multi_block_rt-ka-4-Statistics.db new file mode 100644 index 0000000000000000000000000000000000000000..25802022545279ce3b0299ac30a49ec6f8821c45 GIT binary patch literal 4490 zcmeI$`%6<%902fp?(TeV>D1I!QkhvJrewAPb!n4n1e#{qi<)k!K`Ps-WkyleAvj+6w`@_=km;3NI60B;~X ziH!3qrtC)9ow5gIFUmfYrIh_B3vGib7=q7FqZ~$AL3uvqSjx$iS5eNTTtfL6mn@>$2Wywn^s_#>9A|5`P-qvaa$-d3H^$l zwG#U@o}a|lh2m@mUeD|UY*E$|RG#DT{O6uOLUHlEa%8tJb;uqWc4W^n1G4v+KeAMh z=cAwIJ&FgkPDT#ylOs>-PDc)VipN_qjK@2=;wCB|*Z&rISpu%#8o3q4w|tTz?@et) zJ~^@ox#bS-pWYVKpTx^|5SAxu?Lp){GtVPGyd4G2Ml_?}SN6E{1&oX27BoLZts6XH zoU?ewLyOmUqxQNL=38Lgy~R2N?Wsxn4(%Pd zO8wyv&@&b!UxJQ!xjGg)@>$*m=*63MS3zrDMXiQTuihF1ofCd_3H0`#k^$)QyLDRV z`izq^p&wV49)cda(wPKI=18(zp>vilh3lWxr8UF#PwYpfaQ(9eYu`2SJlo$8UkofV z6YCLRZq`#-3iR-B2^=5skBVdP`{6#Pm)wWi$&?6a}_Gi<-K$L|Ad zzu)uZCK)Ins4FXi--D3z>NX{ahu$BM!SR~)O`B2%;`1_X;c!0?6aBGW3gYVScWpa> zm!E2Efc05tTO0%Db3wYMwgQwd&2H)F2d;YEd%YI;#@Ta?u)fyYicZy^IFapt^eYiK zWy|2`zCUJ6&OH7N{(BF`f@g&6zq03=Xjd>*f7hN1bqEXRgfP6+c)RvosJj@~o(uJd zYtQA{bAbu*fA6`-W{Yb^Ipu$JB+w-)lB^qlBW+jy z;3EqX`-M%YpC!4*Spb*8D-#imUF`qL3s!)SQupb^nOe#be|2k0yMn?Xnb?K_0Eonij1&xByI(r-QOU<7JDl9%cm|9E0HKNf~VL z@%_>=JOBw62pI?#2nom+0P^2nLja((K;VP`I9i}j^=uHjIxB88-gO*=6@#&4lZh@D za!@%|RXhaqISNmOYJ9vxK2N*@1d1I3^&HdYBcZP8)kF3EI$+o8_jV^>I?(!VyRX}c z(m`Iaq0>^l@_h4Y0h}|{C@mYQOQKj+YQCWdSpZ7e{|9?e*DGvpoKv1S=5BLM9a7z1 zCq>J&jzLM}@gAqQ9ojF*=&K?8iy^VpXARf5xaiHv_SdyvGc-zNdNr8=X+ClS`-9Dz4mF&-IQ42mlcV_yhcl2n|pG(jLjHCkGP# zFVPdyK*+$-K#;%yA|P6L0Pw^A9{_|j(Elg?e+MWcP?ujGbT?FXcujKZ(<}HQaAQOK zIlYTriAraQ0-QhBwC=Mi4S`)pPX>I8i|+6>a=pczGvl9{aYN>SMKW9Fx|u!P#bX!C zidN3tY4X7?jhpuO-L63Tc%E3@!M%)ZK-g|%g73HTBp@4F{)c)?qskCzW;2`g-Pu54 z3&s2bt(N6!o_VYzr43QCH*CGk5*o}Mq>+=N6;r$H&$I|IPq@ZgZvNxC);5|{!;%Nu zL>g;@^}n~hOg=@A?9q3g*B@Np9hO71_73!m=9?Hg;Vu%AL`U2K(LjxY#pkKf03wZ! zp(eFaDb=T+;RU)m0d4JbKcU$|(r*s@8}fc#^D-)bU_}inbkOtwH#LA|DuY-g{1dlc0P1pA=O3!|Aa zy!_dG_zJDrn;kwwHeHyhn&Txo)c&hajnTi6rWkO&VspjCV5krSi*qW5#^{uBRf`J- z_o|odZfmx2bjtUCmcEK<(_g|b?RXzyN0^q1ASb&JnFPQQbag+t(yD%9f>jx@C+f0~ zE7hq=6{jH*Njh5``n`3!%h2d9b__u^E9=;LXWeFnfup+~0M9Vq2(BOmI9LiJhx}3e zfzQe~Z=V4kH5=WGYOq)oqRiSD#O$Y2ZT%fc*ThUDaf$0snQN(+dK~q)WD5T4kKYFL zZ`i-m%#?;>z@Z&xiCJ&-!@rcmYa#*idC4diN&+BcZTZshUj-}Pd2BcnEEE#EO=~!1 zKjCw-eX6+SH@jcDmsGXOnNdNVVBswYTR|`<7e{b?4O?O28tWn%6*Q1OL$a6}uZ+k(Byn!(PIz9R@<58)?jlphXA7sjyh*k^0O z#qk8w6#+6s%w7>C_?0(N+3W&#+3{B)M>%vrdqbeO>$Vf^;^B>~6@FcN^-PpIE$^n= zd%vf=h%k?NaTc5D{i8 zC3R7PWTdV3^)X8`85Bdg+Lu zM1uWp0&zzEoicImkEe>aBDtW&s!MyPG9P`eUlhJTsVeqSTg+T>i<7vs*iV^Ct2UpB zfHgfrBu<2s!I$NV&#yk=spkrCcvJ&}wx&szMZhO7@-v>;L-5QEf&3hQz1R?bf>7F! z!Pfk~Z!oytN?k6XW`#=ntTTy7KwbvZQO!CylIn6j|8w7vwR~-{CMwX)0^gWYqA2|? zt+q$*7L`n^#o(A9BZcVHZ7m`HJD-p?6pRvXJe3;cla{h)z^moLsP)zivQc<8w&6{xLh;`v7q=6r#{KlRV@ONPo={qxjiK~Uu+ zeZl)#(`nLOodrUutH^Ga2LBQj)A<($zVHll6Ox%EG8z?2t*S-HH>RA zC!|;*pZSD%c1MTEIp3W!=!lOnc-XzPXwT%8ZO~c`vj1=%9ZpG+q8PS%DFYrm7s%O7 z@ZxizP0%LJ$f6p+*QrT=NOxs)8p7owDzo|b zhl|cioAlIK(ZM)Ilz8a?PwRlSW#&!?eI8A=N(J=}s#Oaz8(v49y2ONP5o&CBh-)8g z)-P6|rhiI1JQxN$*E-rTXb;i$Vxg}5clTa}F+=idO_CAEwaZ=WeRM|ss$#h_56WrS zkW4~-MEE3faHRM<3zu$2XK{i`Vg&Ai_G$1c1S1g>46OH@g1wDdRiGpzF0fKlHfs}n z3LQJac+dyemkjs@aZT58vxsD#LpZceXJ7LAW2UEw%owgF3QhQ)tNf}S(yVEHJQhat z#m?A2nkE{m>SSiz0xIJ1RnA0jKK+k5P_;u?uR)FRIMT*=@8z63OxEMUN^W0z|B$hC zkwCtR^3=Gv`%-xgbygCMUeKil8_v5)6OxT)5e%bR9YuKH77;iXAYfaF^h{tdL=iN)P4eg zdX~SsXWa}cZs9XRsVI(L=bJPqEL{+?6Zp%1Tb7SJzbPTCDa-}`YlDC>AbHXY_C{U( zfZdMYiU5TU#>a;AcO9Jf;nJS1#e%*AH%LzlMZC<|%<8*4b>(89^y;hs)e!Iq3UUzS zU+zyR@nd`G@E68`GDv7JsIYd1m7psYdlVN=Bf$Os-se+HzIACmEgYFgW&vToxlmA* z)ry{A0Xi>~(;&CDuov(y_*2%&I1-rYV)A{eIOdd@Q#VfY!bwmz>>pOcTFT?MW4#gf zg-CUM504K09_kwMjI0dT?Q@ji1pGA@t3`S++D zI@AnRBfV2KZArT|fbrmA;v}O~<|-;NW+U!$g8a&GUX8omhFS83f!Nb0)&OUbG{&_n zphqXA<5y6A57wFnilq$cvUeEhoxA?_Mc-*JX+Ks z(lgeC5loFt4!@GqlY5%~)RV-qU1_dpS;%1VW4lzdLI5`G zhu~-v#wv_qIV?!iS1hlRXX50S^QjZThcVyc&eL|OLP6!MX-VNVjng9+L1HT`beIY` zHme8qlapo!{jN5ZiD$CxJZlrFlt+wYJdErs5rTJGPH-8Y?S^f`@EJV%-`# z6A=IAdmdvFnsrH+$Md>CmJ^XPDKGNiXV!v=u+RP&w7j^G!5ofPoRZ>Bn!lJpolSRc zqN032PHfmvC;xjKWejE7;jrNwaW2S7R9`4ac0n(n{F|=_5t@mIsBd2L;I>Vkzr)Sw zcyq>(Vz^MEg>-oQ84^~(!}rU=Rv7JokflByX~=Jzzenx+R~?2GJEV!JjXjFlZBxv9 z`J#&}-g_Ot3PZn=7!&GM<8c%WEr^QD1&acrmS=>+#fO`tWZnTdobtMr+25OV;Ttk7kQL!OA~y_&!k8j zpE#=MP3!}c*o7_^yM18`Cdt<%FxS#=6|P#V8As6t=LO5WB5vWTF&0D8F;GV~b2z`H z{ltU%t>vPeCE7nLP`at2JIBWHSzOD+PxLfh7F2<0od|&g-0xF%fpOh{a{;1ru_|T& z6$z5Dbf}LR*52(#stwk%x%)zDDBu^}vXur>S~)GYe87B=p z56*Kw!qN|sICD7te3GG3W*S+SlS5nEPBzg_$llYzP8=Oh-D$i8WOXV%!sBrt)9Ha- z_oqr|ec)Tsh-A!8;p)lVV$@I<2ZF8lxY4v~!h?;?zX@oQv2u-$4EMegME^XTOeLa4 zC+ZHd_5E~B0dQpV`Y?#08tbXOWAZ|Mckf|dS=_RXnxq82AL>d6t4#!ch@pOP`*kH0 z0$-bcPItgfr4A;$29@toVAuy^j=@;sh=aFCITrvs;EkWw-s z&v$V?F?;=hzx*tjscln0U+-1tHm=wS*bh!f+X$^s9T6tZl!|R;RJJ{r&5(P5fF(G% zRgF+d6WK4DT8*MPHz;N07fnc7o*|?zEOwc4TEwfakTZ76AesMwR2xr9c-~??!2#h z3Lg+V>Wl{7*3`rAc5Zd75EBE#XqJu!AghkX=GR0ddT*gtI&;T*nchAuIY{0@6cT$Q zLCu%_L-YAgfLdvW*hiCUnJqFZ8oaBV{aCF9$}zUi(+A}w6hxWsPy_3%OWs&JWe9>vi4&2zP9Ge6%4 zmU;8`;B`%);5}B2xsyH#`-qDBQH8=cwMx*NqH|XRs_jf=tPR53&`Gl zc)i;k!ET}Sx1f*o-`Syqc7ct^rS#rAuU1_yJEh@&^;1;e0HTDC$Rh`K2ZEj;2pL`? zJ7KAO@0{|UYGOmK($kt{?W4JQW_};*+Z%bL#8Ki&53SoV;Xt5 zvvBD%&Uu%QXD^TZmQr4X9@cP^yrf;0cFP5Rds3pL4NVdY?LO~1u;LMEVKJCi-Yu!I zfRU8~ba}Vcj=VCUmMl0^l`jkJim2_%yBiYCZ2K2M^>L!c?@z0Cb|m!Sa2BI<%qz5H z)w#J23l3~2GhPtA=5VG@UXDNtFFN8?K{2x977DBxLUqk?&A6*OCOXDy( zRj)p;#FEFVVzZwYj&aQJBH7myg(P3%%i0|IS85K~u0>bmW;wy)o$tV4#7~R7nbkOZ zH<=(KW~`yGT#UPDO!@47?U{t)p8=-10bTKt$v4YUj3dOezi_!IpFX10}p}S>Sn{2L1x?|e+vPg9uh!WXK z_2)^GpK0sj(;<#YOOgHyki&u&xa$Z$p++!T^3+3O8ra95v&-z*e}6yq($3V?#LDvr zoYAXoGxzSbeg}=s6f?MNtl9{k{Kdf+ax~>X8Yf(ahIJV4APpz2+cW zvp8$*#b4nNkI}zz<^EEOnq8T4qzU|ZB(0pQIp6Xa)0Tq~E;eFxN=cM%O@TIU(JJp< z{lqUnV4A=MwxfH$n#>^GK=V}(f^$5S$kpwV$x%p)yC-7=4Qn0fAXXfV^M#`6oWyh5 zmup1K6&9UA!|5odU$8i@J^SJV_p(}ie4$|9lO|79=ml=D*pli}{UzwJO>j;sm|2un zcl{wP5qn}{!h@%CH%OXKLOih?EA~c^_8B>NY<1@C-8D0gt^C1~;@p1~GDixi!z&-{ zXbKk5La1NCU3004!w?}TMx!a8aZdmxVpuiM+-isd%wt4Z22I>C7q9Q`GW@Hv*PjPg zIj7-0`50S`8i7}TyJw*T(|`YTl1YIXt5zy2?)7=yU~*YQg)3!KPMZA^o&Tes>$|lV>7q*o0U?XIW81;z1C!e*TpIR?|8-1u9RkQ*O;} zy-{3tXEkM}tL4#b4R$g`E&oPaikcbm_kJSZhf1xogv>N3TTRmsdi9Lv(RJ;`gtwu) z-Zj?v&AjAQBX@%8H^DD2{X&PGx3oVPd&S`bPJQ(8D^TG5R6u}TGT-5H`xGT1%(Oy7 zz|1VOn+Lbnz4u6w1gcVHz57Q|wSEZ7Rxb9}R z{1f@SDG`{5=O6+D@hjQNQCn{fK39z{czj1RT*R5~N!~#WKXk-*Julu`EN)m;KpI@a zfN3~tMAnY*n?@l;;*qNC(e^y?&MyPIznXj_WW z(0w8GE!F8ax(rku+n-f`k~kFRVyk0(o6gApKvJsojG@q=Z1=m?$WMo3?W4+t3t`ff z=H?SOU=Q&|z|I!xP%i^8eUgIWy35Bifb++0>YP^B4vIefn_2@*37CKtKEWo=__eT7 z?jD77kItqM5J}CWb!XGz3qLb>c?$AzZS7+ z_Yqb+uj)|NP(`8HirqFg1IAk11E3h25?jA$iddODGW;+()WWjv1T2pyy{kYlju)9+OIi^L zBy9LkB5iYZoX)h*DhEjX#jHC$)cl@=D5PP+5=qh0G!FClxeVq2e5NlYR6BDzVAVOK zqlrs{XDy@yO@eHVZ#x5gd4@=!4pVX=V3*bDvg>u>DpUkaP%L*M1#hVYEk6B5Qyk>jS1ZOhtUSNne>YJ=!=l;Z^ zxSM6q1$PU3J)*rO>Nj^9(Ud>p))Nz`f1S+HTbcYN_)FOY`4=%^QO~x?tPAU`G-H4J zCdC6^?KE<)c`tYnf^X3jg_NQGcc1aE9{Im|pfW)y$(z%BN#6)#HJhn{Z&)~RcLK(c zSf#+7dgyRwP2zO@3~AV;(}a{YP$Bg5tWKSIH~erp6i ztw~_405%4i@3=H^8@{+TiEkERgw>jsB&wMhWoxq@(P?Z#M~I(i;HJy=$Acb_950L* z)#+~|`wv`$vdn9}mC?LV*$Du2_Wsch2Fi89v4~??{ny9*2?MP>{0S^~i_xDtP z0e5~hKpUzPT-;vGc2HL@Ztlh|rmnd9dt&4(`Rd%M zU~$WfIk4vX0{g$zP79FbV{`r@u5{EW(t>LFln5*d8vfwZF;Hlv#Kgs8F{$C#%qpB- z(HSkk>jhW5x)#y%7KyjLfu9(ic%yd0>$1eF{A=>3pzP;yL_@3|dFP$2hy_WMVz11+FW@76~qfAB}BT>X}M$!0h}T zZBe@&MY#V3N5_QXhG_`J$tO+apR92o3*Ni+qu=9ZS*PLCBao~n%nq=#t*HXd1j%*1 z*Q)9D1ChwJcbLGVjC@Hq`?m0E@kL?IvmA_W&donxrc^uhP~T>Rwnqn! zBY}um;cW$u42|1%gof?FbmdDRGo~hpC6Msbm$-kXq-;6g(GiU{6AA*lw}uCkz5S^d z9C#Vmq<>kTd2^43uO=#BAVlG>uzftnUX^RX2iE>*r5pQS=Y+3I;5xcKge^KyK>6YP zvVJ;yV`5K5x0!*FZp#&moAtV1uSu3XjZlxB;f|@v&SRVu+^_81rL{vg^NiL#>S9*{kXlYtY)fHs5u@Niq#EF+^VVxBryPxhfIofhZ`1bWWv(I5T->UAnV9iH zE1~go^6MXM3^kdgNU8Uap4x%y&*P!nLipeFZ+4jR!3mLr=P5_6&0J1zH<{YMb%{9AGS``;2N;CgD9Z2hC$Rz^{%+;2(!U7~~n(s09YB` zv*QT}>GJ*;R=COqw(u|`g&w=I|FOqu;rcp-kHf-Z92!G?DBqmNKv(a;=CL9~q)^av30=Gcb zK;zi=bQO=I6SFF#h>EDWe^Sh~wFG4)wrW(=Iw;zE`6f2-!@5;b zz0~oi3PzpE7ZEk5-`;Ol#6 zF(`OK7`4-+`IFZ1KbHjR9P#77Xk5H8o$N^8^XLxL_1Q<7RhRR6kibbT*|U@xTR2#s z288PB*oRwg6JF?c-qtXgn3C!wLg<1qt;&n~vs}QY|rXE2>B5`nphl3}#=)goW*AkCuYOe%t z83dn&CWQAxr9F(%@YZfTAX0Gta(Xb8Ldtz0kQ1*!8f>DIO~Bgfyl7V9gfdJi7ciFk z6{r;ouJ7TrOr+|z*HkFstFVP9%F&gWu0mXuoHi?=ATuxH$&)<|kj~;y&kZw4unT?o z%5tqt^bJQg;OQ3foyEm?Lro+S-p!pgnUU6c&?zp$S`7OAX0tQb)?a2hxRo?MTM=aA zX#Y&Yc3;?URF@-a<;hksrO7Bc;AX|g5KMZXJ%dVFmJXkbn>bQcr}{SK0;U2zxiFR3 z&4MQjWn|uFjQcEYtQaDq`fzuD=~_e(CANJ|L$uoM{ngQbZDrjybbC<9PU!q=NbM9| z$mis^9(tmQs2pK#)27}u!z9S-q4p{`0Nh!OfdTMSB&v;y%a4uI3*7SyeRza5D2Z;Z zqxV%QD2f*F?qx(!dy?fyqveWNG^P}E;+rnXHcs-!K3M~N;O=0XK%E6h8{3F>pj6wP z4bQ+5;F7+4>g79(cXu~zL^4zxDd}sOdoQNrLe|JDvjd5`?4N%Z)DCDN6%TYctO7#0 zCksN*e(F8CI)YaCEuWzsTZN0541|;To~Bx}Vl`b7ez?gpEY={{094^pLkYvXGaV9c zDCegJ`X>;pBFwK#8}dq^dyYf{#C#u96=x|`-K}?8(%MNn?u&xfsc)dQfGJw+eil_U zQK2VcGNR-W-VIUj1w7MvTy!oLt{Terar{j-AISD-=N%52!7h|Oh6o{EA!6YO`wVe4 zh$H)l>3+mD@3_VzRn0%?LqMRF=H?&yODcImm*iG<1d^3C8D%Z>W|G`qt7ljYFgu~p<;T~^kHo)H zMs~lYZi72}l(2lD7vQ*l z;-SBpf)#VyVM`ysHx4(lpi|r&s45$5I?Ns8 z=@I!5^3S6*WDpfQL^uw86KlV_R;qTyXA({#Lpu6A)G3~Xjbm$3vv*&QzR4B&Gj&Sv zeGDjxPc=}ZOA{ymAHs<=W_)?B%i z)k5-na=C&`3Oaf5BGor`e%M4*xthZEUl&4NzyGdeMj4ZIXznd*wqin{UIl><`SV88 ziFZHkXQo=5UgIi}_Dz7a+Ob&}+S3B*wxr+cYSCJt&UkL0)oZd)Kt%myBd5C6JlP5r z=Dsr2_z)GRp*{A$_=X|}CZ@3+3O!BFU*3zWaHh#&1}K>vu!4#F6F7Mhf!Z#(q2+#L zy}uZkr+E*wc1~&7moc*NOO2ENBkm#vdwYghF-ELvf}y_=GWz;I8S!x|tV)6I*s&%| zFYwOJmAY?ZW4Q_|cT+R+6i2d6C?xpQJVM@5MLcE%7edo+!dvGJS5M%uS(k@@)a&x_ z!wLz@W*7tCTWWt3!d?`kY)gn#tn(WX2#^dXw)-Qa5+i4e2te!(Y*NZqh)ZI1OE`uJ zxuxc~tV(;01STPYP!9fHIjROJ#a7!jZHK_?Gyzr6f`JCm5e4&TtDAQ%i?@(`7Vnim!(Jkl*AkMe@aa#jD@ga%0C zXS|d7LYy#B&V{n~gU&D@?9ONoE`BJ7r8(^H2%$XIs2utNT_dTE(=eXdY>7?Bk4A-u;ZlpWsq=7ds=2~>yT>PlhG(l zhOOOpCh%ZEGa_+1e{+lA$32C0A9!$L)}?52!%7P-ZvOMQ^n`~bzvS2UYdmtLjByOO zR&%^RJD(dZ$%7#oL0xXb0hop@yxcB@ABG;#<6!ZDRt9NTksVu@7! z1q2+Hk9^jThQk6GU-kJxxA86`hyUD6R%)P4;tx~cu<|kezfb|2fSEG3diD2jJn!BG z6C38=g~k)@LdCzI4Q=&d2ws^+o>lBV7(x{O776nq89ED^i%Thha3<>I>^(ZbzkJr5nG8D_SPBB{;SPEz|8f1qKK*REcsr;4cuoZ!=rb-5oB zb0Kb88az^J0%c(z)?Yo1f%994&6{Qp;t7AamyM3gJr+o^qSuG5`eJ=W1BP~SKAxta zA*rT5wK|HQC@p-+;t*QI2RL_~77u;tC?r8rC=m`DazPMv&7e(9fLfb0j!j3Kb`=8> z8SHa<`Kc_2YDt;~k?=yh9 zAuK)=R8F}3_6O^Xr{bAsY{{K&HgXm|QhR{JmCJhKB+IWawO-*zQ830rWVojiF@iPI zK%JhS=y^Kc=$@@?F!rAUL5pQ!P6b869}5s&Up3FQm)`{NR0&An0MhBJ05U>ub}|AUWUCIyt&A zLhc`mTY7YLwT*MK?!W|Ma%1_>U@bXI+PFO?)Ad)HpW?owGEhK?d91nC5-QZ?{vZI4 zj9;YNkm8~XqJOV!ep4Gl)+9WO(G$|=u-UcOe-xG2H=t=N)cWBh(8qF*N_oR@Xgvz{ zdgyg{{~5&jpebm9c|+4|LR0Ui57t%o#p~^fta5H^*3u0^^3hn9X4aJv6M?Ak&G%}# zalRz8XZ$9U49F|#^;^44;6*9|F?{-bt0x&(`@hGUFWH`B0>ggjB_KPReI{X2kNWX> z4kzP)xk2~X2=61~F!!(Rfva5<^TjOvRl5#rePaxLq!hAJj zaKBm6MZH)Zu`+1{LiTcmGbeik>!2m1)YyugC7Of;F($!YonJrG4iQxz+Bg-54!)M` z-u0sO$)j`=@!UA^+ilinOu)V&G%?rm_<%PZL9W7HHS4T|U`sh|HcqqmJ~~|rgRo8% zr!R?N`na6^lj`ZsM?|JQ?1`uT=Mpvc%?$ekE@7r0rlZE^g7im=(HzZieV&=W1Qe@K zY>f^>4`t@N;RK6LBC~xZL@hNPM$^L`nf;oAqfWCI%Q^zsj0p$nC$0zHtxO^DM!#+f z4Xwg{;B^=yJ7~SA@E-mb*^zIvq}A2uRi$iyt(!&m>p5w_{CU8IDyP(4(DBRWhww5H z<;qaexsltuD$Y}GQfky)0sLsb5<&QuTp)%GG%sVGy@Ul*a+-i|dEskCn7+9<0s5pD zb@Dtu#X+XcJyBQ&!0QukdeCjsyI1V5E$o49|Mfot9tXQJis_Q61~yr}g1Y(ev``3x zrUZ~p=f0y4SS`x$mr9fe+SPw7c(0)2yge6^+UlWUm~Z4X|Mc@{c_$c*Q3zGk%dw4~ zZ`^9`?W{s_hm`*-2p#VjJ>MYL-rR}~PC}H&ddkwI6?;;!T%8F%Px6DiO7OX^fv}PX zqzt1|GY;0hl_7K#)tlyA-edGGunL;UK@MSov(2^{TA&;>JAt~mYjdYNl7JuIxVmzHV(hS}C<{BU74SSx_6TxgZpK6YQpg|Hw zd|}6Ybt0fdNgRe;hGe!;@1TYygxoH;$R>Jc6jR)KaT7i3w*$aulXa>!G$GC7d}cb= z_Q}oI^-5)jnGYH8Pf7>{cre2+ZtDM}HllX{q7$MHvq$<)AT8~F-;#v?;Bov(9;B3# z1bfU_vy{r)Z@K=cmR206CEhXIzb04Uk1-IxT$I$K&N)Z|H~12%40U5O@!W z!sz;ZA~hYmi9f2Amv$Urjuckym+24#)#s1_b>UNdchpM;eH|DqE(L> z60Mn{9yQfTSf@BAxdA(kmB+|kfHl0-*t~^EF`Yv+scDOQ z0BcYb{Y)-k*fH}b9bzudHtFxDk-#d7WAUca%~pemFc5xQ;<_>{273SRcP1G?TFGT$ zX&IsWb-VMqMB6gw2yPOcyr)bqkH^b>HBu|zygW@qW1T6w)QmfL z^|Qtgbi$N@09PSDPEk=|(r-Pwo!vc&UFL=POjNVD)7g+ufP$y4iA51DEjw#Ph}`>H zBGpR`5p9@wT{KeW?B*QxA+UqMoGVNNNZA8hF~j0lF_!kvQ{u=T_4%&@O6xK{95LyB z(G9tB(Slt&E6RUfe*FP=w@8AB``1k3MY4U{cpF*Rp7KX?{{n!N5lI*&54)UyD-L^H z{E34@aJLWnIQ}WR^->}X-?E4sal|3x;K-u#R4s;(FHp~B#Z90f2&(pZ_8R-o^>N~r z%^^UGB;Ie8yI^0;YWh{ZztWIPaf2b$p}9K2Oacb@Q`^SlrR)!b>50P63F!_b#zXB6bAi7?mk5#GbD6I1R_W&%9SZX~&SYU%W2zJn z#ec8du5vhWgd6@+A)_D2@@DLgJxMtW#v>U@x2k-AG}wv~%K+@>#y(1k+tfINa*w== zgHKnJ2OiWMrRXn#Nw#w&KcA3#*iHIFn79p-9AI;iZhYiGU4J-|3}(GNGE*K~8Wh^3 zjr!&xy~FA6_qVzo)aH3p~O*7PK|WBxTwOg0(p9^PSX`B+^y=0stPmS zs}wzvIFL=AbO^Yzu?n!$yA0BZyO=s~Sz9Opw4z&o4QX6|7b||U?GqmXzFo5d@3P!z1C?);&B&*z_ojXq4-{Z0ei=E{XXjN zG0$9A29?n)a-_WVEr)2#>ZYkbDs%kS?F)VfK|gqR+$S49K%&vTM3fD-xi(>nWk2LR z%{o*bQ-mGMR5+iYlCh6FK6tz%2TtvshlvJV+W2TOCi*Q`%v-+bVbb(%R9P{OrDhaJ z=Os6O<-V&7^LPvXd&1f2H=rUUhYHj&lkdYPUr@;;CyBkM&yk9WYuIZ7GiqbN6(09;_@# zmxxeA<#%?{5YnGXyC5@9-EO$5Gw*x6(eVRWjmY7$sd89mmtN_@S(iuPRrvjiYPG@O zH??-x?b#9(OZ2b2?mUN=lc0-ULYQ+(f7R3a@ zC#vwUU$f=b;GRvw;ZdsPu1<-Tk!x~iT3mTiD#TN13^wb8U?yivda$5E*G`$aY{}Di z)A|0f3b92`OP9lUoJbnHf)N$^=LN4Je-j|=)`jn^MY>l^B*%^B`LOXfbEJ^ zVO`lfrOfqFtnyK;Uy=#!e7@qF<);Y41ySAyv&RhAyjGwwJ`baG>ps))d8vnM)*yX$ z$DM-kThaYjOfPvq^?U*-P-T`SY<`yl&4?yOfchQA2U}yGF!mj9{7pY60_3ExNs+RM z)501m*d-DNvEaTe{7?|m-QK&Sed4xh99Db~ow&`rC3)UmfZ7s^9BOYy5}rD=FRT80 z_ytc*kks?EX#ML(UK3=Icg9JJ9^@)Fx@hs1k~qLS39JB=9!O@yD-!}D%a|YO<_B?Q+AkQq?r-OpcVDF5|eAmda<`@BCe}qp3 zM9`A#MyjW3Iu2AecP=Y{`6vNr@Rui^kwbJ1$g6mU1wsJZ*-J~T?Ls8Bo#rMG7Q{vv zSwo_;-re^KHJLxGP2{MD9>Q6hm)b1#HTGe@J$2WjcEIt8qM(5lo2m{AwD7S1yrsD2 z^X`t?3Gx+9>c0-tdgygT93njH{pD-+=(KG!>#OjrlNU>ua;X2m-I2}npEFo*4mhxY zg$$h^F62Xu4!lh+{6GVae1S?m&fk}@`{k^y|!~~OBwTTkc z4ibi_ww`eSiD}al>aQ~46L636xnxaR` z@KmFkmc@fbjUPp}6F;NJo$Tb7X3gJB%76AYpfdG+^9HZd8z@__uELHs;`}C@H2W(M znVl6F)L6E3v-E-9N4d}QB>F5t0kB`!Se|Hw_I&u^wSGUzPVnr6E+0zoCx+p7@OeS_ zJ8Z6-^j=O+``|JiVrLd82g8NkE@oE=({y{-=x^50l=^o1>w}MJX*~)z{I3rn3gsv0 z_ByV|I%WTLu+N(xkuHg(eno*E45fbRyM@3lS{P|Pc6^j(a4{*gF#6Mscl^Z5d#~Mi zi@g{UB%PZ9qZ+gxOPRemclS=uC4}}9#^GnL>TUHC?rqIqjLz_mc+Q<~lWS7jtgf>e z76~HL%?rn@YfYKb3HUiB1))_7*oa(7wstq;TrCIzFOVri`RA)W;jO$EZTT1LALN6q z1Dgq|&DEk!G|>{fp2}lKB<;MAJ2+pU#PM-sT!V&1m?i-)3s0LDXh~qwhR=$ZGW&R{ zPmh)T!#Jk`;DEZknJ ze`yQ)$0h2kFQ!BL+w@rJy5i}}r&&t@XdCIOM}MU*s3#l$XKIvTIa>t^107Q%+HGNz z`g8j*_GZ&k&bQ0?kU^I+(W91STkK<^V%zVHWGGsKriVF6!6FiRO=Ew??7_CW2yY5~ z6hzr?k7hMN44@)+dBQzG+pUfp^05Ul!G>qhHVokN%C>@4NxjK`pk36b0i0gcu?c{o z6Bi*jUmE~Ib#Q|cxgN*rEd|LZ4wgI_#HFADLwNOWj?kaL>!|qg?NW=Z>Db2kIvs^U z@XA~%!@Kf~Vf+nM?hauSct2rNNl#dpM78PwAr6yuu)G@uRZj$a3GOf-X$Y2Es`-)e zY`RE=mdsWGEo_ z9{LwVXOB z+-K6@QfD_sixZdGcX*rJ8DP51ZL>C6y=9kv-T~DX)y5T++ofj#5Y~Z~N&+A|(yI;& zM^ir@b3p=um`^LavBiyeLke3*j_Ik8XACqJp_$ft5gmLJfYl1Hh&M0dg^PirAY-Eb0+$0p^NfK1PUX< zfaLPfa^;$;OmIX%yoisPG6;qM3CR%iR{&&DbDyIP`Kcl^tG^z2x{?Ai)vL>odm_cT zsZi^^G}Wp(Fh{bCb2WT?g(gLPl<{_^ocRhJ^NwNLKOw%)q~)#O@c35Rtfy2iHwh%S u9J+g7xMB*yQ9>!w_rF>kn7%B@t2p literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_flushed_multi_block_rt/legacy_tables-legacy_ka_flushed_multi_block_rt-ka-1-Digest.sha1 b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_flushed_multi_block_rt/legacy_tables-legacy_ka_flushed_multi_block_rt-ka-1-Digest.sha1 new file mode 100644 index 0000000000..bfe4bc39b9 --- /dev/null +++ b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_flushed_multi_block_rt/legacy_tables-legacy_ka_flushed_multi_block_rt-ka-1-Digest.sha1 @@ -0,0 +1 @@ +3995406674 \ No newline at end of file diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_flushed_multi_block_rt/legacy_tables-legacy_ka_flushed_multi_block_rt-ka-1-Filter.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_flushed_multi_block_rt/legacy_tables-legacy_ka_flushed_multi_block_rt-ka-1-Filter.db new file mode 100644 index 0000000000000000000000000000000000000000..606783dea3076a83365a591e275373db865fea0f GIT binary patch literal 16 XcmZQzU|?lnU|{56U=VO*U|<3O0q_7~ literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_flushed_multi_block_rt/legacy_tables-legacy_ka_flushed_multi_block_rt-ka-1-Index.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_flushed_multi_block_rt/legacy_tables-legacy_ka_flushed_multi_block_rt-ka-1-Index.db new file mode 100644 index 0000000000000000000000000000000000000000..1faa37893891eefd837ff9a9bcb96da8968c481d GIT binary patch literal 306 zcmZQzVPIfL0b(d%RH*;||9=CF%fP_OAjkkx0|ZbC$Pxy#nczZ9WrkoCKtc$@5ZZ-B zkr6hXKtV7NIs>5voS-&Bjb{W4qu2ZzpsBFVjs-R`^@)^GjHB|vtMKw zhGT4Hif|ypwnErgVas76@{OBSx&mERwn3GpD=gII>5V#-KHH><-)=Ib8ubRFL7%2G znsQ7z`FRGTy0rLJ;(4DP!o_0ov|6oWUIBzuHIMiRt{gvWyNSIzeh_a8i+FQb91rL? z$2%(aqlB`QvI}Kb%I=gsDa$C!DT{rB#UDbbPo+GAav0^glw&9-QC>-TGv%F>k5X=? zJb+E8@gVc5xQTKHHtR=uFE&U0eeMK~^WuaAMG^@hRHd=lE>wSAf8w}%54NWTd%}Kf z#Yt@6HQ0gu*g+B4Gi$L`TI}d*?D%%O?du|K5{_pEU>7dKF4JMxQS-M)gX0z@GEsiS z)-K1c#`BX{9-}y$f!8y82bcj)cCDYF#-|d=BG}fkkM3aINdz zV4N>4MR_xmvj+2^vS9i=!gf|=b;y7?y7;-Je#u$I=yyF6m(X|mBr9oe|QZ+m*1>U zgl@<!@zuSpCTE0baW>iAIZ0hqwx2`Ww!TF9BA)ad7=0cuzTvMZX>YghVu8Y|FWm@ zVc389!=z>fXg^6;Rseqw0?w)1R3NUrJ*0r+75phNxeUa^S6D(|J`ff8u3HA;>VY?H z+klszXljJdv(~aO3eM-ebWL3aXkWUqrDqVh=J|{EI^d4eXPV&in!CdKqyNN-VqfpC zc;MvRFF*JGF;i%-<8ScaIT#DB5v%`d&gJNb5B0qMl$|*jdLb;F6XNhv