From 3aa84cb7088bf2dcbd2e4446dea3f0b28ff37280 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Fri, 10 Jul 2020 11:52:35 +0300 Subject: [PATCH 01/32] [dbnode] A noop AggregateTiles thrift RPC --- scripts/development/m3_stack/m3db_data/.lock | 0 .../m3_stack/m3db_data/etcd/member/snap/db | Bin 0 -> 24576 bytes .../wal/0000000000000000-0000000000000000.wal | Bin 0 -> 64000000 bytes src/dbnode/generated/thrift/rpc.thrift | 15 + src/dbnode/generated/thrift/rpc/rpc.go | 1068 ++++++++++++++--- src/dbnode/generated/thrift/rpc/rpc_mock.go | 639 ---------- src/dbnode/generated/thrift/rpc/tchan-rpc.go | 50 + .../server/tchannelthrift/node/service.go | 26 + src/dbnode/tracepoint/tracepoint.go | 3 + 9 files changed, 1017 insertions(+), 784 deletions(-) create mode 100644 scripts/development/m3_stack/m3db_data/.lock create mode 100644 scripts/development/m3_stack/m3db_data/etcd/member/snap/db create mode 100644 scripts/development/m3_stack/m3db_data/etcd/member/wal/0000000000000000-0000000000000000.wal delete mode 100644 src/dbnode/generated/thrift/rpc/rpc_mock.go diff --git a/scripts/development/m3_stack/m3db_data/.lock b/scripts/development/m3_stack/m3db_data/.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/scripts/development/m3_stack/m3db_data/etcd/member/snap/db b/scripts/development/m3_stack/m3db_data/etcd/member/snap/db new file mode 100644 index 0000000000000000000000000000000000000000..40a6cd8eb8fbacdac00ebcb8408bd2ac2bc83417 GIT binary patch literal 24576 zcmeI&zi!h&90%|uKq;sK-hk)^rYN=J=AS1dSdf?^3PM$>oa9g=?4*jFN>DLWtc-mC zHl6?pi8tX57_zW2!T0AoOIFf0twc*vzE_>?-`&~1d^-K^Tqu}w-JYl4*QO=8zGoWJ zYuhKM-?psSw(MN|y4C8JlApPuyrcjHC_n)UP=Epypa2CZKmiI+;ED(o?L1D(|F6x= zb2k6KY5Na9Kll~-?>^29XGj4GP=Epypa2CZKmiI+fC3btz!eb4_V-JL+v#j%J>V1S z4b(EK#9vTlec-W;r#Rn2E!%hngYxlx#Ii1s^*0d9IzkpdL7ad7E5tJX2o;xwA2{5_ zxoqQAOj6!2aS#UM2=ZoBTaH)?IyskgkQ>$aSV+S7Wx*?Af(e@pEq$)3Ny?$(-B z2Y;?#^IDGDuBc%UY2~ZP>vwm;Q7;J9dpotAv5rRjx^E^if6PQ8odol}rX?G5Qa{@% zKmiI+fC3bt00k&O0SZvS+0u-PC1t>rP3Q&Lo3k4*vmQqSHY?H4)M4aEhe}OokuZJ`J9}s8x`WZL4|IY3; z-ivb1on&(pj})K)1t>rP3Q&Lo6rcbFC_sT_5|F%J%0=w|m+@TL&pzw-|JnEnZpzjZ vrP3Q&Lo6rcbF{wIMyDMjt3 literal 0 HcmV?d00001 diff --git a/scripts/development/m3_stack/m3db_data/etcd/member/wal/0000000000000000-0000000000000000.wal b/scripts/development/m3_stack/m3db_data/etcd/member/wal/0000000000000000-0000000000000000.wal new file mode 100644 index 0000000000000000000000000000000000000000..4cd716ac5a202055c5c34c1501c08e820ed48757 GIT binary patch literal 64000000 zcmeFt&1+Ow7zf}xAF0;}aVQj~gHSjNaS<|K#>oubbSLN{h=L$N^D$y16GJjqAq0|= zl0^+&lqg93z(p5bC@zeGTbC^@rMM7^#g#~@t?MA(%%qq~?O*Vm%jMjA?z!)Keor>) zjO93+>pXnYeP4=GxtI4gUhF7*6#wz-(w{fK`|a!dsodo|E7xwUKEJgm>g(?NBJRmO ze17$>-acrT| zsdM9_Q(>WVhRq|yncSntUp>kcK1ljU`Q+}7IGy`tZT0)UWIf8I^XZSf%PYzLS6A=e z*j3n_?09?1e0uA@n_F}8^~&PPot=fXRHr~DTuQ}D53Vo1e){eD*$*?r$Bq{E7E8re zvo+S7ohy#j%BO3C)k9 z002P#uZ@u4z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95{d-IuHN=0002;e{F;W2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J^Xw(18E|0001x|7#;8IB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yRZ zhYkb)0001h{9hX(!GQw@4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`?QJ9Hob00000b%7 z0Kg!B>uKyLgbWxkV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM X7%*VKfB^#r3>YwAz<>b*27Utpr7NOp literal 0 HcmV?d00001 diff --git a/src/dbnode/generated/thrift/rpc.thrift b/src/dbnode/generated/thrift/rpc.thrift index dda00739c3..082c5f470f 100644 --- a/src/dbnode/generated/thrift/rpc.thrift +++ b/src/dbnode/generated/thrift/rpc.thrift @@ -64,6 +64,8 @@ service Node { void repair() throws (1: Error err) TruncateResult truncate(1: TruncateRequest req) throws (1: Error err) + AggregateTilesResult aggregateTiles(1: AggregateTilesRequest req) throws (1: Error err) + // Management endpoints NodeHealthResult health() throws (1: Error err) // NB: bootstrapped is for use with cluster management tools like k8s. @@ -491,6 +493,19 @@ struct Query { 7: optional FieldQuery field } +struct AggregateTilesRequest { + 1: required string nameSpace + 2: required i32 shard + 3: required i64 rangeStart + 4: required i64 rangeEnd + 5: required string step + 6: required string formula + 7: bool removeResets +} + +struct AggregateTilesResult { +} + struct DebugProfileStartRequest { 1: required string name 2: required string filePathTemplate diff --git a/src/dbnode/generated/thrift/rpc/rpc.go b/src/dbnode/generated/thrift/rpc/rpc.go index 66575da7fd..da3a9e2c7a 100644 --- a/src/dbnode/generated/thrift/rpc/rpc.go +++ b/src/dbnode/generated/thrift/rpc/rpc.go @@ -12906,6 +12906,395 @@ func (p *Query) String() string { return fmt.Sprintf("Query(%+v)", *p) } +// Attributes: +// - NameSpace +// - Shard +// - RangeStart +// - RangeEnd +// - Step +// - Formula +// - RemoveResets +type AggregateTilesRequest struct { + NameSpace string `thrift:"nameSpace,1,required" db:"nameSpace" json:"nameSpace"` + Shard int32 `thrift:"shard,2,required" db:"shard" json:"shard"` + RangeStart int64 `thrift:"rangeStart,3,required" db:"rangeStart" json:"rangeStart"` + RangeEnd int64 `thrift:"rangeEnd,4,required" db:"rangeEnd" json:"rangeEnd"` + Step string `thrift:"step,5,required" db:"step" json:"step"` + Formula string `thrift:"formula,6,required" db:"formula" json:"formula"` + RemoveResets bool `thrift:"removeResets,7" db:"removeResets" json:"removeResets"` +} + +func NewAggregateTilesRequest() *AggregateTilesRequest { + return &AggregateTilesRequest{} +} + +func (p *AggregateTilesRequest) GetNameSpace() string { + return p.NameSpace +} + +func (p *AggregateTilesRequest) GetShard() int32 { + return p.Shard +} + +func (p *AggregateTilesRequest) GetRangeStart() int64 { + return p.RangeStart +} + +func (p *AggregateTilesRequest) GetRangeEnd() int64 { + return p.RangeEnd +} + +func (p *AggregateTilesRequest) GetStep() string { + return p.Step +} + +func (p *AggregateTilesRequest) GetFormula() string { + return p.Formula +} + +func (p *AggregateTilesRequest) GetRemoveResets() bool { + return p.RemoveResets +} +func (p *AggregateTilesRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetNameSpace bool = false + var issetShard bool = false + var issetRangeStart bool = false + var issetRangeEnd bool = false + var issetStep bool = false + var issetFormula bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetNameSpace = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetShard = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetRangeStart = true + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + issetRangeEnd = true + case 5: + if err := p.ReadField5(iprot); err != nil { + return err + } + issetStep = true + case 6: + if err := p.ReadField6(iprot); err != nil { + return err + } + issetFormula = true + case 7: + if err := p.ReadField7(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + if !issetShard { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Shard is not set")) + } + if !issetRangeStart { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeStart is not set")) + } + if !issetRangeEnd { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeEnd is not set")) + } + if !issetStep { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Step is not set")) + } + if !issetFormula { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Formula is not set")) + } + return nil +} + +func (p *AggregateTilesRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *AggregateTilesRequest) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Shard = v + } + return nil +} + +func (p *AggregateTilesRequest) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.RangeStart = v + } + return nil +} + +func (p *AggregateTilesRequest) ReadField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.RangeEnd = v + } + return nil +} + +func (p *AggregateTilesRequest) ReadField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + p.Step = v + } + return nil +} + +func (p *AggregateTilesRequest) ReadField6(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 6: ", err) + } else { + p.Formula = v + } + return nil +} + +func (p *AggregateTilesRequest) ReadField7(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 7: ", err) + } else { + p.RemoveResets = v + } + return nil +} + +func (p *AggregateTilesRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("AggregateTilesRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + if err := p.writeField6(oprot); err != nil { + return err + } + if err := p.writeField7(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AggregateTilesRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:nameSpace: ", p), err) + } + if err := oprot.WriteString(string(p.NameSpace)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:nameSpace: ", p), err) + } + return err +} + +func (p *AggregateTilesRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("shard", thrift.I32, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:shard: ", p), err) + } + if err := oprot.WriteI32(int32(p.Shard)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.shard (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:shard: ", p), err) + } + return err +} + +func (p *AggregateTilesRequest) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeStart", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:rangeStart: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeStart)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeStart (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:rangeStart: ", p), err) + } + return err +} + +func (p *AggregateTilesRequest) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeEnd", thrift.I64, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:rangeEnd: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeEnd)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeEnd (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:rangeEnd: ", p), err) + } + return err +} + +func (p *AggregateTilesRequest) writeField5(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("step", thrift.STRING, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:step: ", p), err) + } + if err := oprot.WriteString(string(p.Step)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.step (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:step: ", p), err) + } + return err +} + +func (p *AggregateTilesRequest) writeField6(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("formula", thrift.STRING, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:formula: ", p), err) + } + if err := oprot.WriteString(string(p.Formula)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.formula (6) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:formula: ", p), err) + } + return err +} + +func (p *AggregateTilesRequest) writeField7(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("removeResets", thrift.BOOL, 7); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:removeResets: ", p), err) + } + if err := oprot.WriteBool(bool(p.RemoveResets)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.removeResets (7) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 7:removeResets: ", p), err) + } + return err +} + +func (p *AggregateTilesRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AggregateTilesRequest(%+v)", *p) +} + +type AggregateTilesResult_ struct { +} + +func NewAggregateTilesResult_() *AggregateTilesResult_ { + return &AggregateTilesResult_{} +} + +func (p *AggregateTilesResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *AggregateTilesResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("AggregateTilesResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AggregateTilesResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AggregateTilesResult_(%+v)", *p) +} + // Attributes: // - Name // - FilePathTemplate @@ -13734,6 +14123,9 @@ type Node interface { // Parameters: // - Req Truncate(req *TruncateRequest) (r *TruncateResult_, err error) + // Parameters: + // - Req + AggregateTiles(req *AggregateTilesRequest) (r *AggregateTilesResult_, err error) Health() (r *NodeHealthResult_, err error) Bootstrapped() (r *NodeBootstrappedResult_, err error) BootstrappedInPlacementOrNoPlacement() (r *NodeBootstrappedInPlacementOrNoPlacementResult_, err error) @@ -15156,6 +15548,87 @@ func (p *NodeClient) recvTruncate() (value *TruncateResult_, err error) { return } +// Parameters: +// - Req +func (p *NodeClient) AggregateTiles(req *AggregateTilesRequest) (r *AggregateTilesResult_, err error) { + if err = p.sendAggregateTiles(req); err != nil { + return + } + return p.recvAggregateTiles() +} + +func (p *NodeClient) sendAggregateTiles(req *AggregateTilesRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("aggregateTiles", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeAggregateTilesArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvAggregateTiles() (value *AggregateTilesResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "aggregateTiles" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "aggregateTiles failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "aggregateTiles failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error69 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error70 error + error70, err = error69.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error70 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "aggregateTiles failed: invalid message type") + return + } + result := NodeAggregateTilesResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + func (p *NodeClient) Health() (r *NodeHealthResult_, err error) { if err = p.sendHealth(); err != nil { return @@ -15202,16 +15675,16 @@ func (p *NodeClient) recvHealth() (value *NodeHealthResult_, err error) { return } if mTypeId == thrift.EXCEPTION { - error69 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error70 error - error70, err = error69.Read(iprot) + error71 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error72 error + error72, err = error71.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error70 + err = error72 return } if mTypeId != thrift.REPLY { @@ -15279,16 +15752,16 @@ func (p *NodeClient) recvBootstrapped() (value *NodeBootstrappedResult_, err err return } if mTypeId == thrift.EXCEPTION { - error71 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error72 error - error72, err = error71.Read(iprot) + error73 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error74 error + error74, err = error73.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error72 + err = error74 return } if mTypeId != thrift.REPLY { @@ -15356,16 +15829,16 @@ func (p *NodeClient) recvBootstrappedInPlacementOrNoPlacement() (value *NodeBoot return } if mTypeId == thrift.EXCEPTION { - error73 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error74 error - error74, err = error73.Read(iprot) + error75 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error76 error + error76, err = error75.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error74 + err = error76 return } if mTypeId != thrift.REPLY { @@ -15433,16 +15906,16 @@ func (p *NodeClient) recvGetPersistRateLimit() (value *NodePersistRateLimitResul return } if mTypeId == thrift.EXCEPTION { - error75 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error76 error - error76, err = error75.Read(iprot) + error77 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error78 error + error78, err = error77.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error76 + err = error78 return } if mTypeId != thrift.REPLY { @@ -15514,16 +15987,16 @@ func (p *NodeClient) recvSetPersistRateLimit() (value *NodePersistRateLimitResul return } if mTypeId == thrift.EXCEPTION { - error77 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error78 error - error78, err = error77.Read(iprot) + error79 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error80 error + error80, err = error79.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error78 + err = error80 return } if mTypeId != thrift.REPLY { @@ -15591,16 +16064,16 @@ func (p *NodeClient) recvGetWriteNewSeriesAsync() (value *NodeWriteNewSeriesAsyn return } if mTypeId == thrift.EXCEPTION { - error79 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error80 error - error80, err = error79.Read(iprot) + error81 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error82 error + error82, err = error81.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error80 + err = error82 return } if mTypeId != thrift.REPLY { @@ -15672,16 +16145,16 @@ func (p *NodeClient) recvSetWriteNewSeriesAsync() (value *NodeWriteNewSeriesAsyn return } if mTypeId == thrift.EXCEPTION { - error81 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error82 error - error82, err = error81.Read(iprot) + error83 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error84 error + error84, err = error83.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error82 + err = error84 return } if mTypeId != thrift.REPLY { @@ -15749,16 +16222,16 @@ func (p *NodeClient) recvGetWriteNewSeriesBackoffDuration() (value *NodeWriteNew return } if mTypeId == thrift.EXCEPTION { - error83 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error84 error - error84, err = error83.Read(iprot) + error85 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error86 error + error86, err = error85.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error84 + err = error86 return } if mTypeId != thrift.REPLY { @@ -15830,16 +16303,16 @@ func (p *NodeClient) recvSetWriteNewSeriesBackoffDuration() (value *NodeWriteNew return } if mTypeId == thrift.EXCEPTION { - error85 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error86 error - error86, err = error85.Read(iprot) + error87 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error88 error + error88, err = error87.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error86 + err = error88 return } if mTypeId != thrift.REPLY { @@ -15907,16 +16380,16 @@ func (p *NodeClient) recvGetWriteNewSeriesLimitPerShardPerSecond() (value *NodeW return } if mTypeId == thrift.EXCEPTION { - error87 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error88 error - error88, err = error87.Read(iprot) + error89 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error90 error + error90, err = error89.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error88 + err = error90 return } if mTypeId != thrift.REPLY { @@ -15988,16 +16461,16 @@ func (p *NodeClient) recvSetWriteNewSeriesLimitPerShardPerSecond() (value *NodeW return } if mTypeId == thrift.EXCEPTION { - error89 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error90 error - error90, err = error89.Read(iprot) + error91 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error92 error + error92, err = error91.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error90 + err = error92 return } if mTypeId != thrift.REPLY { @@ -16069,16 +16542,16 @@ func (p *NodeClient) recvDebugProfileStart() (value *DebugProfileStartResult_, e return } if mTypeId == thrift.EXCEPTION { - error91 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error92 error - error92, err = error91.Read(iprot) + error93 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error94 error + error94, err = error93.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error92 + err = error94 return } if mTypeId != thrift.REPLY { @@ -16150,16 +16623,16 @@ func (p *NodeClient) recvDebugProfileStop() (value *DebugProfileStopResult_, err return } if mTypeId == thrift.EXCEPTION { - error93 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error94 error - error94, err = error93.Read(iprot) + error95 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error96 error + error96, err = error95.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error94 + err = error96 return } if mTypeId != thrift.REPLY { @@ -16231,16 +16704,16 @@ func (p *NodeClient) recvDebugIndexMemorySegments() (value *DebugIndexMemorySegm return } if mTypeId == thrift.EXCEPTION { - error95 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error96 error - error96, err = error95.Read(iprot) + error97 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error98 error + error98, err = error97.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error96 + err = error98 return } if mTypeId != thrift.REPLY { @@ -16282,39 +16755,40 @@ func (p *NodeProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { func NewNodeProcessor(handler Node) *NodeProcessor { - self97 := &NodeProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} - self97.processorMap["query"] = &nodeProcessorQuery{handler: handler} - self97.processorMap["aggregateRaw"] = &nodeProcessorAggregateRaw{handler: handler} - self97.processorMap["aggregate"] = &nodeProcessorAggregate{handler: handler} - self97.processorMap["fetch"] = &nodeProcessorFetch{handler: handler} - self97.processorMap["fetchTagged"] = &nodeProcessorFetchTagged{handler: handler} - self97.processorMap["write"] = &nodeProcessorWrite{handler: handler} - self97.processorMap["writeTagged"] = &nodeProcessorWriteTagged{handler: handler} - self97.processorMap["fetchBatchRaw"] = &nodeProcessorFetchBatchRaw{handler: handler} - self97.processorMap["fetchBatchRawV2"] = &nodeProcessorFetchBatchRawV2{handler: handler} - self97.processorMap["fetchBlocksRaw"] = &nodeProcessorFetchBlocksRaw{handler: handler} - self97.processorMap["fetchBlocksMetadataRawV2"] = &nodeProcessorFetchBlocksMetadataRawV2{handler: handler} - self97.processorMap["writeBatchRaw"] = &nodeProcessorWriteBatchRaw{handler: handler} - self97.processorMap["writeBatchRawV2"] = &nodeProcessorWriteBatchRawV2{handler: handler} - self97.processorMap["writeTaggedBatchRaw"] = &nodeProcessorWriteTaggedBatchRaw{handler: handler} - self97.processorMap["writeTaggedBatchRawV2"] = &nodeProcessorWriteTaggedBatchRawV2{handler: handler} - self97.processorMap["repair"] = &nodeProcessorRepair{handler: handler} - self97.processorMap["truncate"] = &nodeProcessorTruncate{handler: handler} - self97.processorMap["health"] = &nodeProcessorHealth{handler: handler} - self97.processorMap["bootstrapped"] = &nodeProcessorBootstrapped{handler: handler} - self97.processorMap["bootstrappedInPlacementOrNoPlacement"] = &nodeProcessorBootstrappedInPlacementOrNoPlacement{handler: handler} - self97.processorMap["getPersistRateLimit"] = &nodeProcessorGetPersistRateLimit{handler: handler} - self97.processorMap["setPersistRateLimit"] = &nodeProcessorSetPersistRateLimit{handler: handler} - self97.processorMap["getWriteNewSeriesAsync"] = &nodeProcessorGetWriteNewSeriesAsync{handler: handler} - self97.processorMap["setWriteNewSeriesAsync"] = &nodeProcessorSetWriteNewSeriesAsync{handler: handler} - self97.processorMap["getWriteNewSeriesBackoffDuration"] = &nodeProcessorGetWriteNewSeriesBackoffDuration{handler: handler} - self97.processorMap["setWriteNewSeriesBackoffDuration"] = &nodeProcessorSetWriteNewSeriesBackoffDuration{handler: handler} - self97.processorMap["getWriteNewSeriesLimitPerShardPerSecond"] = &nodeProcessorGetWriteNewSeriesLimitPerShardPerSecond{handler: handler} - self97.processorMap["setWriteNewSeriesLimitPerShardPerSecond"] = &nodeProcessorSetWriteNewSeriesLimitPerShardPerSecond{handler: handler} - self97.processorMap["debugProfileStart"] = &nodeProcessorDebugProfileStart{handler: handler} - self97.processorMap["debugProfileStop"] = &nodeProcessorDebugProfileStop{handler: handler} - self97.processorMap["debugIndexMemorySegments"] = &nodeProcessorDebugIndexMemorySegments{handler: handler} - return self97 + self99 := &NodeProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} + self99.processorMap["query"] = &nodeProcessorQuery{handler: handler} + self99.processorMap["aggregateRaw"] = &nodeProcessorAggregateRaw{handler: handler} + self99.processorMap["aggregate"] = &nodeProcessorAggregate{handler: handler} + self99.processorMap["fetch"] = &nodeProcessorFetch{handler: handler} + self99.processorMap["fetchTagged"] = &nodeProcessorFetchTagged{handler: handler} + self99.processorMap["write"] = &nodeProcessorWrite{handler: handler} + self99.processorMap["writeTagged"] = &nodeProcessorWriteTagged{handler: handler} + self99.processorMap["fetchBatchRaw"] = &nodeProcessorFetchBatchRaw{handler: handler} + self99.processorMap["fetchBatchRawV2"] = &nodeProcessorFetchBatchRawV2{handler: handler} + self99.processorMap["fetchBlocksRaw"] = &nodeProcessorFetchBlocksRaw{handler: handler} + self99.processorMap["fetchBlocksMetadataRawV2"] = &nodeProcessorFetchBlocksMetadataRawV2{handler: handler} + self99.processorMap["writeBatchRaw"] = &nodeProcessorWriteBatchRaw{handler: handler} + self99.processorMap["writeBatchRawV2"] = &nodeProcessorWriteBatchRawV2{handler: handler} + self99.processorMap["writeTaggedBatchRaw"] = &nodeProcessorWriteTaggedBatchRaw{handler: handler} + self99.processorMap["writeTaggedBatchRawV2"] = &nodeProcessorWriteTaggedBatchRawV2{handler: handler} + self99.processorMap["repair"] = &nodeProcessorRepair{handler: handler} + self99.processorMap["truncate"] = &nodeProcessorTruncate{handler: handler} + self99.processorMap["aggregateTiles"] = &nodeProcessorAggregateTiles{handler: handler} + self99.processorMap["health"] = &nodeProcessorHealth{handler: handler} + self99.processorMap["bootstrapped"] = &nodeProcessorBootstrapped{handler: handler} + self99.processorMap["bootstrappedInPlacementOrNoPlacement"] = &nodeProcessorBootstrappedInPlacementOrNoPlacement{handler: handler} + self99.processorMap["getPersistRateLimit"] = &nodeProcessorGetPersistRateLimit{handler: handler} + self99.processorMap["setPersistRateLimit"] = &nodeProcessorSetPersistRateLimit{handler: handler} + self99.processorMap["getWriteNewSeriesAsync"] = &nodeProcessorGetWriteNewSeriesAsync{handler: handler} + self99.processorMap["setWriteNewSeriesAsync"] = &nodeProcessorSetWriteNewSeriesAsync{handler: handler} + self99.processorMap["getWriteNewSeriesBackoffDuration"] = &nodeProcessorGetWriteNewSeriesBackoffDuration{handler: handler} + self99.processorMap["setWriteNewSeriesBackoffDuration"] = &nodeProcessorSetWriteNewSeriesBackoffDuration{handler: handler} + self99.processorMap["getWriteNewSeriesLimitPerShardPerSecond"] = &nodeProcessorGetWriteNewSeriesLimitPerShardPerSecond{handler: handler} + self99.processorMap["setWriteNewSeriesLimitPerShardPerSecond"] = &nodeProcessorSetWriteNewSeriesLimitPerShardPerSecond{handler: handler} + self99.processorMap["debugProfileStart"] = &nodeProcessorDebugProfileStart{handler: handler} + self99.processorMap["debugProfileStop"] = &nodeProcessorDebugProfileStop{handler: handler} + self99.processorMap["debugIndexMemorySegments"] = &nodeProcessorDebugIndexMemorySegments{handler: handler} + return self99 } func (p *NodeProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { @@ -16327,12 +16801,12 @@ func (p *NodeProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, er } iprot.Skip(thrift.STRUCT) iprot.ReadMessageEnd() - x98 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) + x100 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) - x98.Write(oprot) + x100.Write(oprot) oprot.WriteMessageEnd() oprot.Flush() - return false, x98 + return false, x100 } @@ -17137,15 +17611,68 @@ func (p *nodeProcessorRepair) Process(seqId int32, iprot, oprot thrift.TProtocol case *Error: result.Err = v default: - x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing repair: "+err2.Error()) - oprot.WriteMessageBegin("repair", thrift.EXCEPTION, seqId) + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing repair: "+err2.Error()) + oprot.WriteMessageBegin("repair", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } + if err2 = oprot.WriteMessageBegin("repair", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorTruncate struct { + handler Node +} + +func (p *nodeProcessorTruncate) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeTruncateArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("truncate", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeTruncateResult{} + var retval *TruncateResult_ + var err2 error + if retval, err2 = p.handler.Truncate(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing truncate: "+err2.Error()) + oprot.WriteMessageBegin("truncate", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush() return true, err2 } + } else { + result.Success = retval } - if err2 = oprot.WriteMessageBegin("repair", thrift.REPLY, seqId); err2 != nil { + if err2 = oprot.WriteMessageBegin("truncate", thrift.REPLY, seqId); err2 != nil { err = err2 } if err2 = result.Write(oprot); err == nil && err2 != nil { @@ -17163,16 +17690,16 @@ func (p *nodeProcessorRepair) Process(seqId int32, iprot, oprot thrift.TProtocol return true, err } -type nodeProcessorTruncate struct { +type nodeProcessorAggregateTiles struct { handler Node } -func (p *nodeProcessorTruncate) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - args := NodeTruncateArgs{} +func (p *nodeProcessorAggregateTiles) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeAggregateTilesArgs{} if err = args.Read(iprot); err != nil { iprot.ReadMessageEnd() x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) - oprot.WriteMessageBegin("truncate", thrift.EXCEPTION, seqId) + oprot.WriteMessageBegin("aggregateTiles", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush() @@ -17180,16 +17707,16 @@ func (p *nodeProcessorTruncate) Process(seqId int32, iprot, oprot thrift.TProtoc } iprot.ReadMessageEnd() - result := NodeTruncateResult{} - var retval *TruncateResult_ + result := NodeAggregateTilesResult{} + var retval *AggregateTilesResult_ var err2 error - if retval, err2 = p.handler.Truncate(args.Req); err2 != nil { + if retval, err2 = p.handler.AggregateTiles(args.Req); err2 != nil { switch v := err2.(type) { case *Error: result.Err = v default: - x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing truncate: "+err2.Error()) - oprot.WriteMessageBegin("truncate", thrift.EXCEPTION, seqId) + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing aggregateTiles: "+err2.Error()) + oprot.WriteMessageBegin("aggregateTiles", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush() @@ -17198,7 +17725,7 @@ func (p *nodeProcessorTruncate) Process(seqId int32, iprot, oprot thrift.TProtoc } else { result.Success = retval } - if err2 = oprot.WriteMessageBegin("truncate", thrift.REPLY, seqId); err2 != nil { + if err2 = oprot.WriteMessageBegin("aggregateTiles", thrift.REPLY, seqId); err2 != nil { err = err2 } if err2 = result.Write(oprot); err == nil && err2 != nil { @@ -21878,6 +22405,257 @@ func (p *NodeTruncateResult) String() string { return fmt.Sprintf("NodeTruncateResult(%+v)", *p) } +// Attributes: +// - Req +type NodeAggregateTilesArgs struct { + Req *AggregateTilesRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeAggregateTilesArgs() *NodeAggregateTilesArgs { + return &NodeAggregateTilesArgs{} +} + +var NodeAggregateTilesArgs_Req_DEFAULT *AggregateTilesRequest + +func (p *NodeAggregateTilesArgs) GetReq() *AggregateTilesRequest { + if !p.IsSetReq() { + return NodeAggregateTilesArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeAggregateTilesArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeAggregateTilesArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeAggregateTilesArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &AggregateTilesRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeAggregateTilesArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("aggregateTiles_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeAggregateTilesArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeAggregateTilesArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeAggregateTilesArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeAggregateTilesResult struct { + Success *AggregateTilesResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeAggregateTilesResult() *NodeAggregateTilesResult { + return &NodeAggregateTilesResult{} +} + +var NodeAggregateTilesResult_Success_DEFAULT *AggregateTilesResult_ + +func (p *NodeAggregateTilesResult) GetSuccess() *AggregateTilesResult_ { + if !p.IsSetSuccess() { + return NodeAggregateTilesResult_Success_DEFAULT + } + return p.Success +} + +var NodeAggregateTilesResult_Err_DEFAULT *Error + +func (p *NodeAggregateTilesResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeAggregateTilesResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeAggregateTilesResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeAggregateTilesResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeAggregateTilesResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeAggregateTilesResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &AggregateTilesResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeAggregateTilesResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeAggregateTilesResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("aggregateTiles_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeAggregateTilesResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeAggregateTilesResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeAggregateTilesResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeAggregateTilesResult(%+v)", *p) +} + type NodeHealthArgs struct { } @@ -25166,16 +25944,16 @@ func (p *ClusterClient) recvHealth() (value *HealthResult_, err error) { return } if mTypeId == thrift.EXCEPTION { - error237 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error238 error - error238, err = error237.Read(iprot) + error245 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error246 error + error246, err = error245.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error238 + err = error246 return } if mTypeId != thrift.REPLY { @@ -25247,16 +26025,16 @@ func (p *ClusterClient) recvWrite() (err error) { return } if mTypeId == thrift.EXCEPTION { - error239 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error240 error - error240, err = error239.Read(iprot) + error247 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error248 error + error248, err = error247.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error240 + err = error248 return } if mTypeId != thrift.REPLY { @@ -25327,16 +26105,16 @@ func (p *ClusterClient) recvWriteTagged() (err error) { return } if mTypeId == thrift.EXCEPTION { - error241 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error242 error - error242, err = error241.Read(iprot) + error249 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error250 error + error250, err = error249.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error242 + err = error250 return } if mTypeId != thrift.REPLY { @@ -25407,16 +26185,16 @@ func (p *ClusterClient) recvQuery() (value *QueryResult_, err error) { return } if mTypeId == thrift.EXCEPTION { - error243 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error244 error - error244, err = error243.Read(iprot) + error251 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error252 error + error252, err = error251.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error244 + err = error252 return } if mTypeId != thrift.REPLY { @@ -25488,16 +26266,16 @@ func (p *ClusterClient) recvAggregate() (value *AggregateQueryResult_, err error return } if mTypeId == thrift.EXCEPTION { - error245 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error246 error - error246, err = error245.Read(iprot) + error253 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error254 error + error254, err = error253.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error246 + err = error254 return } if mTypeId != thrift.REPLY { @@ -25569,16 +26347,16 @@ func (p *ClusterClient) recvFetch() (value *FetchResult_, err error) { return } if mTypeId == thrift.EXCEPTION { - error247 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error248 error - error248, err = error247.Read(iprot) + error255 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error256 error + error256, err = error255.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error248 + err = error256 return } if mTypeId != thrift.REPLY { @@ -25650,16 +26428,16 @@ func (p *ClusterClient) recvTruncate() (value *TruncateResult_, err error) { return } if mTypeId == thrift.EXCEPTION { - error249 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error250 error - error250, err = error249.Read(iprot) + error257 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error258 error + error258, err = error257.Read(iprot) if err != nil { return } if err = iprot.ReadMessageEnd(); err != nil { return } - err = error250 + err = error258 return } if mTypeId != thrift.REPLY { @@ -25701,15 +26479,15 @@ func (p *ClusterProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { func NewClusterProcessor(handler Cluster) *ClusterProcessor { - self251 := &ClusterProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} - self251.processorMap["health"] = &clusterProcessorHealth{handler: handler} - self251.processorMap["write"] = &clusterProcessorWrite{handler: handler} - self251.processorMap["writeTagged"] = &clusterProcessorWriteTagged{handler: handler} - self251.processorMap["query"] = &clusterProcessorQuery{handler: handler} - self251.processorMap["aggregate"] = &clusterProcessorAggregate{handler: handler} - self251.processorMap["fetch"] = &clusterProcessorFetch{handler: handler} - self251.processorMap["truncate"] = &clusterProcessorTruncate{handler: handler} - return self251 + self259 := &ClusterProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} + self259.processorMap["health"] = &clusterProcessorHealth{handler: handler} + self259.processorMap["write"] = &clusterProcessorWrite{handler: handler} + self259.processorMap["writeTagged"] = &clusterProcessorWriteTagged{handler: handler} + self259.processorMap["query"] = &clusterProcessorQuery{handler: handler} + self259.processorMap["aggregate"] = &clusterProcessorAggregate{handler: handler} + self259.processorMap["fetch"] = &clusterProcessorFetch{handler: handler} + self259.processorMap["truncate"] = &clusterProcessorTruncate{handler: handler} + return self259 } func (p *ClusterProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { @@ -25722,12 +26500,12 @@ func (p *ClusterProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, } iprot.Skip(thrift.STRUCT) iprot.ReadMessageEnd() - x252 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) + x260 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) - x252.Write(oprot) + x260.Write(oprot) oprot.WriteMessageEnd() oprot.Flush() - return false, x252 + return false, x260 } diff --git a/src/dbnode/generated/thrift/rpc/rpc_mock.go b/src/dbnode/generated/thrift/rpc/rpc_mock.go deleted file mode 100644 index 647e08992b..0000000000 --- a/src/dbnode/generated/thrift/rpc/rpc_mock.go +++ /dev/null @@ -1,639 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/m3db/m3/src/dbnode/generated/thrift/rpc/tchan-go - -// Copyright (c) 2020 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -// Package rpc is a generated GoMock package. -package rpc - -import ( - "reflect" - - "github.com/golang/mock/gomock" - "github.com/uber/tchannel-go/thrift" -) - -// MockTChanCluster is a mock of TChanCluster interface -type MockTChanCluster struct { - ctrl *gomock.Controller - recorder *MockTChanClusterMockRecorder -} - -// MockTChanClusterMockRecorder is the mock recorder for MockTChanCluster -type MockTChanClusterMockRecorder struct { - mock *MockTChanCluster -} - -// NewMockTChanCluster creates a new mock instance -func NewMockTChanCluster(ctrl *gomock.Controller) *MockTChanCluster { - mock := &MockTChanCluster{ctrl: ctrl} - mock.recorder = &MockTChanClusterMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use -func (m *MockTChanCluster) EXPECT() *MockTChanClusterMockRecorder { - return m.recorder -} - -// Aggregate mocks base method -func (m *MockTChanCluster) Aggregate(ctx thrift.Context, req *AggregateQueryRequest) (*AggregateQueryResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Aggregate", ctx, req) - ret0, _ := ret[0].(*AggregateQueryResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Aggregate indicates an expected call of Aggregate -func (mr *MockTChanClusterMockRecorder) Aggregate(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Aggregate", reflect.TypeOf((*MockTChanCluster)(nil).Aggregate), ctx, req) -} - -// Fetch mocks base method -func (m *MockTChanCluster) Fetch(ctx thrift.Context, req *FetchRequest) (*FetchResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Fetch", ctx, req) - ret0, _ := ret[0].(*FetchResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Fetch indicates an expected call of Fetch -func (mr *MockTChanClusterMockRecorder) Fetch(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fetch", reflect.TypeOf((*MockTChanCluster)(nil).Fetch), ctx, req) -} - -// Health mocks base method -func (m *MockTChanCluster) Health(ctx thrift.Context) (*HealthResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Health", ctx) - ret0, _ := ret[0].(*HealthResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Health indicates an expected call of Health -func (mr *MockTChanClusterMockRecorder) Health(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Health", reflect.TypeOf((*MockTChanCluster)(nil).Health), ctx) -} - -// Query mocks base method -func (m *MockTChanCluster) Query(ctx thrift.Context, req *QueryRequest) (*QueryResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Query", ctx, req) - ret0, _ := ret[0].(*QueryResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Query indicates an expected call of Query -func (mr *MockTChanClusterMockRecorder) Query(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockTChanCluster)(nil).Query), ctx, req) -} - -// Truncate mocks base method -func (m *MockTChanCluster) Truncate(ctx thrift.Context, req *TruncateRequest) (*TruncateResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Truncate", ctx, req) - ret0, _ := ret[0].(*TruncateResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Truncate indicates an expected call of Truncate -func (mr *MockTChanClusterMockRecorder) Truncate(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Truncate", reflect.TypeOf((*MockTChanCluster)(nil).Truncate), ctx, req) -} - -// Write mocks base method -func (m *MockTChanCluster) Write(ctx thrift.Context, req *WriteRequest) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Write", ctx, req) - ret0, _ := ret[0].(error) - return ret0 -} - -// Write indicates an expected call of Write -func (mr *MockTChanClusterMockRecorder) Write(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockTChanCluster)(nil).Write), ctx, req) -} - -// WriteTagged mocks base method -func (m *MockTChanCluster) WriteTagged(ctx thrift.Context, req *WriteTaggedRequest) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WriteTagged", ctx, req) - ret0, _ := ret[0].(error) - return ret0 -} - -// WriteTagged indicates an expected call of WriteTagged -func (mr *MockTChanClusterMockRecorder) WriteTagged(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTagged", reflect.TypeOf((*MockTChanCluster)(nil).WriteTagged), ctx, req) -} - -// MockTChanNode is a mock of TChanNode interface -type MockTChanNode struct { - ctrl *gomock.Controller - recorder *MockTChanNodeMockRecorder -} - -// MockTChanNodeMockRecorder is the mock recorder for MockTChanNode -type MockTChanNodeMockRecorder struct { - mock *MockTChanNode -} - -// NewMockTChanNode creates a new mock instance -func NewMockTChanNode(ctrl *gomock.Controller) *MockTChanNode { - mock := &MockTChanNode{ctrl: ctrl} - mock.recorder = &MockTChanNodeMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use -func (m *MockTChanNode) EXPECT() *MockTChanNodeMockRecorder { - return m.recorder -} - -// Aggregate mocks base method -func (m *MockTChanNode) Aggregate(ctx thrift.Context, req *AggregateQueryRequest) (*AggregateQueryResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Aggregate", ctx, req) - ret0, _ := ret[0].(*AggregateQueryResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Aggregate indicates an expected call of Aggregate -func (mr *MockTChanNodeMockRecorder) Aggregate(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Aggregate", reflect.TypeOf((*MockTChanNode)(nil).Aggregate), ctx, req) -} - -// AggregateRaw mocks base method -func (m *MockTChanNode) AggregateRaw(ctx thrift.Context, req *AggregateQueryRawRequest) (*AggregateQueryRawResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AggregateRaw", ctx, req) - ret0, _ := ret[0].(*AggregateQueryRawResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// AggregateRaw indicates an expected call of AggregateRaw -func (mr *MockTChanNodeMockRecorder) AggregateRaw(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateRaw", reflect.TypeOf((*MockTChanNode)(nil).AggregateRaw), ctx, req) -} - -// Bootstrapped mocks base method -func (m *MockTChanNode) Bootstrapped(ctx thrift.Context) (*NodeBootstrappedResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Bootstrapped", ctx) - ret0, _ := ret[0].(*NodeBootstrappedResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Bootstrapped indicates an expected call of Bootstrapped -func (mr *MockTChanNodeMockRecorder) Bootstrapped(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Bootstrapped", reflect.TypeOf((*MockTChanNode)(nil).Bootstrapped), ctx) -} - -// BootstrappedInPlacementOrNoPlacement mocks base method -func (m *MockTChanNode) BootstrappedInPlacementOrNoPlacement(ctx thrift.Context) (*NodeBootstrappedInPlacementOrNoPlacementResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "BootstrappedInPlacementOrNoPlacement", ctx) - ret0, _ := ret[0].(*NodeBootstrappedInPlacementOrNoPlacementResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// BootstrappedInPlacementOrNoPlacement indicates an expected call of BootstrappedInPlacementOrNoPlacement -func (mr *MockTChanNodeMockRecorder) BootstrappedInPlacementOrNoPlacement(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BootstrappedInPlacementOrNoPlacement", reflect.TypeOf((*MockTChanNode)(nil).BootstrappedInPlacementOrNoPlacement), ctx) -} - -// DebugIndexMemorySegments mocks base method -func (m *MockTChanNode) DebugIndexMemorySegments(ctx thrift.Context, req *DebugIndexMemorySegmentsRequest) (*DebugIndexMemorySegmentsResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DebugIndexMemorySegments", ctx, req) - ret0, _ := ret[0].(*DebugIndexMemorySegmentsResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// DebugIndexMemorySegments indicates an expected call of DebugIndexMemorySegments -func (mr *MockTChanNodeMockRecorder) DebugIndexMemorySegments(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DebugIndexMemorySegments", reflect.TypeOf((*MockTChanNode)(nil).DebugIndexMemorySegments), ctx, req) -} - -// DebugProfileStart mocks base method -func (m *MockTChanNode) DebugProfileStart(ctx thrift.Context, req *DebugProfileStartRequest) (*DebugProfileStartResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DebugProfileStart", ctx, req) - ret0, _ := ret[0].(*DebugProfileStartResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// DebugProfileStart indicates an expected call of DebugProfileStart -func (mr *MockTChanNodeMockRecorder) DebugProfileStart(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DebugProfileStart", reflect.TypeOf((*MockTChanNode)(nil).DebugProfileStart), ctx, req) -} - -// DebugProfileStop mocks base method -func (m *MockTChanNode) DebugProfileStop(ctx thrift.Context, req *DebugProfileStopRequest) (*DebugProfileStopResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DebugProfileStop", ctx, req) - ret0, _ := ret[0].(*DebugProfileStopResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// DebugProfileStop indicates an expected call of DebugProfileStop -func (mr *MockTChanNodeMockRecorder) DebugProfileStop(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DebugProfileStop", reflect.TypeOf((*MockTChanNode)(nil).DebugProfileStop), ctx, req) -} - -// Fetch mocks base method -func (m *MockTChanNode) Fetch(ctx thrift.Context, req *FetchRequest) (*FetchResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Fetch", ctx, req) - ret0, _ := ret[0].(*FetchResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Fetch indicates an expected call of Fetch -func (mr *MockTChanNodeMockRecorder) Fetch(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fetch", reflect.TypeOf((*MockTChanNode)(nil).Fetch), ctx, req) -} - -// FetchBatchRaw mocks base method -func (m *MockTChanNode) FetchBatchRaw(ctx thrift.Context, req *FetchBatchRawRequest) (*FetchBatchRawResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchBatchRaw", ctx, req) - ret0, _ := ret[0].(*FetchBatchRawResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FetchBatchRaw indicates an expected call of FetchBatchRaw -func (mr *MockTChanNodeMockRecorder) FetchBatchRaw(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBatchRaw", reflect.TypeOf((*MockTChanNode)(nil).FetchBatchRaw), ctx, req) -} - -// FetchBatchRawV2 mocks base method -func (m *MockTChanNode) FetchBatchRawV2(ctx thrift.Context, req *FetchBatchRawV2Request) (*FetchBatchRawResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchBatchRawV2", ctx, req) - ret0, _ := ret[0].(*FetchBatchRawResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FetchBatchRawV2 indicates an expected call of FetchBatchRawV2 -func (mr *MockTChanNodeMockRecorder) FetchBatchRawV2(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBatchRawV2", reflect.TypeOf((*MockTChanNode)(nil).FetchBatchRawV2), ctx, req) -} - -// FetchBlocksMetadataRawV2 mocks base method -func (m *MockTChanNode) FetchBlocksMetadataRawV2(ctx thrift.Context, req *FetchBlocksMetadataRawV2Request) (*FetchBlocksMetadataRawV2Result_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchBlocksMetadataRawV2", ctx, req) - ret0, _ := ret[0].(*FetchBlocksMetadataRawV2Result_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FetchBlocksMetadataRawV2 indicates an expected call of FetchBlocksMetadataRawV2 -func (mr *MockTChanNodeMockRecorder) FetchBlocksMetadataRawV2(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocksMetadataRawV2", reflect.TypeOf((*MockTChanNode)(nil).FetchBlocksMetadataRawV2), ctx, req) -} - -// FetchBlocksRaw mocks base method -func (m *MockTChanNode) FetchBlocksRaw(ctx thrift.Context, req *FetchBlocksRawRequest) (*FetchBlocksRawResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchBlocksRaw", ctx, req) - ret0, _ := ret[0].(*FetchBlocksRawResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FetchBlocksRaw indicates an expected call of FetchBlocksRaw -func (mr *MockTChanNodeMockRecorder) FetchBlocksRaw(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocksRaw", reflect.TypeOf((*MockTChanNode)(nil).FetchBlocksRaw), ctx, req) -} - -// FetchTagged mocks base method -func (m *MockTChanNode) FetchTagged(ctx thrift.Context, req *FetchTaggedRequest) (*FetchTaggedResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchTagged", ctx, req) - ret0, _ := ret[0].(*FetchTaggedResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FetchTagged indicates an expected call of FetchTagged -func (mr *MockTChanNodeMockRecorder) FetchTagged(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchTagged", reflect.TypeOf((*MockTChanNode)(nil).FetchTagged), ctx, req) -} - -// GetPersistRateLimit mocks base method -func (m *MockTChanNode) GetPersistRateLimit(ctx thrift.Context) (*NodePersistRateLimitResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetPersistRateLimit", ctx) - ret0, _ := ret[0].(*NodePersistRateLimitResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetPersistRateLimit indicates an expected call of GetPersistRateLimit -func (mr *MockTChanNodeMockRecorder) GetPersistRateLimit(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPersistRateLimit", reflect.TypeOf((*MockTChanNode)(nil).GetPersistRateLimit), ctx) -} - -// GetWriteNewSeriesAsync mocks base method -func (m *MockTChanNode) GetWriteNewSeriesAsync(ctx thrift.Context) (*NodeWriteNewSeriesAsyncResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetWriteNewSeriesAsync", ctx) - ret0, _ := ret[0].(*NodeWriteNewSeriesAsyncResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetWriteNewSeriesAsync indicates an expected call of GetWriteNewSeriesAsync -func (mr *MockTChanNodeMockRecorder) GetWriteNewSeriesAsync(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWriteNewSeriesAsync", reflect.TypeOf((*MockTChanNode)(nil).GetWriteNewSeriesAsync), ctx) -} - -// GetWriteNewSeriesBackoffDuration mocks base method -func (m *MockTChanNode) GetWriteNewSeriesBackoffDuration(ctx thrift.Context) (*NodeWriteNewSeriesBackoffDurationResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetWriteNewSeriesBackoffDuration", ctx) - ret0, _ := ret[0].(*NodeWriteNewSeriesBackoffDurationResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetWriteNewSeriesBackoffDuration indicates an expected call of GetWriteNewSeriesBackoffDuration -func (mr *MockTChanNodeMockRecorder) GetWriteNewSeriesBackoffDuration(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWriteNewSeriesBackoffDuration", reflect.TypeOf((*MockTChanNode)(nil).GetWriteNewSeriesBackoffDuration), ctx) -} - -// GetWriteNewSeriesLimitPerShardPerSecond mocks base method -func (m *MockTChanNode) GetWriteNewSeriesLimitPerShardPerSecond(ctx thrift.Context) (*NodeWriteNewSeriesLimitPerShardPerSecondResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetWriteNewSeriesLimitPerShardPerSecond", ctx) - ret0, _ := ret[0].(*NodeWriteNewSeriesLimitPerShardPerSecondResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetWriteNewSeriesLimitPerShardPerSecond indicates an expected call of GetWriteNewSeriesLimitPerShardPerSecond -func (mr *MockTChanNodeMockRecorder) GetWriteNewSeriesLimitPerShardPerSecond(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWriteNewSeriesLimitPerShardPerSecond", reflect.TypeOf((*MockTChanNode)(nil).GetWriteNewSeriesLimitPerShardPerSecond), ctx) -} - -// Health mocks base method -func (m *MockTChanNode) Health(ctx thrift.Context) (*NodeHealthResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Health", ctx) - ret0, _ := ret[0].(*NodeHealthResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Health indicates an expected call of Health -func (mr *MockTChanNodeMockRecorder) Health(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Health", reflect.TypeOf((*MockTChanNode)(nil).Health), ctx) -} - -// Query mocks base method -func (m *MockTChanNode) Query(ctx thrift.Context, req *QueryRequest) (*QueryResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Query", ctx, req) - ret0, _ := ret[0].(*QueryResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Query indicates an expected call of Query -func (mr *MockTChanNodeMockRecorder) Query(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockTChanNode)(nil).Query), ctx, req) -} - -// Repair mocks base method -func (m *MockTChanNode) Repair(ctx thrift.Context) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Repair", ctx) - ret0, _ := ret[0].(error) - return ret0 -} - -// Repair indicates an expected call of Repair -func (mr *MockTChanNodeMockRecorder) Repair(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Repair", reflect.TypeOf((*MockTChanNode)(nil).Repair), ctx) -} - -// SetPersistRateLimit mocks base method -func (m *MockTChanNode) SetPersistRateLimit(ctx thrift.Context, req *NodeSetPersistRateLimitRequest) (*NodePersistRateLimitResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SetPersistRateLimit", ctx, req) - ret0, _ := ret[0].(*NodePersistRateLimitResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// SetPersistRateLimit indicates an expected call of SetPersistRateLimit -func (mr *MockTChanNodeMockRecorder) SetPersistRateLimit(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetPersistRateLimit", reflect.TypeOf((*MockTChanNode)(nil).SetPersistRateLimit), ctx, req) -} - -// SetWriteNewSeriesAsync mocks base method -func (m *MockTChanNode) SetWriteNewSeriesAsync(ctx thrift.Context, req *NodeSetWriteNewSeriesAsyncRequest) (*NodeWriteNewSeriesAsyncResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SetWriteNewSeriesAsync", ctx, req) - ret0, _ := ret[0].(*NodeWriteNewSeriesAsyncResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// SetWriteNewSeriesAsync indicates an expected call of SetWriteNewSeriesAsync -func (mr *MockTChanNodeMockRecorder) SetWriteNewSeriesAsync(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteNewSeriesAsync", reflect.TypeOf((*MockTChanNode)(nil).SetWriteNewSeriesAsync), ctx, req) -} - -// SetWriteNewSeriesBackoffDuration mocks base method -func (m *MockTChanNode) SetWriteNewSeriesBackoffDuration(ctx thrift.Context, req *NodeSetWriteNewSeriesBackoffDurationRequest) (*NodeWriteNewSeriesBackoffDurationResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SetWriteNewSeriesBackoffDuration", ctx, req) - ret0, _ := ret[0].(*NodeWriteNewSeriesBackoffDurationResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// SetWriteNewSeriesBackoffDuration indicates an expected call of SetWriteNewSeriesBackoffDuration -func (mr *MockTChanNodeMockRecorder) SetWriteNewSeriesBackoffDuration(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteNewSeriesBackoffDuration", reflect.TypeOf((*MockTChanNode)(nil).SetWriteNewSeriesBackoffDuration), ctx, req) -} - -// SetWriteNewSeriesLimitPerShardPerSecond mocks base method -func (m *MockTChanNode) SetWriteNewSeriesLimitPerShardPerSecond(ctx thrift.Context, req *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest) (*NodeWriteNewSeriesLimitPerShardPerSecondResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SetWriteNewSeriesLimitPerShardPerSecond", ctx, req) - ret0, _ := ret[0].(*NodeWriteNewSeriesLimitPerShardPerSecondResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// SetWriteNewSeriesLimitPerShardPerSecond indicates an expected call of SetWriteNewSeriesLimitPerShardPerSecond -func (mr *MockTChanNodeMockRecorder) SetWriteNewSeriesLimitPerShardPerSecond(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteNewSeriesLimitPerShardPerSecond", reflect.TypeOf((*MockTChanNode)(nil).SetWriteNewSeriesLimitPerShardPerSecond), ctx, req) -} - -// Truncate mocks base method -func (m *MockTChanNode) Truncate(ctx thrift.Context, req *TruncateRequest) (*TruncateResult_, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Truncate", ctx, req) - ret0, _ := ret[0].(*TruncateResult_) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Truncate indicates an expected call of Truncate -func (mr *MockTChanNodeMockRecorder) Truncate(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Truncate", reflect.TypeOf((*MockTChanNode)(nil).Truncate), ctx, req) -} - -// Write mocks base method -func (m *MockTChanNode) Write(ctx thrift.Context, req *WriteRequest) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Write", ctx, req) - ret0, _ := ret[0].(error) - return ret0 -} - -// Write indicates an expected call of Write -func (mr *MockTChanNodeMockRecorder) Write(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockTChanNode)(nil).Write), ctx, req) -} - -// WriteBatchRaw mocks base method -func (m *MockTChanNode) WriteBatchRaw(ctx thrift.Context, req *WriteBatchRawRequest) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WriteBatchRaw", ctx, req) - ret0, _ := ret[0].(error) - return ret0 -} - -// WriteBatchRaw indicates an expected call of WriteBatchRaw -func (mr *MockTChanNodeMockRecorder) WriteBatchRaw(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteBatchRaw", reflect.TypeOf((*MockTChanNode)(nil).WriteBatchRaw), ctx, req) -} - -// WriteBatchRawV2 mocks base method -func (m *MockTChanNode) WriteBatchRawV2(ctx thrift.Context, req *WriteBatchRawV2Request) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WriteBatchRawV2", ctx, req) - ret0, _ := ret[0].(error) - return ret0 -} - -// WriteBatchRawV2 indicates an expected call of WriteBatchRawV2 -func (mr *MockTChanNodeMockRecorder) WriteBatchRawV2(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteBatchRawV2", reflect.TypeOf((*MockTChanNode)(nil).WriteBatchRawV2), ctx, req) -} - -// WriteTagged mocks base method -func (m *MockTChanNode) WriteTagged(ctx thrift.Context, req *WriteTaggedRequest) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WriteTagged", ctx, req) - ret0, _ := ret[0].(error) - return ret0 -} - -// WriteTagged indicates an expected call of WriteTagged -func (mr *MockTChanNodeMockRecorder) WriteTagged(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTagged", reflect.TypeOf((*MockTChanNode)(nil).WriteTagged), ctx, req) -} - -// WriteTaggedBatchRaw mocks base method -func (m *MockTChanNode) WriteTaggedBatchRaw(ctx thrift.Context, req *WriteTaggedBatchRawRequest) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WriteTaggedBatchRaw", ctx, req) - ret0, _ := ret[0].(error) - return ret0 -} - -// WriteTaggedBatchRaw indicates an expected call of WriteTaggedBatchRaw -func (mr *MockTChanNodeMockRecorder) WriteTaggedBatchRaw(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTaggedBatchRaw", reflect.TypeOf((*MockTChanNode)(nil).WriteTaggedBatchRaw), ctx, req) -} - -// WriteTaggedBatchRawV2 mocks base method -func (m *MockTChanNode) WriteTaggedBatchRawV2(ctx thrift.Context, req *WriteTaggedBatchRawV2Request) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WriteTaggedBatchRawV2", ctx, req) - ret0, _ := ret[0].(error) - return ret0 -} - -// WriteTaggedBatchRawV2 indicates an expected call of WriteTaggedBatchRawV2 -func (mr *MockTChanNodeMockRecorder) WriteTaggedBatchRawV2(ctx, req interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTaggedBatchRawV2", reflect.TypeOf((*MockTChanNode)(nil).WriteTaggedBatchRawV2), ctx, req) -} diff --git a/src/dbnode/generated/thrift/rpc/tchan-rpc.go b/src/dbnode/generated/thrift/rpc/tchan-rpc.go index 3d32c85d9e..cf6c94667a 100644 --- a/src/dbnode/generated/thrift/rpc/tchan-rpc.go +++ b/src/dbnode/generated/thrift/rpc/tchan-rpc.go @@ -47,6 +47,7 @@ type TChanCluster interface { type TChanNode interface { Aggregate(ctx thrift.Context, req *AggregateQueryRequest) (*AggregateQueryResult_, error) AggregateRaw(ctx thrift.Context, req *AggregateQueryRawRequest) (*AggregateQueryRawResult_, error) + AggregateTiles(ctx thrift.Context, req *AggregateTilesRequest) (*AggregateTilesResult_, error) Bootstrapped(ctx thrift.Context) (*NodeBootstrappedResult_, error) BootstrappedInPlacementOrNoPlacement(ctx thrift.Context) (*NodeBootstrappedInPlacementOrNoPlacementResult_, error) DebugIndexMemorySegments(ctx thrift.Context, req *DebugIndexMemorySegmentsRequest) (*DebugIndexMemorySegmentsResult_, error) @@ -518,6 +519,24 @@ func (c *tchanNodeClient) AggregateRaw(ctx thrift.Context, req *AggregateQueryRa return resp.GetSuccess(), err } +func (c *tchanNodeClient) AggregateTiles(ctx thrift.Context, req *AggregateTilesRequest) (*AggregateTilesResult_, error) { + var resp NodeAggregateTilesResult + args := NodeAggregateTilesArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "aggregateTiles", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for aggregateTiles") + } + } + + return resp.GetSuccess(), err +} + func (c *tchanNodeClient) Bootstrapped(ctx thrift.Context) (*NodeBootstrappedResult_, error) { var resp NodeBootstrappedResult args := NodeBootstrappedArgs{} @@ -1044,6 +1063,7 @@ func (s *tchanNodeServer) Methods() []string { return []string{ "aggregate", "aggregateRaw", + "aggregateTiles", "bootstrapped", "bootstrappedInPlacementOrNoPlacement", "debugIndexMemorySegments", @@ -1082,6 +1102,8 @@ func (s *tchanNodeServer) Handle(ctx thrift.Context, methodName string, protocol return s.handleAggregate(ctx, protocol) case "aggregateRaw": return s.handleAggregateRaw(ctx, protocol) + case "aggregateTiles": + return s.handleAggregateTiles(ctx, protocol) case "bootstrapped": return s.handleBootstrapped(ctx, protocol) case "bootstrappedInPlacementOrNoPlacement": @@ -1202,6 +1224,34 @@ func (s *tchanNodeServer) handleAggregateRaw(ctx thrift.Context, protocol athrif return err == nil, &res, nil } +func (s *tchanNodeServer) handleAggregateTiles(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeAggregateTilesArgs + var res NodeAggregateTilesResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.AggregateTiles(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + func (s *tchanNodeServer) handleBootstrapped(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { var req NodeBootstrappedArgs var res NodeBootstrappedResult diff --git a/src/dbnode/network/server/tchannelthrift/node/service.go b/src/dbnode/network/server/tchannelthrift/node/service.go index 652b47c409..bb7a3547f7 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service.go +++ b/src/dbnode/network/server/tchannelthrift/node/service.go @@ -538,6 +538,32 @@ func (s *service) query(ctx context.Context, db storage.Database, req *rpc.Query return result, nil } +func (s *service) AggregateTiles(tctx thrift.Context, req *rpc.AggregateTilesRequest) (*rpc.AggregateTilesResult_, error) { + _, err := s.startReadRPCWithDB() + if err != nil { + return nil, err + } + defer s.readRPCCompleted() + + _, sp, sampled := tchannelthrift.Context(tctx).StartSampledTraceSpan(tracepoint.AggregateTiles) + if sampled { + sp.LogFields( + opentracinglog.String("namespace", req.NameSpace), + opentracinglog.Int32("shard", req.Shard), + xopentracing.Time("start", time.Unix(0, req.RangeStart)), + xopentracing.Time("end", time.Unix(0, req.RangeEnd)), + ) + } + + result, err := &rpc.AggregateTilesResult_{}, nil // TODO + if sampled && err != nil { + sp.LogFields(opentracinglog.Error(err)) + } + sp.Finish() + + return result, err +} + func (s *service) Fetch(tctx thrift.Context, req *rpc.FetchRequest) (*rpc.FetchResult_, error) { db, err := s.startReadRPCWithDB() if err != nil { diff --git a/src/dbnode/tracepoint/tracepoint.go b/src/dbnode/tracepoint/tracepoint.go index 97d2410eda..eed4a99796 100644 --- a/src/dbnode/tracepoint/tracepoint.go +++ b/src/dbnode/tracepoint/tracepoint.go @@ -46,6 +46,9 @@ const ( // FetchReadSegment is the operation name for the tchannelthrift FetchReadSegment path. FetchReadSegment = "tchannelthrift/node.service.FetchReadSegment" + // AggregateTiles is the operation name for the tchannelthrift AggregateTiles path. + AggregateTiles = "tchannelthrift/node.service.AggregateTiles" + // DBQueryIDs is the operation name for the db QueryIDs path. DBQueryIDs = "storage.db.QueryIDs" From be16984b1237021e809d5ff489a5a1c0b92f166a Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Fri, 10 Jul 2020 13:11:06 +0300 Subject: [PATCH 02/32] Add AggregateTilesRequest.rangeType --- src/dbnode/generated/thrift/rpc.thrift | 1 + src/dbnode/generated/thrift/rpc/rpc.go | 66 ++++++++++++++++++++++---- 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/src/dbnode/generated/thrift/rpc.thrift b/src/dbnode/generated/thrift/rpc.thrift index 082c5f470f..937aa465ba 100644 --- a/src/dbnode/generated/thrift/rpc.thrift +++ b/src/dbnode/generated/thrift/rpc.thrift @@ -501,6 +501,7 @@ struct AggregateTilesRequest { 5: required string step 6: required string formula 7: bool removeResets + 8: optional TimeType rangeType = TimeType.UNIX_SECONDS } struct AggregateTilesResult { diff --git a/src/dbnode/generated/thrift/rpc/rpc.go b/src/dbnode/generated/thrift/rpc/rpc.go index da3a9e2c7a..4587d09e97 100644 --- a/src/dbnode/generated/thrift/rpc/rpc.go +++ b/src/dbnode/generated/thrift/rpc/rpc.go @@ -12914,18 +12914,22 @@ func (p *Query) String() string { // - Step // - Formula // - RemoveResets +// - RangeType type AggregateTilesRequest struct { - NameSpace string `thrift:"nameSpace,1,required" db:"nameSpace" json:"nameSpace"` - Shard int32 `thrift:"shard,2,required" db:"shard" json:"shard"` - RangeStart int64 `thrift:"rangeStart,3,required" db:"rangeStart" json:"rangeStart"` - RangeEnd int64 `thrift:"rangeEnd,4,required" db:"rangeEnd" json:"rangeEnd"` - Step string `thrift:"step,5,required" db:"step" json:"step"` - Formula string `thrift:"formula,6,required" db:"formula" json:"formula"` - RemoveResets bool `thrift:"removeResets,7" db:"removeResets" json:"removeResets"` + NameSpace string `thrift:"nameSpace,1,required" db:"nameSpace" json:"nameSpace"` + Shard int32 `thrift:"shard,2,required" db:"shard" json:"shard"` + RangeStart int64 `thrift:"rangeStart,3,required" db:"rangeStart" json:"rangeStart"` + RangeEnd int64 `thrift:"rangeEnd,4,required" db:"rangeEnd" json:"rangeEnd"` + Step string `thrift:"step,5,required" db:"step" json:"step"` + Formula string `thrift:"formula,6,required" db:"formula" json:"formula"` + RemoveResets bool `thrift:"removeResets,7" db:"removeResets" json:"removeResets"` + RangeType TimeType `thrift:"rangeType,8" db:"rangeType" json:"rangeType,omitempty"` } func NewAggregateTilesRequest() *AggregateTilesRequest { - return &AggregateTilesRequest{} + return &AggregateTilesRequest{ + RangeType: 0, + } } func (p *AggregateTilesRequest) GetNameSpace() string { @@ -12955,6 +12959,16 @@ func (p *AggregateTilesRequest) GetFormula() string { func (p *AggregateTilesRequest) GetRemoveResets() bool { return p.RemoveResets } + +var AggregateTilesRequest_RangeType_DEFAULT TimeType = 0 + +func (p *AggregateTilesRequest) GetRangeType() TimeType { + return p.RangeType +} +func (p *AggregateTilesRequest) IsSetRangeType() bool { + return p.RangeType != AggregateTilesRequest_RangeType_DEFAULT +} + func (p *AggregateTilesRequest) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) @@ -13010,6 +13024,10 @@ func (p *AggregateTilesRequest) Read(iprot thrift.TProtocol) error { if err := p.ReadField7(iprot); err != nil { return err } + case 8: + if err := p.ReadField8(iprot); err != nil { + return err + } default: if err := iprot.Skip(fieldTypeId); err != nil { return err @@ -13106,6 +13124,16 @@ func (p *AggregateTilesRequest) ReadField7(iprot thrift.TProtocol) error { return nil } +func (p *AggregateTilesRequest) ReadField8(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 8: ", err) + } else { + temp := TimeType(v) + p.RangeType = temp + } + return nil +} + func (p *AggregateTilesRequest) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("AggregateTilesRequest"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) @@ -13132,6 +13160,9 @@ func (p *AggregateTilesRequest) Write(oprot thrift.TProtocol) error { if err := p.writeField7(oprot); err != nil { return err } + if err := p.writeField8(oprot); err != nil { + return err + } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) @@ -13233,6 +13264,21 @@ func (p *AggregateTilesRequest) writeField7(oprot thrift.TProtocol) (err error) return err } +func (p *AggregateTilesRequest) writeField8(oprot thrift.TProtocol) (err error) { + if p.IsSetRangeType() { + if err := oprot.WriteFieldBegin("rangeType", thrift.I32, 8); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:rangeType: ", p), err) + } + if err := oprot.WriteI32(int32(p.RangeType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeType (8) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 8:rangeType: ", p), err) + } + } + return err +} + func (p *AggregateTilesRequest) String() string { if p == nil { return "" @@ -22461,7 +22507,9 @@ func (p *NodeAggregateTilesArgs) Read(iprot thrift.TProtocol) error { } func (p *NodeAggregateTilesArgs) ReadField1(iprot thrift.TProtocol) error { - p.Req = &AggregateTilesRequest{} + p.Req = &AggregateTilesRequest{ + RangeType: 0, + } if err := p.Req.Read(iprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) } From 5a4a6e74f8b301882764c9cb93363365eba70640 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Fri, 10 Jul 2020 14:13:39 +0300 Subject: [PATCH 03/32] sourceNameSpace / targetNameSpace --- src/dbnode/generated/thrift/rpc.thrift | 17 +- src/dbnode/generated/thrift/rpc/rpc.go | 182 +++++++++++------- .../server/tchannelthrift/node/service.go | 3 +- 3 files changed, 122 insertions(+), 80 deletions(-) diff --git a/src/dbnode/generated/thrift/rpc.thrift b/src/dbnode/generated/thrift/rpc.thrift index 937aa465ba..8371d9798b 100644 --- a/src/dbnode/generated/thrift/rpc.thrift +++ b/src/dbnode/generated/thrift/rpc.thrift @@ -494,14 +494,15 @@ struct Query { } struct AggregateTilesRequest { - 1: required string nameSpace - 2: required i32 shard - 3: required i64 rangeStart - 4: required i64 rangeEnd - 5: required string step - 6: required string formula - 7: bool removeResets - 8: optional TimeType rangeType = TimeType.UNIX_SECONDS + 1: required string sourceNameSpace + 2: required string targetNameSpace + 3: required i32 shard + 4: required i64 rangeStart + 5: required i64 rangeEnd + 6: required string step + 7: required string formula + 8: bool removeResets + 9: optional TimeType rangeType = TimeType.UNIX_SECONDS } struct AggregateTilesResult { diff --git a/src/dbnode/generated/thrift/rpc/rpc.go b/src/dbnode/generated/thrift/rpc/rpc.go index 4587d09e97..bb8de3d9fd 100644 --- a/src/dbnode/generated/thrift/rpc/rpc.go +++ b/src/dbnode/generated/thrift/rpc/rpc.go @@ -12907,7 +12907,8 @@ func (p *Query) String() string { } // Attributes: -// - NameSpace +// - SourceNameSpace +// - TargetNameSpace // - Shard // - RangeStart // - RangeEnd @@ -12916,14 +12917,15 @@ func (p *Query) String() string { // - RemoveResets // - RangeType type AggregateTilesRequest struct { - NameSpace string `thrift:"nameSpace,1,required" db:"nameSpace" json:"nameSpace"` - Shard int32 `thrift:"shard,2,required" db:"shard" json:"shard"` - RangeStart int64 `thrift:"rangeStart,3,required" db:"rangeStart" json:"rangeStart"` - RangeEnd int64 `thrift:"rangeEnd,4,required" db:"rangeEnd" json:"rangeEnd"` - Step string `thrift:"step,5,required" db:"step" json:"step"` - Formula string `thrift:"formula,6,required" db:"formula" json:"formula"` - RemoveResets bool `thrift:"removeResets,7" db:"removeResets" json:"removeResets"` - RangeType TimeType `thrift:"rangeType,8" db:"rangeType" json:"rangeType,omitempty"` + SourceNameSpace string `thrift:"sourceNameSpace,1,required" db:"sourceNameSpace" json:"sourceNameSpace"` + TargetNameSpace string `thrift:"targetNameSpace,2,required" db:"targetNameSpace" json:"targetNameSpace"` + Shard int32 `thrift:"shard,3,required" db:"shard" json:"shard"` + RangeStart int64 `thrift:"rangeStart,4,required" db:"rangeStart" json:"rangeStart"` + RangeEnd int64 `thrift:"rangeEnd,5,required" db:"rangeEnd" json:"rangeEnd"` + Step string `thrift:"step,6,required" db:"step" json:"step"` + Formula string `thrift:"formula,7,required" db:"formula" json:"formula"` + RemoveResets bool `thrift:"removeResets,8" db:"removeResets" json:"removeResets"` + RangeType TimeType `thrift:"rangeType,9" db:"rangeType" json:"rangeType,omitempty"` } func NewAggregateTilesRequest() *AggregateTilesRequest { @@ -12932,8 +12934,12 @@ func NewAggregateTilesRequest() *AggregateTilesRequest { } } -func (p *AggregateTilesRequest) GetNameSpace() string { - return p.NameSpace +func (p *AggregateTilesRequest) GetSourceNameSpace() string { + return p.SourceNameSpace +} + +func (p *AggregateTilesRequest) GetTargetNameSpace() string { + return p.TargetNameSpace } func (p *AggregateTilesRequest) GetShard() int32 { @@ -12974,7 +12980,8 @@ func (p *AggregateTilesRequest) Read(iprot thrift.TProtocol) error { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } - var issetNameSpace bool = false + var issetSourceNameSpace bool = false + var issetTargetNameSpace bool = false var issetShard bool = false var issetRangeStart bool = false var issetRangeEnd bool = false @@ -12994,40 +13001,45 @@ func (p *AggregateTilesRequest) Read(iprot thrift.TProtocol) error { if err := p.ReadField1(iprot); err != nil { return err } - issetNameSpace = true + issetSourceNameSpace = true case 2: if err := p.ReadField2(iprot); err != nil { return err } - issetShard = true + issetTargetNameSpace = true case 3: if err := p.ReadField3(iprot); err != nil { return err } - issetRangeStart = true + issetShard = true case 4: if err := p.ReadField4(iprot); err != nil { return err } - issetRangeEnd = true + issetRangeStart = true case 5: if err := p.ReadField5(iprot); err != nil { return err } - issetStep = true + issetRangeEnd = true case 6: if err := p.ReadField6(iprot); err != nil { return err } - issetFormula = true + issetStep = true case 7: if err := p.ReadField7(iprot); err != nil { return err } + issetFormula = true case 8: if err := p.ReadField8(iprot); err != nil { return err } + case 9: + if err := p.ReadField9(iprot); err != nil { + return err + } default: if err := iprot.Skip(fieldTypeId); err != nil { return err @@ -13040,8 +13052,11 @@ func (p *AggregateTilesRequest) Read(iprot thrift.TProtocol) error { if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } - if !issetNameSpace { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + if !issetSourceNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SourceNameSpace is not set")) + } + if !issetTargetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TargetNameSpace is not set")) } if !issetShard { return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Shard is not set")) @@ -13065,25 +13080,25 @@ func (p *AggregateTilesRequest) ReadField1(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 1: ", err) } else { - p.NameSpace = v + p.SourceNameSpace = v } return nil } func (p *AggregateTilesRequest) ReadField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { + if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 2: ", err) } else { - p.Shard = v + p.TargetNameSpace = v } return nil } func (p *AggregateTilesRequest) ReadField3(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { + if v, err := iprot.ReadI32(); err != nil { return thrift.PrependError("error reading field 3: ", err) } else { - p.RangeStart = v + p.Shard = v } return nil } @@ -13092,16 +13107,16 @@ func (p *AggregateTilesRequest) ReadField4(iprot thrift.TProtocol) error { if v, err := iprot.ReadI64(); err != nil { return thrift.PrependError("error reading field 4: ", err) } else { - p.RangeEnd = v + p.RangeStart = v } return nil } func (p *AggregateTilesRequest) ReadField5(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { + if v, err := iprot.ReadI64(); err != nil { return thrift.PrependError("error reading field 5: ", err) } else { - p.Step = v + p.RangeEnd = v } return nil } @@ -13110,23 +13125,32 @@ func (p *AggregateTilesRequest) ReadField6(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 6: ", err) } else { - p.Formula = v + p.Step = v } return nil } func (p *AggregateTilesRequest) ReadField7(iprot thrift.TProtocol) error { - if v, err := iprot.ReadBool(); err != nil { + if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 7: ", err) } else { - p.RemoveResets = v + p.Formula = v } return nil } func (p *AggregateTilesRequest) ReadField8(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { + if v, err := iprot.ReadBool(); err != nil { return thrift.PrependError("error reading field 8: ", err) + } else { + p.RemoveResets = v + } + return nil +} + +func (p *AggregateTilesRequest) ReadField9(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 9: ", err) } else { temp := TimeType(v) p.RangeType = temp @@ -13163,6 +13187,9 @@ func (p *AggregateTilesRequest) Write(oprot thrift.TProtocol) error { if err := p.writeField8(oprot); err != nil { return err } + if err := p.writeField9(oprot); err != nil { + return err + } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) @@ -13174,106 +13201,119 @@ func (p *AggregateTilesRequest) Write(oprot thrift.TProtocol) error { } func (p *AggregateTilesRequest) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:nameSpace: ", p), err) + if err := oprot.WriteFieldBegin("sourceNameSpace", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sourceNameSpace: ", p), err) } - if err := oprot.WriteString(string(p.NameSpace)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.nameSpace (1) field write error: ", p), err) + if err := oprot.WriteString(string(p.SourceNameSpace)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.sourceNameSpace (1) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:nameSpace: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sourceNameSpace: ", p), err) } return err } func (p *AggregateTilesRequest) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("shard", thrift.I32, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:shard: ", p), err) + if err := oprot.WriteFieldBegin("targetNameSpace", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:targetNameSpace: ", p), err) } - if err := oprot.WriteI32(int32(p.Shard)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.shard (2) field write error: ", p), err) + if err := oprot.WriteString(string(p.TargetNameSpace)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.targetNameSpace (2) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:shard: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:targetNameSpace: ", p), err) } return err } func (p *AggregateTilesRequest) writeField3(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("rangeStart", thrift.I64, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:rangeStart: ", p), err) + if err := oprot.WriteFieldBegin("shard", thrift.I32, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:shard: ", p), err) } - if err := oprot.WriteI64(int64(p.RangeStart)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.rangeStart (3) field write error: ", p), err) + if err := oprot.WriteI32(int32(p.Shard)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.shard (3) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:rangeStart: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:shard: ", p), err) } return err } func (p *AggregateTilesRequest) writeField4(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("rangeEnd", thrift.I64, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:rangeEnd: ", p), err) + if err := oprot.WriteFieldBegin("rangeStart", thrift.I64, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:rangeStart: ", p), err) } - if err := oprot.WriteI64(int64(p.RangeEnd)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.rangeEnd (4) field write error: ", p), err) + if err := oprot.WriteI64(int64(p.RangeStart)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeStart (4) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:rangeEnd: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:rangeStart: ", p), err) } return err } func (p *AggregateTilesRequest) writeField5(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("step", thrift.STRING, 5); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:step: ", p), err) + if err := oprot.WriteFieldBegin("rangeEnd", thrift.I64, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:rangeEnd: ", p), err) } - if err := oprot.WriteString(string(p.Step)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.step (5) field write error: ", p), err) + if err := oprot.WriteI64(int64(p.RangeEnd)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeEnd (5) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 5:step: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:rangeEnd: ", p), err) } return err } func (p *AggregateTilesRequest) writeField6(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("formula", thrift.STRING, 6); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:formula: ", p), err) + if err := oprot.WriteFieldBegin("step", thrift.STRING, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:step: ", p), err) } - if err := oprot.WriteString(string(p.Formula)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.formula (6) field write error: ", p), err) + if err := oprot.WriteString(string(p.Step)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.step (6) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 6:formula: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:step: ", p), err) } return err } func (p *AggregateTilesRequest) writeField7(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("removeResets", thrift.BOOL, 7); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:removeResets: ", p), err) + if err := oprot.WriteFieldBegin("formula", thrift.STRING, 7); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:formula: ", p), err) } - if err := oprot.WriteBool(bool(p.RemoveResets)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.removeResets (7) field write error: ", p), err) + if err := oprot.WriteString(string(p.Formula)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.formula (7) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 7:removeResets: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 7:formula: ", p), err) } return err } func (p *AggregateTilesRequest) writeField8(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("removeResets", thrift.BOOL, 8); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:removeResets: ", p), err) + } + if err := oprot.WriteBool(bool(p.RemoveResets)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.removeResets (8) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 8:removeResets: ", p), err) + } + return err +} + +func (p *AggregateTilesRequest) writeField9(oprot thrift.TProtocol) (err error) { if p.IsSetRangeType() { - if err := oprot.WriteFieldBegin("rangeType", thrift.I32, 8); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:rangeType: ", p), err) + if err := oprot.WriteFieldBegin("rangeType", thrift.I32, 9); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:rangeType: ", p), err) } if err := oprot.WriteI32(int32(p.RangeType)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.rangeType (8) field write error: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T.rangeType (9) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 8:rangeType: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 9:rangeType: ", p), err) } } return err diff --git a/src/dbnode/network/server/tchannelthrift/node/service.go b/src/dbnode/network/server/tchannelthrift/node/service.go index bb7a3547f7..8c8014ee02 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service.go +++ b/src/dbnode/network/server/tchannelthrift/node/service.go @@ -548,7 +548,8 @@ func (s *service) AggregateTiles(tctx thrift.Context, req *rpc.AggregateTilesReq _, sp, sampled := tchannelthrift.Context(tctx).StartSampledTraceSpan(tracepoint.AggregateTiles) if sampled { sp.LogFields( - opentracinglog.String("namespace", req.NameSpace), + opentracinglog.String("sourceNameSpace", req.SourceNameSpace), + opentracinglog.String("targetNameSpace", req.TargetNameSpace), opentracinglog.Int32("shard", req.Shard), xopentracing.Time("start", time.Unix(0, req.RangeStart)), xopentracing.Time("end", time.Unix(0, req.RangeEnd)), From 663c20107750ab6bedd9c6d457c0854f0f571f69 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Fri, 10 Jul 2020 15:34:45 +0300 Subject: [PATCH 04/32] Drop AggregateTilesRequest.shardId --- src/dbnode/generated/thrift/rpc.thrift | 13 +- src/dbnode/generated/thrift/rpc/rpc.go | 136 +++++++----------- .../server/tchannelthrift/node/service.go | 1 - 3 files changed, 54 insertions(+), 96 deletions(-) diff --git a/src/dbnode/generated/thrift/rpc.thrift b/src/dbnode/generated/thrift/rpc.thrift index 8371d9798b..16a93f0471 100644 --- a/src/dbnode/generated/thrift/rpc.thrift +++ b/src/dbnode/generated/thrift/rpc.thrift @@ -496,13 +496,12 @@ struct Query { struct AggregateTilesRequest { 1: required string sourceNameSpace 2: required string targetNameSpace - 3: required i32 shard - 4: required i64 rangeStart - 5: required i64 rangeEnd - 6: required string step - 7: required string formula - 8: bool removeResets - 9: optional TimeType rangeType = TimeType.UNIX_SECONDS + 3: required i64 rangeStart + 4: required i64 rangeEnd + 5: required string step + 6: required string formula + 7: bool removeResets + 8: optional TimeType rangeType = TimeType.UNIX_SECONDS } struct AggregateTilesResult { diff --git a/src/dbnode/generated/thrift/rpc/rpc.go b/src/dbnode/generated/thrift/rpc/rpc.go index bb8de3d9fd..7a9bad0432 100644 --- a/src/dbnode/generated/thrift/rpc/rpc.go +++ b/src/dbnode/generated/thrift/rpc/rpc.go @@ -12909,7 +12909,6 @@ func (p *Query) String() string { // Attributes: // - SourceNameSpace // - TargetNameSpace -// - Shard // - RangeStart // - RangeEnd // - Step @@ -12919,13 +12918,12 @@ func (p *Query) String() string { type AggregateTilesRequest struct { SourceNameSpace string `thrift:"sourceNameSpace,1,required" db:"sourceNameSpace" json:"sourceNameSpace"` TargetNameSpace string `thrift:"targetNameSpace,2,required" db:"targetNameSpace" json:"targetNameSpace"` - Shard int32 `thrift:"shard,3,required" db:"shard" json:"shard"` - RangeStart int64 `thrift:"rangeStart,4,required" db:"rangeStart" json:"rangeStart"` - RangeEnd int64 `thrift:"rangeEnd,5,required" db:"rangeEnd" json:"rangeEnd"` - Step string `thrift:"step,6,required" db:"step" json:"step"` - Formula string `thrift:"formula,7,required" db:"formula" json:"formula"` - RemoveResets bool `thrift:"removeResets,8" db:"removeResets" json:"removeResets"` - RangeType TimeType `thrift:"rangeType,9" db:"rangeType" json:"rangeType,omitempty"` + RangeStart int64 `thrift:"rangeStart,3,required" db:"rangeStart" json:"rangeStart"` + RangeEnd int64 `thrift:"rangeEnd,4,required" db:"rangeEnd" json:"rangeEnd"` + Step string `thrift:"step,5,required" db:"step" json:"step"` + Formula string `thrift:"formula,6,required" db:"formula" json:"formula"` + RemoveResets bool `thrift:"removeResets,7" db:"removeResets" json:"removeResets"` + RangeType TimeType `thrift:"rangeType,8" db:"rangeType" json:"rangeType,omitempty"` } func NewAggregateTilesRequest() *AggregateTilesRequest { @@ -12942,10 +12940,6 @@ func (p *AggregateTilesRequest) GetTargetNameSpace() string { return p.TargetNameSpace } -func (p *AggregateTilesRequest) GetShard() int32 { - return p.Shard -} - func (p *AggregateTilesRequest) GetRangeStart() int64 { return p.RangeStart } @@ -12982,7 +12976,6 @@ func (p *AggregateTilesRequest) Read(iprot thrift.TProtocol) error { var issetSourceNameSpace bool = false var issetTargetNameSpace bool = false - var issetShard bool = false var issetRangeStart bool = false var issetRangeEnd bool = false var issetStep bool = false @@ -13011,35 +13004,30 @@ func (p *AggregateTilesRequest) Read(iprot thrift.TProtocol) error { if err := p.ReadField3(iprot); err != nil { return err } - issetShard = true + issetRangeStart = true case 4: if err := p.ReadField4(iprot); err != nil { return err } - issetRangeStart = true + issetRangeEnd = true case 5: if err := p.ReadField5(iprot); err != nil { return err } - issetRangeEnd = true + issetStep = true case 6: if err := p.ReadField6(iprot); err != nil { return err } - issetStep = true + issetFormula = true case 7: if err := p.ReadField7(iprot); err != nil { return err } - issetFormula = true case 8: if err := p.ReadField8(iprot); err != nil { return err } - case 9: - if err := p.ReadField9(iprot); err != nil { - return err - } default: if err := iprot.Skip(fieldTypeId); err != nil { return err @@ -13058,9 +13046,6 @@ func (p *AggregateTilesRequest) Read(iprot thrift.TProtocol) error { if !issetTargetNameSpace { return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TargetNameSpace is not set")) } - if !issetShard { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Shard is not set")) - } if !issetRangeStart { return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeStart is not set")) } @@ -13095,10 +13080,10 @@ func (p *AggregateTilesRequest) ReadField2(iprot thrift.TProtocol) error { } func (p *AggregateTilesRequest) ReadField3(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { + if v, err := iprot.ReadI64(); err != nil { return thrift.PrependError("error reading field 3: ", err) } else { - p.Shard = v + p.RangeStart = v } return nil } @@ -13107,16 +13092,16 @@ func (p *AggregateTilesRequest) ReadField4(iprot thrift.TProtocol) error { if v, err := iprot.ReadI64(); err != nil { return thrift.PrependError("error reading field 4: ", err) } else { - p.RangeStart = v + p.RangeEnd = v } return nil } func (p *AggregateTilesRequest) ReadField5(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { + if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 5: ", err) } else { - p.RangeEnd = v + p.Step = v } return nil } @@ -13124,33 +13109,24 @@ func (p *AggregateTilesRequest) ReadField5(iprot thrift.TProtocol) error { func (p *AggregateTilesRequest) ReadField6(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 6: ", err) - } else { - p.Step = v - } - return nil -} - -func (p *AggregateTilesRequest) ReadField7(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 7: ", err) } else { p.Formula = v } return nil } -func (p *AggregateTilesRequest) ReadField8(iprot thrift.TProtocol) error { +func (p *AggregateTilesRequest) ReadField7(iprot thrift.TProtocol) error { if v, err := iprot.ReadBool(); err != nil { - return thrift.PrependError("error reading field 8: ", err) + return thrift.PrependError("error reading field 7: ", err) } else { p.RemoveResets = v } return nil } -func (p *AggregateTilesRequest) ReadField9(iprot thrift.TProtocol) error { +func (p *AggregateTilesRequest) ReadField8(iprot thrift.TProtocol) error { if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 9: ", err) + return thrift.PrependError("error reading field 8: ", err) } else { temp := TimeType(v) p.RangeType = temp @@ -13187,9 +13163,6 @@ func (p *AggregateTilesRequest) Write(oprot thrift.TProtocol) error { if err := p.writeField8(oprot); err != nil { return err } - if err := p.writeField9(oprot); err != nil { - return err - } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) @@ -13227,93 +13200,80 @@ func (p *AggregateTilesRequest) writeField2(oprot thrift.TProtocol) (err error) } func (p *AggregateTilesRequest) writeField3(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("shard", thrift.I32, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:shard: ", p), err) - } - if err := oprot.WriteI32(int32(p.Shard)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.shard (3) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:shard: ", p), err) - } - return err -} - -func (p *AggregateTilesRequest) writeField4(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("rangeStart", thrift.I64, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:rangeStart: ", p), err) + if err := oprot.WriteFieldBegin("rangeStart", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:rangeStart: ", p), err) } if err := oprot.WriteI64(int64(p.RangeStart)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.rangeStart (4) field write error: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T.rangeStart (3) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:rangeStart: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:rangeStart: ", p), err) } return err } -func (p *AggregateTilesRequest) writeField5(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("rangeEnd", thrift.I64, 5); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:rangeEnd: ", p), err) +func (p *AggregateTilesRequest) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeEnd", thrift.I64, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:rangeEnd: ", p), err) } if err := oprot.WriteI64(int64(p.RangeEnd)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.rangeEnd (5) field write error: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T.rangeEnd (4) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 5:rangeEnd: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:rangeEnd: ", p), err) } return err } -func (p *AggregateTilesRequest) writeField6(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("step", thrift.STRING, 6); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:step: ", p), err) +func (p *AggregateTilesRequest) writeField5(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("step", thrift.STRING, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:step: ", p), err) } if err := oprot.WriteString(string(p.Step)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.step (6) field write error: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T.step (5) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 6:step: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:step: ", p), err) } return err } -func (p *AggregateTilesRequest) writeField7(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("formula", thrift.STRING, 7); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:formula: ", p), err) +func (p *AggregateTilesRequest) writeField6(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("formula", thrift.STRING, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:formula: ", p), err) } if err := oprot.WriteString(string(p.Formula)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.formula (7) field write error: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T.formula (6) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 7:formula: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:formula: ", p), err) } return err } -func (p *AggregateTilesRequest) writeField8(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("removeResets", thrift.BOOL, 8); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:removeResets: ", p), err) +func (p *AggregateTilesRequest) writeField7(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("removeResets", thrift.BOOL, 7); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:removeResets: ", p), err) } if err := oprot.WriteBool(bool(p.RemoveResets)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.removeResets (8) field write error: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T.removeResets (7) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 8:removeResets: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 7:removeResets: ", p), err) } return err } -func (p *AggregateTilesRequest) writeField9(oprot thrift.TProtocol) (err error) { +func (p *AggregateTilesRequest) writeField8(oprot thrift.TProtocol) (err error) { if p.IsSetRangeType() { - if err := oprot.WriteFieldBegin("rangeType", thrift.I32, 9); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:rangeType: ", p), err) + if err := oprot.WriteFieldBegin("rangeType", thrift.I32, 8); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:rangeType: ", p), err) } if err := oprot.WriteI32(int32(p.RangeType)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.rangeType (9) field write error: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T.rangeType (8) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 9:rangeType: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 8:rangeType: ", p), err) } } return err diff --git a/src/dbnode/network/server/tchannelthrift/node/service.go b/src/dbnode/network/server/tchannelthrift/node/service.go index 8c8014ee02..f39cad1e38 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service.go +++ b/src/dbnode/network/server/tchannelthrift/node/service.go @@ -550,7 +550,6 @@ func (s *service) AggregateTiles(tctx thrift.Context, req *rpc.AggregateTilesReq sp.LogFields( opentracinglog.String("sourceNameSpace", req.SourceNameSpace), opentracinglog.String("targetNameSpace", req.TargetNameSpace), - opentracinglog.Int32("shard", req.Shard), xopentracing.Time("start", time.Unix(0, req.RangeStart)), xopentracing.Time("end", time.Unix(0, req.RangeEnd)), ) From 1a87fd38b5681f5eda5aef02ecfe6c3c83065032 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Mon, 13 Jul 2020 10:39:33 +0300 Subject: [PATCH 05/32] A partial implementation of AggregateTiles --- .../server/tchannelthrift/node/service.go | 28 +++++-- src/dbnode/persist/types.go | 6 +- src/dbnode/storage/database.go | 31 +++++++ src/dbnode/storage/namespace.go | 84 ++++++++++++++++++- src/dbnode/storage/namespace_test.go | 6 +- src/dbnode/storage/types.go | 8 ++ src/dbnode/tracepoint/tracepoint.go | 3 + 7 files changed, 151 insertions(+), 15 deletions(-) diff --git a/src/dbnode/network/server/tchannelthrift/node/service.go b/src/dbnode/network/server/tchannelthrift/node/service.go index f39cad1e38..ce84d2dcc0 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service.go +++ b/src/dbnode/network/server/tchannelthrift/node/service.go @@ -539,13 +539,13 @@ func (s *service) query(ctx context.Context, db storage.Database, req *rpc.Query } func (s *service) AggregateTiles(tctx thrift.Context, req *rpc.AggregateTilesRequest) (*rpc.AggregateTilesResult_, error) { - _, err := s.startReadRPCWithDB() + db, err := s.startWriteRPCWithDB() if err != nil { return nil, err } - defer s.readRPCCompleted() + defer s.writeRPCCompleted() - _, sp, sampled := tchannelthrift.Context(tctx).StartSampledTraceSpan(tracepoint.AggregateTiles) + ctx, sp, sampled := tchannelthrift.Context(tctx).StartSampledTraceSpan(tracepoint.AggregateTiles) if sampled { sp.LogFields( opentracinglog.String("sourceNameSpace", req.SourceNameSpace), @@ -555,13 +555,31 @@ func (s *service) AggregateTiles(tctx thrift.Context, req *rpc.AggregateTilesReq ) } - result, err := &rpc.AggregateTilesResult_{}, nil // TODO + err = s.aggregateTiles(ctx, db, req) if sampled && err != nil { sp.LogFields(opentracinglog.Error(err)) } sp.Finish() - return result, err + return &rpc.AggregateTilesResult_{}, err +} + +func (s *service) aggregateTiles(ctx context.Context, db storage.Database, req *rpc.AggregateTilesRequest) error { + start, rangeStartErr := convert.ToTime(req.RangeStart, req.RangeType) + end, rangeEndErr := convert.ToTime(req.RangeEnd, req.RangeType) + if rangeStartErr != nil || rangeEndErr != nil { + return tterrors.NewBadRequestError(xerrors.FirstError(rangeStartErr, rangeEndErr)) + } + + sourceNsID := s.pools.id.GetStringID(ctx, req.SourceNameSpace) + targetNsID := s.pools.id.GetStringID(ctx, req.TargetNameSpace) + + err := db.AggregateTiles(ctx, sourceNsID, targetNsID, start, end) + if err != nil { + return convert.ToRPCError(err) + } + + return nil } func (s *service) Fetch(tctx thrift.Context, req *rpc.FetchRequest) (*rpc.FetchResult_, error) { diff --git a/src/dbnode/persist/types.go b/src/dbnode/persist/types.go index 0568e0099c..a24d4040b1 100644 --- a/src/dbnode/persist/types.go +++ b/src/dbnode/persist/types.go @@ -218,7 +218,7 @@ type Preparer interface { } // FlushPreparer is a persist flush cycle, each shard and block start permutation needs -// to explicility be prepared. +// to explicitly be prepared. type FlushPreparer interface { Preparer @@ -227,7 +227,7 @@ type FlushPreparer interface { } // SnapshotPreparer is a persist snapshot cycle, each shard and block start permutation needs -// to explicility be prepared. +// to explicitly be prepared. type SnapshotPreparer interface { Preparer @@ -236,7 +236,7 @@ type SnapshotPreparer interface { } // IndexFlush is a persist flush cycle, each namespace, block combination needs -// to explicility be prepared. +// to explicitly be prepared. type IndexFlush interface { // Prepare prepares writing data for a given ns/blockStart, returning a // PreparedIndexPersist object and any error encountered during diff --git a/src/dbnode/storage/database.go b/src/dbnode/storage/database.go index b6b4cd70e1..ee5ddc45bf 100644 --- a/src/dbnode/storage/database.go +++ b/src/dbnode/storage/database.go @@ -1063,6 +1063,37 @@ func (d *db) OwnedNamespaces() ([]databaseNamespace, error) { return d.ownedNamespacesWithLock(), nil } +func (d *db) AggregateTiles( + ctx context.Context, + sourceNsID, targetNsID ident.ID, + start, end time.Time, +) error { + ctx, sp, sampled := ctx.StartSampledTraceSpan(tracepoint.DBAggregateTiles) + if sampled { + sp.LogFields( + opentracinglog.String("sourceNameSpace", sourceNsID.String()), + opentracinglog.String("targetNameSpace", targetNsID.String()), + xopentracing.Time("start", start), + xopentracing.Time("end", end), + ) + } + defer sp.Finish() + + sourceNs, err := d.namespaceFor(sourceNsID) + if err != nil { + d.metrics.unknownNamespaceRead.Inc(1) + return err + } + + targetNs, err := d.namespaceFor(sourceNsID) + if err != nil { + d.metrics.unknownNamespaceRead.Inc(1) + return err + } + + return targetNs.AggregateTiles(sourceNs, start, end) +} + func (d *db) nextIndex() uint64 { // Start with index at "1" so that a default "uniqueIndex" // with "0" is invalid (AddUint64 will return the new value). diff --git a/src/dbnode/storage/namespace.go b/src/dbnode/storage/namespace.go index e03c9cc6d5..34f2dbd716 100644 --- a/src/dbnode/storage/namespace.go +++ b/src/dbnode/storage/namespace.go @@ -867,7 +867,7 @@ func (n *dbNamespace) FetchBlocks( starts []time.Time, ) ([]block.FetchBlockResult, error) { callStart := n.nowFn() - shard, nsCtx, err := n.readableShardAt(shardID) + shard, nsCtx, err := n.ReadableShardAt(shardID) if err != nil { n.metrics.fetchBlocks.ReportError(n.nowFn().Sub(callStart)) return nil, err @@ -887,7 +887,7 @@ func (n *dbNamespace) FetchBlocksMetadataV2( opts block.FetchBlocksMetadataOptions, ) (block.FetchBlocksMetadataResults, PageToken, error) { callStart := n.nowFn() - shard, _, err := n.readableShardAt(shardID) + shard, _, err := n.ReadableShardAt(shardID) if err != nil { n.metrics.fetchBlocksMetadata.ReportError(n.nowFn().Sub(callStart)) return nil, nil, err @@ -1226,7 +1226,7 @@ func (n *dbNamespace) ColdFlush(flushPersist persist.FlushPreparer) error { // We go through this error checking process to allow for partially successful flushes. indexColdFlushError := onColdFlushNs.Done() if indexColdFlushError == nil && onColdFlushDone != nil { - // Only evict rotated cold mutable index segments if the index cold flush was sucessful + // Only evict rotated cold mutable index segments if the index cold flush was successful // or we will lose queryability of data that's still in mem. indexColdFlushError = onColdFlushDone() } @@ -1502,7 +1502,7 @@ func (n *dbNamespace) readableShardFor(id ident.ID) (databaseShard, namespace.Co return shard, nsCtx, err } -func (n *dbNamespace) readableShardAt(shardID uint32) (databaseShard, namespace.Context, error) { +func (n *dbNamespace) ReadableShardAt(shardID uint32) (databaseShard, namespace.Context, error) { n.RLock() nsCtx := n.nsContextWithRLock() shard, err := n.readableShardAtWithRLock(shardID) @@ -1589,3 +1589,79 @@ func (n *dbNamespace) FlushState(shardID uint32, blockStart time.Time) (fileOpSt func (n *dbNamespace) nsContextWithRLock() namespace.Context { return namespace.Context{ID: n.id, Schema: n.schemaDescr} } + +func (n *dbNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time.Time) error { + n.RLock() + if n.bootstrapState != Bootstrapped { + n.RUnlock() + return errNamespaceNotBootstrapped + } + nsCtx := n.nsContextWithRLock() + targetShards := n.OwnedShards() + n.RUnlock() + + resources, err := newColdFlushReuseableResources(n.opts) + if err != nil { + return err + } + + // NB(bodu): The in-mem index will lag behind the TSDB in terms of new series writes. For a period of + // time between when we rotate out the active cold mutable index segments (happens here) and when + // we actually cold flush the data to disk we will be making writes to the newly active mutable seg. + // This means that some series can live doubly in-mem and loaded from disk until the next cold flush + // where they will be evicted from the in-mem index. + var ( + onColdFlushDone OnColdFlushDone + ) + if n.reverseIndex != nil { + onColdFlushDone, err = n.reverseIndex.ColdFlush(targetShards) + if err != nil { + return err + } + } + + onColdFlushNs, err := n.opts.OnColdFlush().ColdFlushNamespace(n) + if err != nil { + return err + } + + // NB(bodu): Deferred targetShard cold flushes so that we can ensure that cold flush index data is + // persisted before persisting TSDB data to ensure crash consistency. + multiErr := xerrors.NewMultiError() + shardColdFlushes := make([]ShardColdFlush, 0, len(targetShards)) + for _, targetShard := range targetShards { + sourceShard, _, err := sourceNs.ReadableShardAt(targetShard.ID()) + if err != nil { + detailedErr := fmt.Errorf("no matching shard in source namespace %s: %v", sourceNs.ID(), err) + multiErr = multiErr.Add(detailedErr) + continue + } + _, _, _ = sourceShard, nsCtx, resources + //shardColdFlush, err := targetShard.ColdFlush(flushPersist, resources, nsCtx, onColdFlushNs) + //if err != nil { + // detailedErr := fmt.Errorf("shard %d failed to compact: %v", targetShard.ID(), err) + // multiErr = multiErr.Add(detailedErr) + // continue + //} + //shardColdFlushes = append(shardColdFlushes, shardColdFlush) + } + + // We go through this error checking process to allow for partially successful flushes. + indexColdFlushError := onColdFlushNs.Done() + if indexColdFlushError == nil && onColdFlushDone != nil { + // Only evict rotated cold mutable index segments if the index cold flush was successful + // or we will lose queryability of data that's still in mem. + indexColdFlushError = onColdFlushDone() + } + if indexColdFlushError == nil { + // NB(bodu): We only want to complete data cold flushes if the index cold flush + // is successful. If index cold flush is successful, we want to attempt writing + // of checkpoint files to complete the cold data flush lifecycle for successful targetShards. + for _, shardColdFlush := range shardColdFlushes { + multiErr = multiErr.Add(shardColdFlush.Done()) + } + } + multiErr = multiErr.Add(indexColdFlushError) + + return multiErr.FinalError() +} diff --git a/src/dbnode/storage/namespace_test.go b/src/dbnode/storage/namespace_test.go index 6f6018d0ef..3885a4b213 100644 --- a/src/dbnode/storage/namespace_test.go +++ b/src/dbnode/storage/namespace_test.go @@ -662,13 +662,13 @@ func TestNamespaceShardAt(t *testing.T) { s1.EXPECT().IsBootstrapped().Return(false) ns.shards[1] = s1 - _, _, err := ns.readableShardAt(0) + _, _, err := ns.ReadableShardAt(0) require.NoError(t, err) - _, _, err = ns.readableShardAt(1) + _, _, err = ns.ReadableShardAt(1) require.Error(t, err) require.True(t, xerrors.IsRetryableError(err)) require.Equal(t, errShardNotBootstrappedToRead.Error(), err.Error()) - _, _, err = ns.readableShardAt(2) + _, _, err = ns.ReadableShardAt(2) require.Error(t, err) require.True(t, xerrors.IsRetryableError(err)) require.Equal(t, "not responsible for shard 2", err.Error()) diff --git a/src/dbnode/storage/types.go b/src/dbnode/storage/types.go index 45dfa08a4f..9f93d8fc0e 100644 --- a/src/dbnode/storage/types.go +++ b/src/dbnode/storage/types.go @@ -219,6 +219,9 @@ type Database interface { // FlushState returns the flush state for the specified shard and block start. FlushState(namespace ident.ID, shardID uint32, blockStart time.Time) (fileOpState, error) + + // AggregateTiles does large tile aggregation from source namespace to target namespace. + AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time.Time) error } // database is the internal database interface. @@ -405,6 +408,11 @@ type databaseNamespace interface { // WritePendingIndexInserts will write any pending index inserts. WritePendingIndexInserts(pending []writes.PendingIndexInsert) error + + ReadableShardAt(shardID uint32) (databaseShard, namespace.Context, error) + + // AggregateTiles does large tile aggregation from source namespace to this namespace. + AggregateTiles(sourceNs databaseNamespace, start, end time.Time) error } // SeriesReadWriteRef is a read/write reference for a series, diff --git a/src/dbnode/tracepoint/tracepoint.go b/src/dbnode/tracepoint/tracepoint.go index eed4a99796..c3d6ffa61a 100644 --- a/src/dbnode/tracepoint/tracepoint.go +++ b/src/dbnode/tracepoint/tracepoint.go @@ -67,6 +67,9 @@ const ( // DBWriteBatch is the operation name for the db WriteBatch path. DBWriteBatch = "storage.db.WriteBatch" + // DBAggregateTiles is the operation name for the db AggregateTiles path. + DBAggregateTiles = "storage.db.AggregateTiles" + // NSQueryIDs is the operation name for the dbNamespace QueryIDs path. NSQueryIDs = "storage.dbNamespace.QueryIDs" From ac1bc666f020c56ff9f13031f06bf84798aa85af Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Tue, 14 Jul 2020 12:05:04 +0300 Subject: [PATCH 06/32] Open DataFileSetReader and iterate through it --- src/dbnode/generated/thrift/rpc.thrift | 5 +- src/dbnode/generated/thrift/rpc/rpc.go | 68 +++++-------------------- src/dbnode/storage/namespace.go | 28 +++++----- src/dbnode/storage/namespace_readers.go | 2 + src/dbnode/storage/namespace_test.go | 6 +-- src/dbnode/storage/shard.go | 58 +++++++++++++++++++++ src/dbnode/storage/types.go | 18 +++++-- 7 files changed, 110 insertions(+), 75 deletions(-) diff --git a/src/dbnode/generated/thrift/rpc.thrift b/src/dbnode/generated/thrift/rpc.thrift index 16a93f0471..cda46e19d6 100644 --- a/src/dbnode/generated/thrift/rpc.thrift +++ b/src/dbnode/generated/thrift/rpc.thrift @@ -499,9 +499,8 @@ struct AggregateTilesRequest { 3: required i64 rangeStart 4: required i64 rangeEnd 5: required string step - 6: required string formula - 7: bool removeResets - 8: optional TimeType rangeType = TimeType.UNIX_SECONDS + 6: bool removeResets + 7: optional TimeType rangeType = TimeType.UNIX_SECONDS } struct AggregateTilesResult { diff --git a/src/dbnode/generated/thrift/rpc/rpc.go b/src/dbnode/generated/thrift/rpc/rpc.go index 7a9bad0432..6748c61670 100644 --- a/src/dbnode/generated/thrift/rpc/rpc.go +++ b/src/dbnode/generated/thrift/rpc/rpc.go @@ -12912,7 +12912,6 @@ func (p *Query) String() string { // - RangeStart // - RangeEnd // - Step -// - Formula // - RemoveResets // - RangeType type AggregateTilesRequest struct { @@ -12921,9 +12920,8 @@ type AggregateTilesRequest struct { RangeStart int64 `thrift:"rangeStart,3,required" db:"rangeStart" json:"rangeStart"` RangeEnd int64 `thrift:"rangeEnd,4,required" db:"rangeEnd" json:"rangeEnd"` Step string `thrift:"step,5,required" db:"step" json:"step"` - Formula string `thrift:"formula,6,required" db:"formula" json:"formula"` - RemoveResets bool `thrift:"removeResets,7" db:"removeResets" json:"removeResets"` - RangeType TimeType `thrift:"rangeType,8" db:"rangeType" json:"rangeType,omitempty"` + RemoveResets bool `thrift:"removeResets,6" db:"removeResets" json:"removeResets"` + RangeType TimeType `thrift:"rangeType,7" db:"rangeType" json:"rangeType,omitempty"` } func NewAggregateTilesRequest() *AggregateTilesRequest { @@ -12952,10 +12950,6 @@ func (p *AggregateTilesRequest) GetStep() string { return p.Step } -func (p *AggregateTilesRequest) GetFormula() string { - return p.Formula -} - func (p *AggregateTilesRequest) GetRemoveResets() bool { return p.RemoveResets } @@ -12979,7 +12973,6 @@ func (p *AggregateTilesRequest) Read(iprot thrift.TProtocol) error { var issetRangeStart bool = false var issetRangeEnd bool = false var issetStep bool = false - var issetFormula bool = false for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() @@ -13019,15 +13012,10 @@ func (p *AggregateTilesRequest) Read(iprot thrift.TProtocol) error { if err := p.ReadField6(iprot); err != nil { return err } - issetFormula = true case 7: if err := p.ReadField7(iprot); err != nil { return err } - case 8: - if err := p.ReadField8(iprot); err != nil { - return err - } default: if err := iprot.Skip(fieldTypeId); err != nil { return err @@ -13055,9 +13043,6 @@ func (p *AggregateTilesRequest) Read(iprot thrift.TProtocol) error { if !issetStep { return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Step is not set")) } - if !issetFormula { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Formula is not set")) - } return nil } @@ -13107,26 +13092,17 @@ func (p *AggregateTilesRequest) ReadField5(iprot thrift.TProtocol) error { } func (p *AggregateTilesRequest) ReadField6(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 6: ", err) - } else { - p.Formula = v - } - return nil -} - -func (p *AggregateTilesRequest) ReadField7(iprot thrift.TProtocol) error { if v, err := iprot.ReadBool(); err != nil { - return thrift.PrependError("error reading field 7: ", err) + return thrift.PrependError("error reading field 6: ", err) } else { p.RemoveResets = v } return nil } -func (p *AggregateTilesRequest) ReadField8(iprot thrift.TProtocol) error { +func (p *AggregateTilesRequest) ReadField7(iprot thrift.TProtocol) error { if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 8: ", err) + return thrift.PrependError("error reading field 7: ", err) } else { temp := TimeType(v) p.RangeType = temp @@ -13160,9 +13136,6 @@ func (p *AggregateTilesRequest) Write(oprot thrift.TProtocol) error { if err := p.writeField7(oprot); err != nil { return err } - if err := p.writeField8(oprot); err != nil { - return err - } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) @@ -13239,41 +13212,28 @@ func (p *AggregateTilesRequest) writeField5(oprot thrift.TProtocol) (err error) } func (p *AggregateTilesRequest) writeField6(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("formula", thrift.STRING, 6); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:formula: ", p), err) - } - if err := oprot.WriteString(string(p.Formula)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.formula (6) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 6:formula: ", p), err) - } - return err -} - -func (p *AggregateTilesRequest) writeField7(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("removeResets", thrift.BOOL, 7); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:removeResets: ", p), err) + if err := oprot.WriteFieldBegin("removeResets", thrift.BOOL, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:removeResets: ", p), err) } if err := oprot.WriteBool(bool(p.RemoveResets)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.removeResets (7) field write error: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T.removeResets (6) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 7:removeResets: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:removeResets: ", p), err) } return err } -func (p *AggregateTilesRequest) writeField8(oprot thrift.TProtocol) (err error) { +func (p *AggregateTilesRequest) writeField7(oprot thrift.TProtocol) (err error) { if p.IsSetRangeType() { - if err := oprot.WriteFieldBegin("rangeType", thrift.I32, 8); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:rangeType: ", p), err) + if err := oprot.WriteFieldBegin("rangeType", thrift.I32, 7); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:rangeType: ", p), err) } if err := oprot.WriteI32(int32(p.RangeType)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.rangeType (8) field write error: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T.rangeType (7) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 8:rangeType: ", p), err) + return thrift.PrependError(fmt.Sprintf("%T write field end error 7:rangeType: ", p), err) } } return err diff --git a/src/dbnode/storage/namespace.go b/src/dbnode/storage/namespace.go index 34f2dbd716..325f0f3238 100644 --- a/src/dbnode/storage/namespace.go +++ b/src/dbnode/storage/namespace.go @@ -867,7 +867,7 @@ func (n *dbNamespace) FetchBlocks( starts []time.Time, ) ([]block.FetchBlockResult, error) { callStart := n.nowFn() - shard, nsCtx, err := n.ReadableShardAt(shardID) + shard, nsCtx, err := n.readableShardAt(shardID) if err != nil { n.metrics.fetchBlocks.ReportError(n.nowFn().Sub(callStart)) return nil, err @@ -887,7 +887,7 @@ func (n *dbNamespace) FetchBlocksMetadataV2( opts block.FetchBlocksMetadataOptions, ) (block.FetchBlocksMetadataResults, PageToken, error) { callStart := n.nowFn() - shard, _, err := n.ReadableShardAt(shardID) + shard, _, err := n.readableShardAt(shardID) if err != nil { n.metrics.fetchBlocksMetadata.ReportError(n.nowFn().Sub(callStart)) return nil, nil, err @@ -1502,7 +1502,7 @@ func (n *dbNamespace) readableShardFor(id ident.ID) (databaseShard, namespace.Co return shard, nsCtx, err } -func (n *dbNamespace) ReadableShardAt(shardID uint32) (databaseShard, namespace.Context, error) { +func (n *dbNamespace) readableShardAt(shardID uint32) (databaseShard, namespace.Context, error) { n.RLock() nsCtx := n.nsContextWithRLock() shard, err := n.readableShardAtWithRLock(shardID) @@ -1600,6 +1600,11 @@ func (n *dbNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time targetShards := n.OwnedShards() n.RUnlock() + reader, err := fs.NewReader(n.opts.BytesPool(), n.opts.CommitLogOptions().FilesystemOptions()) + if err != nil { + return err + } + resources, err := newColdFlushReuseableResources(n.opts) if err != nil { return err @@ -1630,20 +1635,19 @@ func (n *dbNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time multiErr := xerrors.NewMultiError() shardColdFlushes := make([]ShardColdFlush, 0, len(targetShards)) for _, targetShard := range targetShards { - sourceShard, _, err := sourceNs.ReadableShardAt(targetShard.ID()) + sourceShard, _, err := sourceNs.readableShardAt(targetShard.ID()) if err != nil { detailedErr := fmt.Errorf("no matching shard in source namespace %s: %v", sourceNs.ID(), err) multiErr = multiErr.Add(detailedErr) continue } - _, _, _ = sourceShard, nsCtx, resources - //shardColdFlush, err := targetShard.ColdFlush(flushPersist, resources, nsCtx, onColdFlushNs) - //if err != nil { - // detailedErr := fmt.Errorf("shard %d failed to compact: %v", targetShard.ID(), err) - // multiErr = multiErr.Add(detailedErr) - // continue - //} - //shardColdFlushes = append(shardColdFlushes, shardColdFlush) + shardColdFlush, err := targetShard.AggregateTiles(reader, sourceShard, start, resources, nsCtx, onColdFlushNs) + if err != nil { + detailedErr := fmt.Errorf("shard %d failed to compact: %v", targetShard.ID(), err) + multiErr = multiErr.Add(detailedErr) + continue + } + shardColdFlushes = append(shardColdFlushes, shardColdFlush) } // We go through this error checking process to allow for partially successful flushes. diff --git a/src/dbnode/storage/namespace_readers.go b/src/dbnode/storage/namespace_readers.go index df92ed0144..ab1ba4b089 100644 --- a/src/dbnode/storage/namespace_readers.go +++ b/src/dbnode/storage/namespace_readers.go @@ -73,6 +73,8 @@ type databaseNamespaceReaderManager interface { put(reader fs.DataFileSetReader) error + latestVolume(shard uint32, blockStart time.Time) (int, error) + assignShardSet(shardSet sharding.ShardSet) tick() diff --git a/src/dbnode/storage/namespace_test.go b/src/dbnode/storage/namespace_test.go index 3885a4b213..6f6018d0ef 100644 --- a/src/dbnode/storage/namespace_test.go +++ b/src/dbnode/storage/namespace_test.go @@ -662,13 +662,13 @@ func TestNamespaceShardAt(t *testing.T) { s1.EXPECT().IsBootstrapped().Return(false) ns.shards[1] = s1 - _, _, err := ns.ReadableShardAt(0) + _, _, err := ns.readableShardAt(0) require.NoError(t, err) - _, _, err = ns.ReadableShardAt(1) + _, _, err = ns.readableShardAt(1) require.Error(t, err) require.True(t, xerrors.IsRetryableError(err)) require.Equal(t, errShardNotBootstrappedToRead.Error(), err.Error()) - _, _, err = ns.ReadableShardAt(2) + _, _, err = ns.readableShardAt(2) require.Error(t, err) require.True(t, xerrors.IsRetryableError(err)) require.Equal(t, "not responsible for shard 2", err.Error()) diff --git a/src/dbnode/storage/shard.go b/src/dbnode/storage/shard.go index 68e3b97fa6..93e0aea16b 100644 --- a/src/dbnode/storage/shard.go +++ b/src/dbnode/storage/shard.go @@ -2538,6 +2538,60 @@ func (s *dbShard) Repair( return repairer.Repair(ctx, nsCtx, nsMeta, tr, s) } +func (s *dbShard) AggregateTiles( + reader fs.DataFileSetReader, + sourceShard databaseShard, + blockStart time.Time, + resources coldFlushReuseableResources, + nsCtx namespace.Context, + onFlush persist.OnFlushSeries, +) (ShardColdFlush, error) { + latestSourceVolume, err := sourceShard.latestVolume(blockStart) + if err != nil { + return nil, err + } + + openOpts := fs.DataReaderOpenOptions{ + Identifier: fs.FileSetFileIdentifier{ + Namespace: s.namespace.ID(), + Shard: sourceShard.ID(), + BlockStart: blockStart, + VolumeIndex: latestSourceVolume, + }, + //TODO after https://github.com/chronosphereio/m3/pull/10 for proper streaming - OrderByIndex: true + } + if err := reader.Open(openOpts); err != nil { + return nil, err + } + defer reader.Close() + + for { + id, tags, data, checksum, err := reader.Read() + if err == io.EOF { + break + } + if err != nil { + return nil, err + } + //TODO persist this data: + _, _, _, _ = id, tags, data, checksum + } + + var flush persist.FlushPreparer //FIXME what is this? + return s.ColdFlush(flush, resources, nsCtx, onFlush) +} + +func (s *dbShard) TagsFromSeriesID(seriesID ident.ID) (ident.Tags, bool, error) { + s.RLock() + entry, _, err := s.lookupEntryWithLock(seriesID) + s.RUnlock() + if entry == nil || err != nil { + return ident.Tags{}, false, err + } + + return entry.Series.Tags(), true, nil +} + func (s *dbShard) BootstrapState() BootstrapState { s.RLock() bs := s.bootstrapState @@ -2559,6 +2613,10 @@ func (s *dbShard) DocRef(id ident.ID) (doc.Document, bool, error) { return emptyDoc, false, err } +func (s *dbShard) latestVolume(blockStart time.Time) (int, error) { + return s.namespaceReaderMgr.latestVolume(s.shard, blockStart) +} + func (s *dbShard) logFlushResult(r dbShardFlushResult) { s.logger.Debug("shard flush outcome", zap.Uint32("shard", s.ID()), diff --git a/src/dbnode/storage/types.go b/src/dbnode/storage/types.go index 9f93d8fc0e..aa1e67418f 100644 --- a/src/dbnode/storage/types.go +++ b/src/dbnode/storage/types.go @@ -409,10 +409,10 @@ type databaseNamespace interface { // WritePendingIndexInserts will write any pending index inserts. WritePendingIndexInserts(pending []writes.PendingIndexInsert) error - ReadableShardAt(shardID uint32) (databaseShard, namespace.Context, error) - - // AggregateTiles does large tile aggregation from source namespace to this namespace. + // AggregateTiles does large tile aggregation from source namespace into this namespace. AggregateTiles(sourceNs databaseNamespace, start, end time.Time) error + + readableShardAt(shardID uint32) (databaseShard, namespace.Context, error) } // SeriesReadWriteRef is a read/write reference for a series, @@ -589,6 +589,18 @@ type databaseShard interface { // DocRef returns the doc if already present in a shard series. DocRef(id ident.ID) (doc.Document, bool, error) + + // AggregateTiles does large tile aggregation from source shards into this shard. + AggregateTiles( + reader fs.DataFileSetReader, + sourceShard databaseShard, + blockStart time.Time, + resources coldFlushReuseableResources, + nsCtx namespace.Context, + onFlush persist.OnFlushSeries, + ) (ShardColdFlush, error) + + latestVolume(blockStart time.Time) (int, error) } // ShardColdFlush exposes a done method to finalize shard cold flush From c1508585827cfad185ffd6b61b292ebefc0368ab Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Tue, 14 Jul 2020 12:56:58 +0300 Subject: [PATCH 07/32] Decompress the data read --- src/dbnode/storage/shard.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/dbnode/storage/shard.go b/src/dbnode/storage/shard.go index 93e0aea16b..00862ece0c 100644 --- a/src/dbnode/storage/shard.go +++ b/src/dbnode/storage/shard.go @@ -21,9 +21,12 @@ package storage import ( + "bytes" "container/list" "errors" "fmt" + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/encoding/m3tsz" "io" "math" "sync" @@ -2565,6 +2568,10 @@ func (s *dbShard) AggregateTiles( } defer reader.Close() + encodingOpts := encoding.NewOptions().SetBytesPool(s.opts.BytesPool()) + bytesReader := bytes.NewReader(nil) + dataPointIter := m3tsz.NewReaderIterator(bytesReader, true, encodingOpts) + for { id, tags, data, checksum, err := reader.Read() if err == io.EOF { @@ -2573,8 +2580,18 @@ func (s *dbShard) AggregateTiles( if err != nil { return nil, err } - //TODO persist this data: - _, _, _, _ = id, tags, data, checksum + + data.IncRef() + bytesReader.Reset(data.Bytes()) + dataPointIter.Reset(bytesReader, nil) + + //TODO persist the data from dataPointIter + _, _, _ = id, tags, checksum + + dataPointIter.Close() + + data.DecRef() + data.Finalize() } var flush persist.FlushPreparer //FIXME what is this? From aa9617bf560eb012ab4910385a2f3e6df7b32dac Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Tue, 14 Jul 2020 13:12:43 +0300 Subject: [PATCH 08/32] Add explicit FileSetType --- src/dbnode/storage/shard.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dbnode/storage/shard.go b/src/dbnode/storage/shard.go index 00862ece0c..e4ac5dcf7e 100644 --- a/src/dbnode/storage/shard.go +++ b/src/dbnode/storage/shard.go @@ -2561,6 +2561,7 @@ func (s *dbShard) AggregateTiles( BlockStart: blockStart, VolumeIndex: latestSourceVolume, }, + FileSetType: persist.FileSetFlushType, //TODO after https://github.com/chronosphereio/m3/pull/10 for proper streaming - OrderByIndex: true } if err := reader.Open(openOpts); err != nil { @@ -2569,7 +2570,7 @@ func (s *dbShard) AggregateTiles( defer reader.Close() encodingOpts := encoding.NewOptions().SetBytesPool(s.opts.BytesPool()) - bytesReader := bytes.NewReader(nil) + bytesReader := bytes.NewReader(nil) dataPointIter := m3tsz.NewReaderIterator(bytesReader, true, encodingOpts) for { From 76dc3e29febe44aa3d960bb84914c196ea3c4ce4 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Wed, 15 Jul 2020 13:45:10 +0300 Subject: [PATCH 09/32] Remove dbShard.TagsFromSeriesID --- src/dbnode/storage/shard.go | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/dbnode/storage/shard.go b/src/dbnode/storage/shard.go index e4ac5dcf7e..c33b8d9aa3 100644 --- a/src/dbnode/storage/shard.go +++ b/src/dbnode/storage/shard.go @@ -2599,17 +2599,6 @@ func (s *dbShard) AggregateTiles( return s.ColdFlush(flush, resources, nsCtx, onFlush) } -func (s *dbShard) TagsFromSeriesID(seriesID ident.ID) (ident.Tags, bool, error) { - s.RLock() - entry, _, err := s.lookupEntryWithLock(seriesID) - s.RUnlock() - if entry == nil || err != nil { - return ident.Tags{}, false, err - } - - return entry.Series.Tags(), true, nil -} - func (s *dbShard) BootstrapState() BootstrapState { s.RLock() bs := s.bootstrapState From fd222ef1030392686a2041ad186086a9e6374c9b Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Wed, 15 Jul 2020 14:20:55 +0300 Subject: [PATCH 10/32] Regenerate mocks --- src/dbnode/storage/storage_mock.go | 308 +++++++++++++++++------------ 1 file changed, 187 insertions(+), 121 deletions(-) diff --git a/src/dbnode/storage/storage_mock.go b/src/dbnode/storage/storage_mock.go index 6e1a2f47cf..5232ad6a57 100644 --- a/src/dbnode/storage/storage_mock.go +++ b/src/dbnode/storage/storage_mock.go @@ -1,61 +1,39 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/m3db/m3/src/dbnode/storage/types.go - -// Copyright (c) 2020 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. +// Source: /Users/linas/go/src/github.com/m3db/m3/src/dbnode/storage/types.go // Package storage is a generated GoMock package. package storage import ( - "reflect" - "sync" - "time" - - "github.com/m3db/m3/src/dbnode/clock" - "github.com/m3db/m3/src/dbnode/encoding" - "github.com/m3db/m3/src/dbnode/namespace" - "github.com/m3db/m3/src/dbnode/persist" - "github.com/m3db/m3/src/dbnode/persist/fs" - "github.com/m3db/m3/src/dbnode/persist/fs/commitlog" - "github.com/m3db/m3/src/dbnode/runtime" - "github.com/m3db/m3/src/dbnode/sharding" - "github.com/m3db/m3/src/dbnode/storage/block" - "github.com/m3db/m3/src/dbnode/storage/bootstrap" - "github.com/m3db/m3/src/dbnode/storage/bootstrap/result" - "github.com/m3db/m3/src/dbnode/storage/index" - "github.com/m3db/m3/src/dbnode/storage/repair" - "github.com/m3db/m3/src/dbnode/storage/series" - "github.com/m3db/m3/src/dbnode/ts/writes" - "github.com/m3db/m3/src/dbnode/x/xio" - "github.com/m3db/m3/src/dbnode/x/xpool" - "github.com/m3db/m3/src/m3ninx/doc" - "github.com/m3db/m3/src/x/context" - "github.com/m3db/m3/src/x/ident" - "github.com/m3db/m3/src/x/instrument" - "github.com/m3db/m3/src/x/mmap" - "github.com/m3db/m3/src/x/pool" - sync0 "github.com/m3db/m3/src/x/sync" - time0 "github.com/m3db/m3/src/x/time" - - "github.com/golang/mock/gomock" + gomock "github.com/golang/mock/gomock" + clock "github.com/m3db/m3/src/dbnode/clock" + encoding "github.com/m3db/m3/src/dbnode/encoding" + namespace "github.com/m3db/m3/src/dbnode/namespace" + persist "github.com/m3db/m3/src/dbnode/persist" + fs "github.com/m3db/m3/src/dbnode/persist/fs" + commitlog "github.com/m3db/m3/src/dbnode/persist/fs/commitlog" + runtime "github.com/m3db/m3/src/dbnode/runtime" + sharding "github.com/m3db/m3/src/dbnode/sharding" + block "github.com/m3db/m3/src/dbnode/storage/block" + bootstrap "github.com/m3db/m3/src/dbnode/storage/bootstrap" + result "github.com/m3db/m3/src/dbnode/storage/bootstrap/result" + index "github.com/m3db/m3/src/dbnode/storage/index" + repair "github.com/m3db/m3/src/dbnode/storage/repair" + series "github.com/m3db/m3/src/dbnode/storage/series" + writes "github.com/m3db/m3/src/dbnode/ts/writes" + xio "github.com/m3db/m3/src/dbnode/x/xio" + xpool "github.com/m3db/m3/src/dbnode/x/xpool" + doc "github.com/m3db/m3/src/m3ninx/doc" + context "github.com/m3db/m3/src/x/context" + ident "github.com/m3db/m3/src/x/ident" + instrument "github.com/m3db/m3/src/x/instrument" + mmap "github.com/m3db/m3/src/x/mmap" + pool "github.com/m3db/m3/src/x/pool" + sync "github.com/m3db/m3/src/x/sync" + time "github.com/m3db/m3/src/x/time" + reflect "reflect" + sync0 "sync" + time0 "time" ) // MockIndexedErrorHandler is a mock of IndexedErrorHandler interface @@ -228,7 +206,7 @@ func (mr *MockDatabaseMockRecorder) Terminate() *gomock.Call { } // Write mocks base method -func (m *MockDatabase) Write(ctx context.Context, namespace, id ident.ID, timestamp time.Time, value float64, unit time0.Unit, annotation []byte) error { +func (m *MockDatabase) Write(ctx context.Context, namespace, id ident.ID, timestamp time0.Time, value float64, unit time.Unit, annotation []byte) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Write", ctx, namespace, id, timestamp, value, unit, annotation) ret0, _ := ret[0].(error) @@ -242,7 +220,7 @@ func (mr *MockDatabaseMockRecorder) Write(ctx, namespace, id, timestamp, value, } // WriteTagged mocks base method -func (m *MockDatabase) WriteTagged(ctx context.Context, namespace, id ident.ID, tags ident.TagIterator, timestamp time.Time, value float64, unit time0.Unit, annotation []byte) error { +func (m *MockDatabase) WriteTagged(ctx context.Context, namespace, id ident.ID, tags ident.TagIterator, timestamp time0.Time, value float64, unit time.Unit, annotation []byte) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WriteTagged", ctx, namespace, id, tags, timestamp, value, unit, annotation) ret0, _ := ret[0].(error) @@ -329,7 +307,7 @@ func (mr *MockDatabaseMockRecorder) AggregateQuery(ctx, namespace, query, opts i } // ReadEncoded mocks base method -func (m *MockDatabase) ReadEncoded(ctx context.Context, namespace, id ident.ID, start, end time.Time) ([][]xio.BlockReader, error) { +func (m *MockDatabase) ReadEncoded(ctx context.Context, namespace, id ident.ID, start, end time0.Time) ([][]xio.BlockReader, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ReadEncoded", ctx, namespace, id, start, end) ret0, _ := ret[0].([][]xio.BlockReader) @@ -344,7 +322,7 @@ func (mr *MockDatabaseMockRecorder) ReadEncoded(ctx, namespace, id, start, end i } // FetchBlocks mocks base method -func (m *MockDatabase) FetchBlocks(ctx context.Context, namespace ident.ID, shard uint32, id ident.ID, starts []time.Time) ([]block.FetchBlockResult, error) { +func (m *MockDatabase) FetchBlocks(ctx context.Context, namespace ident.ID, shard uint32, id ident.ID, starts []time0.Time) ([]block.FetchBlockResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocks", ctx, namespace, shard, id, starts) ret0, _ := ret[0].([]block.FetchBlockResult) @@ -359,7 +337,7 @@ func (mr *MockDatabaseMockRecorder) FetchBlocks(ctx, namespace, shard, id, start } // FetchBlocksMetadataV2 mocks base method -func (m *MockDatabase) FetchBlocksMetadataV2(ctx context.Context, namespace ident.ID, shard uint32, start, end time.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { +func (m *MockDatabase) FetchBlocksMetadataV2(ctx context.Context, namespace ident.ID, shard uint32, start, end time0.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocksMetadataV2", ctx, namespace, shard, start, end, limit, pageToken, opts) ret0, _ := ret[0].(block.FetchBlocksMetadataResults) @@ -474,7 +452,7 @@ func (mr *MockDatabaseMockRecorder) BootstrapState() *gomock.Call { } // FlushState mocks base method -func (m *MockDatabase) FlushState(namespace ident.ID, shardID uint32, blockStart time.Time) (fileOpState, error) { +func (m *MockDatabase) FlushState(namespace ident.ID, shardID uint32, blockStart time0.Time) (fileOpState, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FlushState", namespace, shardID, blockStart) ret0, _ := ret[0].(fileOpState) @@ -488,6 +466,20 @@ func (mr *MockDatabaseMockRecorder) FlushState(namespace, shardID, blockStart in return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FlushState", reflect.TypeOf((*MockDatabase)(nil).FlushState), namespace, shardID, blockStart) } +// AggregateTiles mocks base method +func (m *MockDatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time0.Time) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNsID, targetNsID, start, end) + ret0, _ := ret[0].(error) + return ret0 +} + +// AggregateTiles indicates an expected call of AggregateTiles +func (mr *MockDatabaseMockRecorder) AggregateTiles(ctx, sourceNsID, targetNsID, start, end interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockDatabase)(nil).AggregateTiles), ctx, sourceNsID, targetNsID, start, end) +} + // Mockdatabase is a mock of database interface type Mockdatabase struct { ctrl *gomock.Controller @@ -623,7 +615,7 @@ func (mr *MockdatabaseMockRecorder) Terminate() *gomock.Call { } // Write mocks base method -func (m *Mockdatabase) Write(ctx context.Context, namespace, id ident.ID, timestamp time.Time, value float64, unit time0.Unit, annotation []byte) error { +func (m *Mockdatabase) Write(ctx context.Context, namespace, id ident.ID, timestamp time0.Time, value float64, unit time.Unit, annotation []byte) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Write", ctx, namespace, id, timestamp, value, unit, annotation) ret0, _ := ret[0].(error) @@ -637,7 +629,7 @@ func (mr *MockdatabaseMockRecorder) Write(ctx, namespace, id, timestamp, value, } // WriteTagged mocks base method -func (m *Mockdatabase) WriteTagged(ctx context.Context, namespace, id ident.ID, tags ident.TagIterator, timestamp time.Time, value float64, unit time0.Unit, annotation []byte) error { +func (m *Mockdatabase) WriteTagged(ctx context.Context, namespace, id ident.ID, tags ident.TagIterator, timestamp time0.Time, value float64, unit time.Unit, annotation []byte) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WriteTagged", ctx, namespace, id, tags, timestamp, value, unit, annotation) ret0, _ := ret[0].(error) @@ -724,7 +716,7 @@ func (mr *MockdatabaseMockRecorder) AggregateQuery(ctx, namespace, query, opts i } // ReadEncoded mocks base method -func (m *Mockdatabase) ReadEncoded(ctx context.Context, namespace, id ident.ID, start, end time.Time) ([][]xio.BlockReader, error) { +func (m *Mockdatabase) ReadEncoded(ctx context.Context, namespace, id ident.ID, start, end time0.Time) ([][]xio.BlockReader, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ReadEncoded", ctx, namespace, id, start, end) ret0, _ := ret[0].([][]xio.BlockReader) @@ -739,7 +731,7 @@ func (mr *MockdatabaseMockRecorder) ReadEncoded(ctx, namespace, id, start, end i } // FetchBlocks mocks base method -func (m *Mockdatabase) FetchBlocks(ctx context.Context, namespace ident.ID, shard uint32, id ident.ID, starts []time.Time) ([]block.FetchBlockResult, error) { +func (m *Mockdatabase) FetchBlocks(ctx context.Context, namespace ident.ID, shard uint32, id ident.ID, starts []time0.Time) ([]block.FetchBlockResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocks", ctx, namespace, shard, id, starts) ret0, _ := ret[0].([]block.FetchBlockResult) @@ -754,7 +746,7 @@ func (mr *MockdatabaseMockRecorder) FetchBlocks(ctx, namespace, shard, id, start } // FetchBlocksMetadataV2 mocks base method -func (m *Mockdatabase) FetchBlocksMetadataV2(ctx context.Context, namespace ident.ID, shard uint32, start, end time.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { +func (m *Mockdatabase) FetchBlocksMetadataV2(ctx context.Context, namespace ident.ID, shard uint32, start, end time0.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocksMetadataV2", ctx, namespace, shard, start, end, limit, pageToken, opts) ret0, _ := ret[0].(block.FetchBlocksMetadataResults) @@ -869,7 +861,7 @@ func (mr *MockdatabaseMockRecorder) BootstrapState() *gomock.Call { } // FlushState mocks base method -func (m *Mockdatabase) FlushState(namespace ident.ID, shardID uint32, blockStart time.Time) (fileOpState, error) { +func (m *Mockdatabase) FlushState(namespace ident.ID, shardID uint32, blockStart time0.Time) (fileOpState, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FlushState", namespace, shardID, blockStart) ret0, _ := ret[0].(fileOpState) @@ -883,6 +875,20 @@ func (mr *MockdatabaseMockRecorder) FlushState(namespace, shardID, blockStart in return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FlushState", reflect.TypeOf((*Mockdatabase)(nil).FlushState), namespace, shardID, blockStart) } +// AggregateTiles mocks base method +func (m *Mockdatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time0.Time) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNsID, targetNsID, start, end) + ret0, _ := ret[0].(error) + return ret0 +} + +// AggregateTiles indicates an expected call of AggregateTiles +func (mr *MockdatabaseMockRecorder) AggregateTiles(ctx, sourceNsID, targetNsID, start, end interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*Mockdatabase)(nil).AggregateTiles), ctx, sourceNsID, targetNsID, start, end) +} + // OwnedNamespaces mocks base method func (m *Mockdatabase) OwnedNamespaces() ([]databaseNamespace, error) { m.ctrl.T.Helper() @@ -1225,7 +1231,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) OwnedShards() *gomock.Call { } // Tick mocks base method -func (m *MockdatabaseNamespace) Tick(c context.Cancellable, startTime time.Time) error { +func (m *MockdatabaseNamespace) Tick(c context.Cancellable, startTime time0.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Tick", c, startTime) ret0, _ := ret[0].(error) @@ -1239,7 +1245,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) Tick(c, startTime interface{}) *gom } // Write mocks base method -func (m *MockdatabaseNamespace) Write(ctx context.Context, id ident.ID, timestamp time.Time, value float64, unit time0.Unit, annotation []byte) (SeriesWrite, error) { +func (m *MockdatabaseNamespace) Write(ctx context.Context, id ident.ID, timestamp time0.Time, value float64, unit time.Unit, annotation []byte) (SeriesWrite, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Write", ctx, id, timestamp, value, unit, annotation) ret0, _ := ret[0].(SeriesWrite) @@ -1254,7 +1260,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) Write(ctx, id, timestamp, value, un } // WriteTagged mocks base method -func (m *MockdatabaseNamespace) WriteTagged(ctx context.Context, id ident.ID, tags ident.TagIterator, timestamp time.Time, value float64, unit time0.Unit, annotation []byte) (SeriesWrite, error) { +func (m *MockdatabaseNamespace) WriteTagged(ctx context.Context, id ident.ID, tags ident.TagIterator, timestamp time0.Time, value float64, unit time.Unit, annotation []byte) (SeriesWrite, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WriteTagged", ctx, id, tags, timestamp, value, unit, annotation) ret0, _ := ret[0].(SeriesWrite) @@ -1299,7 +1305,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) AggregateQuery(ctx, query, opts int } // ReadEncoded mocks base method -func (m *MockdatabaseNamespace) ReadEncoded(ctx context.Context, id ident.ID, start, end time.Time) ([][]xio.BlockReader, error) { +func (m *MockdatabaseNamespace) ReadEncoded(ctx context.Context, id ident.ID, start, end time0.Time) ([][]xio.BlockReader, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ReadEncoded", ctx, id, start, end) ret0, _ := ret[0].([][]xio.BlockReader) @@ -1314,7 +1320,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) ReadEncoded(ctx, id, start, end int } // FetchBlocks mocks base method -func (m *MockdatabaseNamespace) FetchBlocks(ctx context.Context, shardID uint32, id ident.ID, starts []time.Time) ([]block.FetchBlockResult, error) { +func (m *MockdatabaseNamespace) FetchBlocks(ctx context.Context, shardID uint32, id ident.ID, starts []time0.Time) ([]block.FetchBlockResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocks", ctx, shardID, id, starts) ret0, _ := ret[0].([]block.FetchBlockResult) @@ -1329,7 +1335,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) FetchBlocks(ctx, shardID, id, start } // FetchBlocksMetadataV2 mocks base method -func (m *MockdatabaseNamespace) FetchBlocksMetadataV2(ctx context.Context, shardID uint32, start, end time.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { +func (m *MockdatabaseNamespace) FetchBlocksMetadataV2(ctx context.Context, shardID uint32, start, end time0.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocksMetadataV2", ctx, shardID, start, end, limit, pageToken, opts) ret0, _ := ret[0].(block.FetchBlocksMetadataResults) @@ -1374,7 +1380,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) Bootstrap(ctx, bootstrapResult inte } // WarmFlush mocks base method -func (m *MockdatabaseNamespace) WarmFlush(blockStart time.Time, flush persist.FlushPreparer) error { +func (m *MockdatabaseNamespace) WarmFlush(blockStart time0.Time, flush persist.FlushPreparer) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WarmFlush", blockStart, flush) ret0, _ := ret[0].(error) @@ -1416,7 +1422,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) ColdFlush(flush interface{}) *gomoc } // Snapshot mocks base method -func (m *MockdatabaseNamespace) Snapshot(blockStart, snapshotTime time.Time, flush persist.SnapshotPreparer) error { +func (m *MockdatabaseNamespace) Snapshot(blockStart, snapshotTime time0.Time, flush persist.SnapshotPreparer) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Snapshot", blockStart, snapshotTime, flush) ret0, _ := ret[0].(error) @@ -1430,7 +1436,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) Snapshot(blockStart, snapshotTime, } // NeedsFlush mocks base method -func (m *MockdatabaseNamespace) NeedsFlush(alignedInclusiveStart, alignedInclusiveEnd time.Time) (bool, error) { +func (m *MockdatabaseNamespace) NeedsFlush(alignedInclusiveStart, alignedInclusiveEnd time0.Time) (bool, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NeedsFlush", alignedInclusiveStart, alignedInclusiveEnd) ret0, _ := ret[0].(bool) @@ -1460,7 +1466,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) Truncate() *gomock.Call { } // Repair mocks base method -func (m *MockdatabaseNamespace) Repair(repairer databaseShardRepairer, tr time0.Range) error { +func (m *MockdatabaseNamespace) Repair(repairer databaseShardRepairer, tr time.Range) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Repair", repairer, tr) ret0, _ := ret[0].(error) @@ -1488,7 +1494,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) BootstrapState() *gomock.Call { } // FlushState mocks base method -func (m *MockdatabaseNamespace) FlushState(shardID uint32, blockStart time.Time) (fileOpState, error) { +func (m *MockdatabaseNamespace) FlushState(shardID uint32, blockStart time0.Time) (fileOpState, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FlushState", shardID, blockStart) ret0, _ := ret[0].(fileOpState) @@ -1532,6 +1538,36 @@ func (mr *MockdatabaseNamespaceMockRecorder) WritePendingIndexInserts(pending in return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WritePendingIndexInserts", reflect.TypeOf((*MockdatabaseNamespace)(nil).WritePendingIndexInserts), pending) } +// AggregateTiles mocks base method +func (m *MockdatabaseNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time0.Time) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AggregateTiles", sourceNs, start, end) + ret0, _ := ret[0].(error) + return ret0 +} + +// AggregateTiles indicates an expected call of AggregateTiles +func (mr *MockdatabaseNamespaceMockRecorder) AggregateTiles(sourceNs, start, end interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseNamespace)(nil).AggregateTiles), sourceNs, start, end) +} + +// readableShardAt mocks base method +func (m *MockdatabaseNamespace) readableShardAt(shardID uint32) (databaseShard, namespace.Context, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "readableShardAt", shardID) + ret0, _ := ret[0].(databaseShard) + ret1, _ := ret[1].(namespace.Context) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// readableShardAt indicates an expected call of readableShardAt +func (mr *MockdatabaseNamespaceMockRecorder) readableShardAt(shardID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "readableShardAt", reflect.TypeOf((*MockdatabaseNamespace)(nil).readableShardAt), shardID) +} + // MockShard is a mock of Shard interface type MockShard struct { ctrl *gomock.Controller @@ -1691,7 +1727,7 @@ func (mr *MockdatabaseShardMockRecorder) BootstrapState() *gomock.Call { } // OnEvictedFromWiredList mocks base method -func (m *MockdatabaseShard) OnEvictedFromWiredList(id ident.ID, blockStart time.Time) { +func (m *MockdatabaseShard) OnEvictedFromWiredList(id ident.ID, blockStart time0.Time) { m.ctrl.T.Helper() m.ctrl.Call(m, "OnEvictedFromWiredList", id, blockStart) } @@ -1717,7 +1753,7 @@ func (mr *MockdatabaseShardMockRecorder) Close() *gomock.Call { } // Tick mocks base method -func (m *MockdatabaseShard) Tick(c context.Cancellable, startTime time.Time, nsCtx namespace.Context) (tickResult, error) { +func (m *MockdatabaseShard) Tick(c context.Cancellable, startTime time0.Time, nsCtx namespace.Context) (tickResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Tick", c, startTime, nsCtx) ret0, _ := ret[0].(tickResult) @@ -1732,7 +1768,7 @@ func (mr *MockdatabaseShardMockRecorder) Tick(c, startTime, nsCtx interface{}) * } // Write mocks base method -func (m *MockdatabaseShard) Write(ctx context.Context, id ident.ID, timestamp time.Time, value float64, unit time0.Unit, annotation []byte, wOpts series.WriteOptions) (SeriesWrite, error) { +func (m *MockdatabaseShard) Write(ctx context.Context, id ident.ID, timestamp time0.Time, value float64, unit time.Unit, annotation []byte, wOpts series.WriteOptions) (SeriesWrite, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Write", ctx, id, timestamp, value, unit, annotation, wOpts) ret0, _ := ret[0].(SeriesWrite) @@ -1747,7 +1783,7 @@ func (mr *MockdatabaseShardMockRecorder) Write(ctx, id, timestamp, value, unit, } // WriteTagged mocks base method -func (m *MockdatabaseShard) WriteTagged(ctx context.Context, id ident.ID, tags ident.TagIterator, timestamp time.Time, value float64, unit time0.Unit, annotation []byte, wOpts series.WriteOptions) (SeriesWrite, error) { +func (m *MockdatabaseShard) WriteTagged(ctx context.Context, id ident.ID, tags ident.TagIterator, timestamp time0.Time, value float64, unit time.Unit, annotation []byte, wOpts series.WriteOptions) (SeriesWrite, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WriteTagged", ctx, id, tags, timestamp, value, unit, annotation, wOpts) ret0, _ := ret[0].(SeriesWrite) @@ -1762,7 +1798,7 @@ func (mr *MockdatabaseShardMockRecorder) WriteTagged(ctx, id, tags, timestamp, v } // ReadEncoded mocks base method -func (m *MockdatabaseShard) ReadEncoded(ctx context.Context, id ident.ID, start, end time.Time, nsCtx namespace.Context) ([][]xio.BlockReader, error) { +func (m *MockdatabaseShard) ReadEncoded(ctx context.Context, id ident.ID, start, end time0.Time, nsCtx namespace.Context) ([][]xio.BlockReader, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ReadEncoded", ctx, id, start, end, nsCtx) ret0, _ := ret[0].([][]xio.BlockReader) @@ -1777,7 +1813,7 @@ func (mr *MockdatabaseShardMockRecorder) ReadEncoded(ctx, id, start, end, nsCtx } // FetchBlocks mocks base method -func (m *MockdatabaseShard) FetchBlocks(ctx context.Context, id ident.ID, starts []time.Time, nsCtx namespace.Context) ([]block.FetchBlockResult, error) { +func (m *MockdatabaseShard) FetchBlocks(ctx context.Context, id ident.ID, starts []time0.Time, nsCtx namespace.Context) ([]block.FetchBlockResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocks", ctx, id, starts, nsCtx) ret0, _ := ret[0].([]block.FetchBlockResult) @@ -1792,7 +1828,7 @@ func (mr *MockdatabaseShardMockRecorder) FetchBlocks(ctx, id, starts, nsCtx inte } // FetchBlocksForColdFlush mocks base method -func (m *MockdatabaseShard) FetchBlocksForColdFlush(ctx context.Context, seriesID ident.ID, start time.Time, version int, nsCtx namespace.Context) (block.FetchBlockResult, error) { +func (m *MockdatabaseShard) FetchBlocksForColdFlush(ctx context.Context, seriesID ident.ID, start time0.Time, version int, nsCtx namespace.Context) (block.FetchBlockResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocksForColdFlush", ctx, seriesID, start, version, nsCtx) ret0, _ := ret[0].(block.FetchBlockResult) @@ -1807,7 +1843,7 @@ func (mr *MockdatabaseShardMockRecorder) FetchBlocksForColdFlush(ctx, seriesID, } // FetchBlocksMetadataV2 mocks base method -func (m *MockdatabaseShard) FetchBlocksMetadataV2(ctx context.Context, start, end time.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { +func (m *MockdatabaseShard) FetchBlocksMetadataV2(ctx context.Context, start, end time0.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocksMetadataV2", ctx, start, end, limit, pageToken, opts) ret0, _ := ret[0].(block.FetchBlocksMetadataResults) @@ -1877,7 +1913,7 @@ func (mr *MockdatabaseShardMockRecorder) LoadBlocks(series interface{}) *gomock. } // WarmFlush mocks base method -func (m *MockdatabaseShard) WarmFlush(blockStart time.Time, flush persist.FlushPreparer, nsCtx namespace.Context) error { +func (m *MockdatabaseShard) WarmFlush(blockStart time0.Time, flush persist.FlushPreparer, nsCtx namespace.Context) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WarmFlush", blockStart, flush, nsCtx) ret0, _ := ret[0].(error) @@ -1906,7 +1942,7 @@ func (mr *MockdatabaseShardMockRecorder) ColdFlush(flush, resources, nsCtx, onFl } // Snapshot mocks base method -func (m *MockdatabaseShard) Snapshot(blockStart, snapshotStart time.Time, flush persist.SnapshotPreparer, nsCtx namespace.Context) error { +func (m *MockdatabaseShard) Snapshot(blockStart, snapshotStart time0.Time, flush persist.SnapshotPreparer, nsCtx namespace.Context) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Snapshot", blockStart, snapshotStart, flush, nsCtx) ret0, _ := ret[0].(error) @@ -1920,7 +1956,7 @@ func (mr *MockdatabaseShardMockRecorder) Snapshot(blockStart, snapshotStart, flu } // FlushState mocks base method -func (m *MockdatabaseShard) FlushState(blockStart time.Time) (fileOpState, error) { +func (m *MockdatabaseShard) FlushState(blockStart time0.Time) (fileOpState, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FlushState", blockStart) ret0, _ := ret[0].(fileOpState) @@ -1935,7 +1971,7 @@ func (mr *MockdatabaseShardMockRecorder) FlushState(blockStart interface{}) *gom } // CleanupExpiredFileSets mocks base method -func (m *MockdatabaseShard) CleanupExpiredFileSets(earliestToRetain time.Time) error { +func (m *MockdatabaseShard) CleanupExpiredFileSets(earliestToRetain time0.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CleanupExpiredFileSets", earliestToRetain) ret0, _ := ret[0].(error) @@ -1963,7 +1999,7 @@ func (mr *MockdatabaseShardMockRecorder) CleanupCompactedFileSets() *gomock.Call } // Repair mocks base method -func (m *MockdatabaseShard) Repair(ctx context.Context, nsCtx namespace.Context, nsMeta namespace.Metadata, tr time0.Range, repairer databaseShardRepairer) (repair.MetadataComparisonResult, error) { +func (m *MockdatabaseShard) Repair(ctx context.Context, nsCtx namespace.Context, nsMeta namespace.Metadata, tr time.Range, repairer databaseShardRepairer) (repair.MetadataComparisonResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Repair", ctx, nsCtx, nsMeta, tr, repairer) ret0, _ := ret[0].(repair.MetadataComparisonResult) @@ -2008,6 +2044,36 @@ func (mr *MockdatabaseShardMockRecorder) DocRef(id interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DocRef", reflect.TypeOf((*MockdatabaseShard)(nil).DocRef), id) } +// AggregateTiles mocks base method +func (m *MockdatabaseShard) AggregateTiles(reader fs.DataFileSetReader, sourceShard databaseShard, blockStart time0.Time, resources coldFlushReuseableResources, nsCtx namespace.Context, onFlush persist.OnFlushSeries) (ShardColdFlush, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AggregateTiles", reader, sourceShard, blockStart, resources, nsCtx, onFlush) + ret0, _ := ret[0].(ShardColdFlush) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AggregateTiles indicates an expected call of AggregateTiles +func (mr *MockdatabaseShardMockRecorder) AggregateTiles(reader, sourceShard, blockStart, resources, nsCtx, onFlush interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseShard)(nil).AggregateTiles), reader, sourceShard, blockStart, resources, nsCtx, onFlush) +} + +// latestVolume mocks base method +func (m *MockdatabaseShard) latestVolume(blockStart time0.Time) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "latestVolume", blockStart) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// latestVolume indicates an expected call of latestVolume +func (mr *MockdatabaseShardMockRecorder) latestVolume(blockStart interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "latestVolume", reflect.TypeOf((*MockdatabaseShard)(nil).latestVolume), blockStart) +} + // MockShardColdFlush is a mock of ShardColdFlush interface type MockShardColdFlush struct { ctrl *gomock.Controller @@ -2081,10 +2147,10 @@ func (mr *MockNamespaceIndexMockRecorder) AssignShardSet(shardSet interface{}) * } // BlockStartForWriteTime mocks base method -func (m *MockNamespaceIndex) BlockStartForWriteTime(writeTime time.Time) time0.UnixNano { +func (m *MockNamespaceIndex) BlockStartForWriteTime(writeTime time0.Time) time.UnixNano { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BlockStartForWriteTime", writeTime) - ret0, _ := ret[0].(time0.UnixNano) + ret0, _ := ret[0].(time.UnixNano) return ret0 } @@ -2095,7 +2161,7 @@ func (mr *MockNamespaceIndexMockRecorder) BlockStartForWriteTime(writeTime inter } // BlockForBlockStart mocks base method -func (m *MockNamespaceIndex) BlockForBlockStart(blockStart time.Time) (index.Block, error) { +func (m *MockNamespaceIndex) BlockForBlockStart(blockStart time0.Time) (index.Block, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BlockForBlockStart", blockStart) ret0, _ := ret[0].(index.Block) @@ -2196,7 +2262,7 @@ func (mr *MockNamespaceIndexMockRecorder) BootstrapsDone() *gomock.Call { } // CleanupExpiredFileSets mocks base method -func (m *MockNamespaceIndex) CleanupExpiredFileSets(t time.Time) error { +func (m *MockNamespaceIndex) CleanupExpiredFileSets(t time0.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CleanupExpiredFileSets", t) ret0, _ := ret[0].(error) @@ -2224,7 +2290,7 @@ func (mr *MockNamespaceIndexMockRecorder) CleanupDuplicateFileSets() *gomock.Cal } // Tick mocks base method -func (m *MockNamespaceIndex) Tick(c context.Cancellable, startTime time.Time) (namespaceIndexTickResult, error) { +func (m *MockNamespaceIndex) Tick(c context.Cancellable, startTime time0.Time) (namespaceIndexTickResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Tick", c, startTime) ret0, _ := ret[0].(namespaceIndexTickResult) @@ -2347,10 +2413,10 @@ func (mr *MocknamespaceIndexInsertQueueMockRecorder) Stop() *gomock.Call { } // InsertBatch mocks base method -func (m *MocknamespaceIndexInsertQueue) InsertBatch(batch *index.WriteBatch) (*sync.WaitGroup, error) { +func (m *MocknamespaceIndexInsertQueue) InsertBatch(batch *index.WriteBatch) (*sync0.WaitGroup, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "InsertBatch", batch) - ret0, _ := ret[0].(*sync.WaitGroup) + ret0, _ := ret[0].(*sync0.WaitGroup) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2362,10 +2428,10 @@ func (mr *MocknamespaceIndexInsertQueueMockRecorder) InsertBatch(batch interface } // InsertPending mocks base method -func (m *MocknamespaceIndexInsertQueue) InsertPending(pending []writes.PendingIndexInsert) (*sync.WaitGroup, error) { +func (m *MocknamespaceIndexInsertQueue) InsertPending(pending []writes.PendingIndexInsert) (*sync0.WaitGroup, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "InsertPending", pending) - ret0, _ := ret[0].(*sync.WaitGroup) + ret0, _ := ret[0].(*sync0.WaitGroup) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2414,10 +2480,10 @@ func (mr *MockdatabaseBootstrapManagerMockRecorder) IsBootstrapped() *gomock.Cal } // LastBootstrapCompletionTime mocks base method -func (m *MockdatabaseBootstrapManager) LastBootstrapCompletionTime() (time.Time, bool) { +func (m *MockdatabaseBootstrapManager) LastBootstrapCompletionTime() (time0.Time, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LastBootstrapCompletionTime") - ret0, _ := ret[0].(time.Time) + ret0, _ := ret[0].(time0.Time) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -2479,7 +2545,7 @@ func (m *MockdatabaseFlushManager) EXPECT() *MockdatabaseFlushManagerMockRecorde } // Flush mocks base method -func (m *MockdatabaseFlushManager) Flush(startTime time.Time) error { +func (m *MockdatabaseFlushManager) Flush(startTime time0.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Flush", startTime) ret0, _ := ret[0].(error) @@ -2493,10 +2559,10 @@ func (mr *MockdatabaseFlushManagerMockRecorder) Flush(startTime interface{}) *go } // LastSuccessfulSnapshotStartTime mocks base method -func (m *MockdatabaseFlushManager) LastSuccessfulSnapshotStartTime() (time.Time, bool) { +func (m *MockdatabaseFlushManager) LastSuccessfulSnapshotStartTime() (time0.Time, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LastSuccessfulSnapshotStartTime") - ret0, _ := ret[0].(time.Time) + ret0, _ := ret[0].(time0.Time) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -2543,7 +2609,7 @@ func (m *MockdatabaseCleanupManager) EXPECT() *MockdatabaseCleanupManagerMockRec } // Cleanup mocks base method -func (m *MockdatabaseCleanupManager) Cleanup(t time.Time, isBootstrapped bool) error { +func (m *MockdatabaseCleanupManager) Cleanup(t time0.Time, isBootstrapped bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Cleanup", t, isBootstrapped) ret0, _ := ret[0].(error) @@ -2592,7 +2658,7 @@ func (m *MockdatabaseFileSystemManager) EXPECT() *MockdatabaseFileSystemManagerM } // Cleanup mocks base method -func (m *MockdatabaseFileSystemManager) Cleanup(t time.Time, isBootstrapped bool) error { +func (m *MockdatabaseFileSystemManager) Cleanup(t time0.Time, isBootstrapped bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Cleanup", t, isBootstrapped) ret0, _ := ret[0].(error) @@ -2606,7 +2672,7 @@ func (mr *MockdatabaseFileSystemManagerMockRecorder) Cleanup(t, isBootstrapped i } // Flush mocks base method -func (m *MockdatabaseFileSystemManager) Flush(t time.Time) error { +func (m *MockdatabaseFileSystemManager) Flush(t time0.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Flush", t) ret0, _ := ret[0].(error) @@ -2662,7 +2728,7 @@ func (mr *MockdatabaseFileSystemManagerMockRecorder) Status() *gomock.Call { } // Run mocks base method -func (m *MockdatabaseFileSystemManager) Run(t time.Time, runType runType, forceType forceType) bool { +func (m *MockdatabaseFileSystemManager) Run(t time0.Time, runType runType, forceType forceType) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Run", t, runType, forceType) ret0, _ := ret[0].(bool) @@ -2688,10 +2754,10 @@ func (mr *MockdatabaseFileSystemManagerMockRecorder) Report() *gomock.Call { } // LastSuccessfulSnapshotStartTime mocks base method -func (m *MockdatabaseFileSystemManager) LastSuccessfulSnapshotStartTime() (time.Time, bool) { +func (m *MockdatabaseFileSystemManager) LastSuccessfulSnapshotStartTime() (time0.Time, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LastSuccessfulSnapshotStartTime") - ret0, _ := ret[0].(time.Time) + ret0, _ := ret[0].(time0.Time) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -2740,7 +2806,7 @@ func (mr *MockdatabaseShardRepairerMockRecorder) Options() *gomock.Call { } // Repair mocks base method -func (m *MockdatabaseShardRepairer) Repair(ctx context.Context, nsCtx namespace.Context, nsMeta namespace.Metadata, tr time0.Range, shard databaseShard) (repair.MetadataComparisonResult, error) { +func (m *MockdatabaseShardRepairer) Repair(ctx context.Context, nsCtx namespace.Context, nsMeta namespace.Metadata, tr time.Range, shard databaseShard) (repair.MetadataComparisonResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Repair", ctx, nsCtx, nsMeta, tr, shard) ret0, _ := ret[0].(repair.MetadataComparisonResult) @@ -2851,7 +2917,7 @@ func (m *MockdatabaseTickManager) EXPECT() *MockdatabaseTickManagerMockRecorder } // Tick mocks base method -func (m *MockdatabaseTickManager) Tick(forceType forceType, startTime time.Time) error { +func (m *MockdatabaseTickManager) Tick(forceType forceType, startTime time0.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Tick", forceType, startTime) ret0, _ := ret[0].(error) @@ -2916,10 +2982,10 @@ func (mr *MockdatabaseMediatorMockRecorder) IsBootstrapped() *gomock.Call { } // LastBootstrapCompletionTime mocks base method -func (m *MockdatabaseMediator) LastBootstrapCompletionTime() (time.Time, bool) { +func (m *MockdatabaseMediator) LastBootstrapCompletionTime() (time0.Time, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LastBootstrapCompletionTime") - ret0, _ := ret[0].(time.Time) + ret0, _ := ret[0].(time0.Time) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -2970,7 +3036,7 @@ func (mr *MockdatabaseMediatorMockRecorder) EnableFileOps() *gomock.Call { } // Tick mocks base method -func (m *MockdatabaseMediator) Tick(forceType forceType, startTime time.Time) error { +func (m *MockdatabaseMediator) Tick(forceType forceType, startTime time0.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Tick", forceType, startTime) ret0, _ := ret[0].(error) @@ -3036,10 +3102,10 @@ func (mr *MockdatabaseMediatorMockRecorder) Report() *gomock.Call { } // LastSuccessfulSnapshotStartTime mocks base method -func (m *MockdatabaseMediator) LastSuccessfulSnapshotStartTime() (time.Time, bool) { +func (m *MockdatabaseMediator) LastSuccessfulSnapshotStartTime() (time0.Time, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LastSuccessfulSnapshotStartTime") - ret0, _ := ret[0].(time.Time) + ret0, _ := ret[0].(time0.Time) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -3359,7 +3425,7 @@ func (mr *MockOptionsMockRecorder) RuntimeOptionsManager() *gomock.Call { } // SetErrorWindowForLoad mocks base method -func (m *MockOptions) SetErrorWindowForLoad(value time.Duration) Options { +func (m *MockOptions) SetErrorWindowForLoad(value time0.Duration) Options { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SetErrorWindowForLoad", value) ret0, _ := ret[0].(Options) @@ -3373,10 +3439,10 @@ func (mr *MockOptionsMockRecorder) SetErrorWindowForLoad(value interface{}) *gom } // ErrorWindowForLoad mocks base method -func (m *MockOptions) ErrorWindowForLoad() time.Duration { +func (m *MockOptions) ErrorWindowForLoad() time0.Duration { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ErrorWindowForLoad") - ret0, _ := ret[0].(time.Duration) + ret0, _ := ret[0].(time0.Duration) return ret0 } @@ -3975,7 +4041,7 @@ func (mr *MockOptionsMockRecorder) FetchBlocksMetadataResultsPool() *gomock.Call } // SetQueryIDsWorkerPool mocks base method -func (m *MockOptions) SetQueryIDsWorkerPool(value sync0.WorkerPool) Options { +func (m *MockOptions) SetQueryIDsWorkerPool(value sync.WorkerPool) Options { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SetQueryIDsWorkerPool", value) ret0, _ := ret[0].(Options) @@ -3989,10 +4055,10 @@ func (mr *MockOptionsMockRecorder) SetQueryIDsWorkerPool(value interface{}) *gom } // QueryIDsWorkerPool mocks base method -func (m *MockOptions) QueryIDsWorkerPool() sync0.WorkerPool { +func (m *MockOptions) QueryIDsWorkerPool() sync.WorkerPool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "QueryIDsWorkerPool") - ret0, _ := ret[0].(sync0.WorkerPool) + ret0, _ := ret[0].(sync.WorkerPool) return ret0 } From eeab8fdc5b3305638dec69182dbdc3114b9e9b55 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Wed, 15 Jul 2020 17:12:31 +0300 Subject: [PATCH 11/32] Unit tests --- .../tchannelthrift/node/service_test.go | 44 ++++++++++++ src/dbnode/storage/database.go | 2 +- src/dbnode/storage/database_test.go | 30 +++++++- src/dbnode/storage/namespace.go | 5 +- src/dbnode/storage/namespace_test.go | 69 +++++++++++++++++++ src/dbnode/storage/shard.go | 3 +- src/dbnode/storage/shard_test.go | 55 +++++++++++++-- src/dbnode/storage/storage_mock.go | 8 +-- src/dbnode/storage/types.go | 1 + 9 files changed, 200 insertions(+), 17 deletions(-) diff --git a/src/dbnode/network/server/tchannelthrift/node/service_test.go b/src/dbnode/network/server/tchannelthrift/node/service_test.go index 9e43ae2561..34dcbba1a0 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service_test.go +++ b/src/dbnode/network/server/tchannelthrift/node/service_test.go @@ -3017,3 +3017,47 @@ func TestServiceSetWriteNewSeriesLimitPerShardPerSecond(t *testing.T) { require.NoError(t, err) assert.Equal(t, int64(84), setResp.WriteNewSeriesLimitPerShardPerSecond) } + +func TestServiceAggregateTiles(t *testing.T) { + ctrl := xtest.NewController(t) + defer ctrl.Finish() + + mockDB := storage.NewMockDatabase(ctrl) + mockDB.EXPECT().Options().Return(testStorageOpts).AnyTimes() + mockDB.EXPECT().IsOverloaded().Return(false) + + service := NewService(mockDB, testTChannelThriftOptions).(*service) + + tctx, _ := tchannelthrift.NewContext(time.Minute) + ctx := tchannelthrift.Context(tctx) + defer ctx.Close() + + start := time.Now().Add(-2 * time.Hour) + end := start.Add(2 * time.Hour) + + start, end = start.Truncate(time.Second), end.Truncate(time.Second) + + step := "2h" + + sourceNsID := "source" + targetNsID := "target" + + mockDB.EXPECT().AggregateTiles( + ctx, + ident.NewIDMatcher(sourceNsID), + ident.NewIDMatcher(targetNsID), + start, + end, + ).Return(nil) + + _, err := service.AggregateTiles(tctx, &rpc.AggregateTilesRequest{ + SourceNameSpace: sourceNsID, + TargetNameSpace: targetNsID, + RangeStart: start.Unix(), + RangeEnd: end.Unix(), + Step: step, + RemoveResets: true, + RangeType: rpc.TimeType_UNIX_SECONDS, + }) + require.NoError(t, err) +} diff --git a/src/dbnode/storage/database.go b/src/dbnode/storage/database.go index ee5ddc45bf..783ca3c5f8 100644 --- a/src/dbnode/storage/database.go +++ b/src/dbnode/storage/database.go @@ -1085,7 +1085,7 @@ func (d *db) AggregateTiles( return err } - targetNs, err := d.namespaceFor(sourceNsID) + targetNs, err := d.namespaceFor(targetNsID) if err != nil { d.metrics.unknownNamespaceRead.Inc(1) return err diff --git a/src/dbnode/storage/database_test.go b/src/dbnode/storage/database_test.go index 46527674d7..8729858914 100644 --- a/src/dbnode/storage/database_test.go +++ b/src/dbnode/storage/database_test.go @@ -57,7 +57,7 @@ import ( "github.com/fortytw2/leaktest" "github.com/golang/mock/gomock" "github.com/m3db/m3/src/dbnode/testdata/prototest" - opentracing "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go" "github.com/opentracing/opentracing-go/mocktracer" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -68,9 +68,9 @@ var ( defaultTestNs1ID = ident.StringID("testns1") defaultTestNs2ID = ident.StringID("testns2") defaultTestRetentionOpts = retention.NewOptions().SetBufferFuture(10 * time.Minute).SetBufferPast(10 * time.Minute). - SetBlockSize(2 * time.Hour).SetRetentionPeriod(2 * 24 * time.Hour) + SetBlockSize(2 * time.Hour).SetRetentionPeriod(2 * 24 * time.Hour) defaultTestNs2RetentionOpts = retention.NewOptions().SetBufferFuture(10 * time.Minute).SetBufferPast(10 * time.Minute). - SetBlockSize(4 * time.Hour).SetRetentionPeriod(2 * 24 * time.Hour) + SetBlockSize(4 * time.Hour).SetRetentionPeriod(2 * 24 * time.Hour) defaultTestNs1Opts = namespace.NewOptions().SetRetentionOptions(defaultTestRetentionOpts) defaultTestNs2Opts = namespace.NewOptions().SetRetentionOptions(defaultTestNs2RetentionOpts) testSchemaHistory = prototest.NewSchemaHistory() @@ -1287,3 +1287,27 @@ func TestDatabaseIsOverloaded(t *testing.T) { mockCL.EXPECT().QueueLength().Return(int64(90)) require.Equal(t, true, d.IsOverloaded()) } + +func TestDatabaseAggregateTiles(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + d, mapCh, _ := defaultTestDatabase(t, ctrl, Bootstrapped) + defer func() { + close(mapCh) + }() + + var ( + sourceNsID = ident.StringID("source") + targetNsID = ident.StringID("target") + ctx = context.NewContext() + end = time.Now().Truncate(time.Hour) + start = end.Add(-time.Hour) + ) + + sourceNs := dbAddNewMockNamespace(ctrl, d, sourceNsID.String()) + targetNs := dbAddNewMockNamespace(ctrl, d, targetNsID.String()) + targetNs.EXPECT().AggregateTiles(sourceNs, start, end).Return(nil) + + require.NoError(t, d.AggregateTiles(ctx, sourceNsID, targetNsID, start, end)) +} diff --git a/src/dbnode/storage/namespace.go b/src/dbnode/storage/namespace.go index 325f0f3238..1ac5b6ddc3 100644 --- a/src/dbnode/storage/namespace.go +++ b/src/dbnode/storage/namespace.go @@ -1600,7 +1600,8 @@ func (n *dbNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time targetShards := n.OwnedShards() n.RUnlock() - reader, err := fs.NewReader(n.opts.BytesPool(), n.opts.CommitLogOptions().FilesystemOptions()) + sourceNsOpts := sourceNs.StorageOptions() + reader, err := fs.NewReader(sourceNsOpts.BytesPool(), sourceNsOpts.CommitLogOptions().FilesystemOptions()) if err != nil { return err } @@ -1641,7 +1642,7 @@ func (n *dbNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time multiErr = multiErr.Add(detailedErr) continue } - shardColdFlush, err := targetShard.AggregateTiles(reader, sourceShard, start, resources, nsCtx, onColdFlushNs) + shardColdFlush, err := targetShard.AggregateTiles(reader, sourceNs.ID(), sourceShard, start, resources, nsCtx, onColdFlushNs) if err != nil { detailedErr := fmt.Errorf("shard %d failed to compact: %v", targetShard.ID(), err) multiErr = multiErr.Add(detailedErr) diff --git a/src/dbnode/storage/namespace_test.go b/src/dbnode/storage/namespace_test.go index 6f6018d0ef..7c042b882b 100644 --- a/src/dbnode/storage/namespace_test.go +++ b/src/dbnode/storage/namespace_test.go @@ -1277,6 +1277,75 @@ func TestNamespaceFlushState(t *testing.T) { require.Equal(t, expectedFlushState, flushState) } +func TestNamespaceAggregateTilesFailOnBootstrapping(t *testing.T) { + var ( + sourceNsID = ident.StringID("source") + targetNsID = ident.StringID("target") + end = time.Now().Truncate(time.Hour) + start = end.Add(-time.Hour) + ) + + sourceNs, sourceCloser := newTestNamespaceWithIDOpts(t, sourceNsID, namespace.NewOptions()) + defer sourceCloser() + + targetNs, targetCloser := newTestNamespaceWithIDOpts(t, targetNsID, namespace.NewOptions()) + defer targetCloser() + targetNs.bootstrapState = Bootstrapping + + require.Equal(t, errNamespaceNotBootstrapped, targetNs.AggregateTiles(sourceNs, start, end)) +} + +func TestNamespaceAggregateTiles(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + var ( + sourceNsID = ident.StringID("source") + targetNsID = ident.StringID("target") + end = time.Now().Truncate(time.Hour) + start = end.Add(-time.Hour) + ) + + sourceNs, sourceCloser := newTestNamespaceWithIDOpts(t, sourceNsID, namespace.NewOptions()) + defer sourceCloser() + + targetNs, targetCloser := newTestNamespaceWithIDOpts(t, targetNsID, namespace.NewOptions()) + defer targetCloser() + targetNs.bootstrapState = Bootstrapped + + nsCtx := targetNs.nsContextWithRLock() + + onColdFlushNs, err := targetNs.opts.OnColdFlush().ColdFlushNamespace(targetNs) + require.NoError(t, err) + + sourceShard0 := NewMockdatabaseShard(ctrl) + sourceShard1 := NewMockdatabaseShard(ctrl) + sourceNs.shards[0] = sourceShard0 + sourceNs.shards[1] = sourceShard1 + + sourceShard0.EXPECT().IsBootstrapped().Return(true) + sourceShard1.EXPECT().IsBootstrapped().Return(true) + + targetShard0 := NewMockdatabaseShard(ctrl) + targetShard1 := NewMockdatabaseShard(ctrl) + targetNs.shards[0] = targetShard0 + targetNs.shards[1] = targetShard1 + + targetShard0.EXPECT().ID().Return(uint32(0)) + targetShard1.EXPECT().ID().Return(uint32(1)) + + shardColdFlush1 := NewMockShardColdFlush(ctrl) + shardColdFlush1.EXPECT().Done().Return(nil) + shardColdFlush2 := NewMockShardColdFlush(ctrl) + shardColdFlush2.EXPECT().Done().Return(nil) + + sourceNsIDMatcher := ident.NewIDMatcher(sourceNsID.String()) + targetShard0.EXPECT().AggregateTiles(gomock.Any(), sourceNsIDMatcher, sourceShard0, start, gomock.Any(), nsCtx, onColdFlushNs).Return(shardColdFlush1, nil) + targetShard1.EXPECT().AggregateTiles(gomock.Any(), sourceNsIDMatcher, sourceShard1, start, gomock.Any(), nsCtx, onColdFlushNs).Return(shardColdFlush2, nil) + + require.NoError(t, targetNs.AggregateTiles(sourceNs, start, end)) +} + func waitForStats( reporter xmetrics.TestStatsReporter, check func(xmetrics.TestStatsReporter) bool, diff --git a/src/dbnode/storage/shard.go b/src/dbnode/storage/shard.go index c33b8d9aa3..be7bed9105 100644 --- a/src/dbnode/storage/shard.go +++ b/src/dbnode/storage/shard.go @@ -2543,6 +2543,7 @@ func (s *dbShard) Repair( func (s *dbShard) AggregateTiles( reader fs.DataFileSetReader, + sourceNsID ident.ID, sourceShard databaseShard, blockStart time.Time, resources coldFlushReuseableResources, @@ -2556,7 +2557,7 @@ func (s *dbShard) AggregateTiles( openOpts := fs.DataReaderOpenOptions{ Identifier: fs.FileSetFileIdentifier{ - Namespace: s.namespace.ID(), + Namespace: sourceNsID, Shard: sourceShard.ID(), BlockStart: blockStart, VolumeIndex: latestSourceVolume, diff --git a/src/dbnode/storage/shard_test.go b/src/dbnode/storage/shard_test.go index 3b15b7e4b0..0f3b1e0740 100644 --- a/src/dbnode/storage/shard_test.go +++ b/src/dbnode/storage/shard_test.go @@ -23,6 +23,7 @@ package storage import ( "errors" "fmt" + "io" "io/ioutil" "os" "strconv" @@ -188,8 +189,8 @@ func TestShardBootstrapWithFlushVersion(t *testing.T) { fsOpts = opts.CommitLogOptions().FilesystemOptions(). SetFilePathPrefix(dir) newClOpts = opts. - CommitLogOptions(). - SetFilesystemOptions(fsOpts) + CommitLogOptions(). + SetFilesystemOptions(fsOpts) ) opts = opts. SetCommitLogOptions(newClOpts) @@ -264,8 +265,8 @@ func TestShardBootstrapWithFlushVersionNoCleanUp(t *testing.T) { fsOpts = opts.CommitLogOptions().FilesystemOptions(). SetFilePathPrefix(dir) newClOpts = opts. - CommitLogOptions(). - SetFilesystemOptions(fsOpts) + CommitLogOptions(). + SetFilesystemOptions(fsOpts) ) opts = opts. SetCommitLogOptions(newClOpts) @@ -321,8 +322,8 @@ func TestShardBootstrapWithCacheShardIndices(t *testing.T) { fsOpts = opts.CommitLogOptions().FilesystemOptions(). SetFilePathPrefix(dir) newClOpts = opts. - CommitLogOptions(). - SetFilesystemOptions(fsOpts) + CommitLogOptions(). + SetFilesystemOptions(fsOpts) mockRetriever = block.NewMockDatabaseBlockRetriever(ctrl) ) opts = opts.SetCommitLogOptions(newClOpts) @@ -1738,3 +1739,45 @@ func TestShardIterateBatchSize(t *testing.T) { require.True(t, shardIterateBatchMinSize < iterateBatchSize(2000)) } + +func TestAggregateTiles(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + var ( + blockStart = time.Now().Truncate(time.Hour) + ) + + sourceShard := testDatabaseShard(t, DefaultTestOptions()) + defer sourceShard.Close() + + targetShard := testDatabaseShard(t, DefaultTestOptions()) + defer targetShard.Close() + + targetShard.bootstrapState = Bootstrapped + + latestSourceVolume, err := sourceShard.latestVolume(blockStart) + require.NoError(t, err) + + sourceNsID := sourceShard.namespace.ID() + readerOpenOpts := fs.DataReaderOpenOptions{ + Identifier: fs.FileSetFileIdentifier{ + Namespace: sourceNsID, + Shard: sourceShard.ID(), + BlockStart: blockStart, + VolumeIndex: latestSourceVolume, + }, + FileSetType: persist.FileSetFlushType, + } + + reader := fs.NewMockDataFileSetReader(ctrl) + reader.EXPECT().Open(readerOpenOpts).Return(nil) + reader.EXPECT().Read(). + Return(ident.StringID("id1"), ident.EmptyTagIterator, checked.NewMockBytes(ctrl), uint32(11), nil). + Return(nil, nil, nil, uint32(0), io.EOF) + reader.EXPECT().Close() + + _, err = targetShard.AggregateTiles( + reader, sourceNsID, sourceShard, blockStart, coldFlushReuseableResources{}, namespace.Context{}, &persist.NoOpColdFlushNamespace{}) + require.NoError(t, err) +} diff --git a/src/dbnode/storage/storage_mock.go b/src/dbnode/storage/storage_mock.go index 5232ad6a57..d65e74ee55 100644 --- a/src/dbnode/storage/storage_mock.go +++ b/src/dbnode/storage/storage_mock.go @@ -2045,18 +2045,18 @@ func (mr *MockdatabaseShardMockRecorder) DocRef(id interface{}) *gomock.Call { } // AggregateTiles mocks base method -func (m *MockdatabaseShard) AggregateTiles(reader fs.DataFileSetReader, sourceShard databaseShard, blockStart time0.Time, resources coldFlushReuseableResources, nsCtx namespace.Context, onFlush persist.OnFlushSeries) (ShardColdFlush, error) { +func (m *MockdatabaseShard) AggregateTiles(reader fs.DataFileSetReader, sourceNsID ident.ID, sourceShard databaseShard, blockStart time0.Time, resources coldFlushReuseableResources, nsCtx namespace.Context, onFlush persist.OnFlushSeries) (ShardColdFlush, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AggregateTiles", reader, sourceShard, blockStart, resources, nsCtx, onFlush) + ret := m.ctrl.Call(m, "AggregateTiles", reader, sourceNsID, sourceShard, blockStart, resources, nsCtx, onFlush) ret0, _ := ret[0].(ShardColdFlush) ret1, _ := ret[1].(error) return ret0, ret1 } // AggregateTiles indicates an expected call of AggregateTiles -func (mr *MockdatabaseShardMockRecorder) AggregateTiles(reader, sourceShard, blockStart, resources, nsCtx, onFlush interface{}) *gomock.Call { +func (mr *MockdatabaseShardMockRecorder) AggregateTiles(reader, sourceNsID, sourceShard, blockStart, resources, nsCtx, onFlush interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseShard)(nil).AggregateTiles), reader, sourceShard, blockStart, resources, nsCtx, onFlush) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseShard)(nil).AggregateTiles), reader, sourceNsID, sourceShard, blockStart, resources, nsCtx, onFlush) } // latestVolume mocks base method diff --git a/src/dbnode/storage/types.go b/src/dbnode/storage/types.go index aa1e67418f..9a692baa36 100644 --- a/src/dbnode/storage/types.go +++ b/src/dbnode/storage/types.go @@ -593,6 +593,7 @@ type databaseShard interface { // AggregateTiles does large tile aggregation from source shards into this shard. AggregateTiles( reader fs.DataFileSetReader, + sourceNsID ident.ID, sourceShard databaseShard, blockStart time.Time, resources coldFlushReuseableResources, From 9a6dbc07760d808fa077d7104877a2a8f08ca501 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Thu, 16 Jul 2020 10:34:14 +0300 Subject: [PATCH 12/32] Mockgen --- src/dbnode/storage/storage_mock.go | 230 ++++++++++++++++------------- 1 file changed, 126 insertions(+), 104 deletions(-) diff --git a/src/dbnode/storage/storage_mock.go b/src/dbnode/storage/storage_mock.go index d65e74ee55..f7f3147252 100644 --- a/src/dbnode/storage/storage_mock.go +++ b/src/dbnode/storage/storage_mock.go @@ -1,39 +1,61 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: /Users/linas/go/src/github.com/m3db/m3/src/dbnode/storage/types.go +// Source: github.com/m3db/m3/src/dbnode/storage/types.go + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // Package storage is a generated GoMock package. package storage import ( - gomock "github.com/golang/mock/gomock" - clock "github.com/m3db/m3/src/dbnode/clock" - encoding "github.com/m3db/m3/src/dbnode/encoding" - namespace "github.com/m3db/m3/src/dbnode/namespace" - persist "github.com/m3db/m3/src/dbnode/persist" - fs "github.com/m3db/m3/src/dbnode/persist/fs" - commitlog "github.com/m3db/m3/src/dbnode/persist/fs/commitlog" - runtime "github.com/m3db/m3/src/dbnode/runtime" - sharding "github.com/m3db/m3/src/dbnode/sharding" - block "github.com/m3db/m3/src/dbnode/storage/block" - bootstrap "github.com/m3db/m3/src/dbnode/storage/bootstrap" - result "github.com/m3db/m3/src/dbnode/storage/bootstrap/result" - index "github.com/m3db/m3/src/dbnode/storage/index" - repair "github.com/m3db/m3/src/dbnode/storage/repair" - series "github.com/m3db/m3/src/dbnode/storage/series" - writes "github.com/m3db/m3/src/dbnode/ts/writes" - xio "github.com/m3db/m3/src/dbnode/x/xio" - xpool "github.com/m3db/m3/src/dbnode/x/xpool" - doc "github.com/m3db/m3/src/m3ninx/doc" - context "github.com/m3db/m3/src/x/context" - ident "github.com/m3db/m3/src/x/ident" - instrument "github.com/m3db/m3/src/x/instrument" - mmap "github.com/m3db/m3/src/x/mmap" - pool "github.com/m3db/m3/src/x/pool" - sync "github.com/m3db/m3/src/x/sync" - time "github.com/m3db/m3/src/x/time" - reflect "reflect" - sync0 "sync" - time0 "time" + "reflect" + "sync" + "time" + + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/persist" + "github.com/m3db/m3/src/dbnode/persist/fs" + "github.com/m3db/m3/src/dbnode/persist/fs/commitlog" + "github.com/m3db/m3/src/dbnode/runtime" + "github.com/m3db/m3/src/dbnode/sharding" + "github.com/m3db/m3/src/dbnode/storage/block" + "github.com/m3db/m3/src/dbnode/storage/bootstrap" + "github.com/m3db/m3/src/dbnode/storage/bootstrap/result" + "github.com/m3db/m3/src/dbnode/storage/index" + "github.com/m3db/m3/src/dbnode/storage/repair" + "github.com/m3db/m3/src/dbnode/storage/series" + "github.com/m3db/m3/src/dbnode/ts/writes" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/dbnode/x/xpool" + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/mmap" + "github.com/m3db/m3/src/x/pool" + sync0 "github.com/m3db/m3/src/x/sync" + time0 "github.com/m3db/m3/src/x/time" + + "github.com/golang/mock/gomock" ) // MockIndexedErrorHandler is a mock of IndexedErrorHandler interface @@ -206,7 +228,7 @@ func (mr *MockDatabaseMockRecorder) Terminate() *gomock.Call { } // Write mocks base method -func (m *MockDatabase) Write(ctx context.Context, namespace, id ident.ID, timestamp time0.Time, value float64, unit time.Unit, annotation []byte) error { +func (m *MockDatabase) Write(ctx context.Context, namespace, id ident.ID, timestamp time.Time, value float64, unit time0.Unit, annotation []byte) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Write", ctx, namespace, id, timestamp, value, unit, annotation) ret0, _ := ret[0].(error) @@ -220,7 +242,7 @@ func (mr *MockDatabaseMockRecorder) Write(ctx, namespace, id, timestamp, value, } // WriteTagged mocks base method -func (m *MockDatabase) WriteTagged(ctx context.Context, namespace, id ident.ID, tags ident.TagIterator, timestamp time0.Time, value float64, unit time.Unit, annotation []byte) error { +func (m *MockDatabase) WriteTagged(ctx context.Context, namespace, id ident.ID, tags ident.TagIterator, timestamp time.Time, value float64, unit time0.Unit, annotation []byte) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WriteTagged", ctx, namespace, id, tags, timestamp, value, unit, annotation) ret0, _ := ret[0].(error) @@ -307,7 +329,7 @@ func (mr *MockDatabaseMockRecorder) AggregateQuery(ctx, namespace, query, opts i } // ReadEncoded mocks base method -func (m *MockDatabase) ReadEncoded(ctx context.Context, namespace, id ident.ID, start, end time0.Time) ([][]xio.BlockReader, error) { +func (m *MockDatabase) ReadEncoded(ctx context.Context, namespace, id ident.ID, start, end time.Time) ([][]xio.BlockReader, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ReadEncoded", ctx, namespace, id, start, end) ret0, _ := ret[0].([][]xio.BlockReader) @@ -322,7 +344,7 @@ func (mr *MockDatabaseMockRecorder) ReadEncoded(ctx, namespace, id, start, end i } // FetchBlocks mocks base method -func (m *MockDatabase) FetchBlocks(ctx context.Context, namespace ident.ID, shard uint32, id ident.ID, starts []time0.Time) ([]block.FetchBlockResult, error) { +func (m *MockDatabase) FetchBlocks(ctx context.Context, namespace ident.ID, shard uint32, id ident.ID, starts []time.Time) ([]block.FetchBlockResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocks", ctx, namespace, shard, id, starts) ret0, _ := ret[0].([]block.FetchBlockResult) @@ -337,7 +359,7 @@ func (mr *MockDatabaseMockRecorder) FetchBlocks(ctx, namespace, shard, id, start } // FetchBlocksMetadataV2 mocks base method -func (m *MockDatabase) FetchBlocksMetadataV2(ctx context.Context, namespace ident.ID, shard uint32, start, end time0.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { +func (m *MockDatabase) FetchBlocksMetadataV2(ctx context.Context, namespace ident.ID, shard uint32, start, end time.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocksMetadataV2", ctx, namespace, shard, start, end, limit, pageToken, opts) ret0, _ := ret[0].(block.FetchBlocksMetadataResults) @@ -452,7 +474,7 @@ func (mr *MockDatabaseMockRecorder) BootstrapState() *gomock.Call { } // FlushState mocks base method -func (m *MockDatabase) FlushState(namespace ident.ID, shardID uint32, blockStart time0.Time) (fileOpState, error) { +func (m *MockDatabase) FlushState(namespace ident.ID, shardID uint32, blockStart time.Time) (fileOpState, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FlushState", namespace, shardID, blockStart) ret0, _ := ret[0].(fileOpState) @@ -467,7 +489,7 @@ func (mr *MockDatabaseMockRecorder) FlushState(namespace, shardID, blockStart in } // AggregateTiles mocks base method -func (m *MockDatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time0.Time) error { +func (m *MockDatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNsID, targetNsID, start, end) ret0, _ := ret[0].(error) @@ -615,7 +637,7 @@ func (mr *MockdatabaseMockRecorder) Terminate() *gomock.Call { } // Write mocks base method -func (m *Mockdatabase) Write(ctx context.Context, namespace, id ident.ID, timestamp time0.Time, value float64, unit time.Unit, annotation []byte) error { +func (m *Mockdatabase) Write(ctx context.Context, namespace, id ident.ID, timestamp time.Time, value float64, unit time0.Unit, annotation []byte) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Write", ctx, namespace, id, timestamp, value, unit, annotation) ret0, _ := ret[0].(error) @@ -629,7 +651,7 @@ func (mr *MockdatabaseMockRecorder) Write(ctx, namespace, id, timestamp, value, } // WriteTagged mocks base method -func (m *Mockdatabase) WriteTagged(ctx context.Context, namespace, id ident.ID, tags ident.TagIterator, timestamp time0.Time, value float64, unit time.Unit, annotation []byte) error { +func (m *Mockdatabase) WriteTagged(ctx context.Context, namespace, id ident.ID, tags ident.TagIterator, timestamp time.Time, value float64, unit time0.Unit, annotation []byte) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WriteTagged", ctx, namespace, id, tags, timestamp, value, unit, annotation) ret0, _ := ret[0].(error) @@ -716,7 +738,7 @@ func (mr *MockdatabaseMockRecorder) AggregateQuery(ctx, namespace, query, opts i } // ReadEncoded mocks base method -func (m *Mockdatabase) ReadEncoded(ctx context.Context, namespace, id ident.ID, start, end time0.Time) ([][]xio.BlockReader, error) { +func (m *Mockdatabase) ReadEncoded(ctx context.Context, namespace, id ident.ID, start, end time.Time) ([][]xio.BlockReader, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ReadEncoded", ctx, namespace, id, start, end) ret0, _ := ret[0].([][]xio.BlockReader) @@ -731,7 +753,7 @@ func (mr *MockdatabaseMockRecorder) ReadEncoded(ctx, namespace, id, start, end i } // FetchBlocks mocks base method -func (m *Mockdatabase) FetchBlocks(ctx context.Context, namespace ident.ID, shard uint32, id ident.ID, starts []time0.Time) ([]block.FetchBlockResult, error) { +func (m *Mockdatabase) FetchBlocks(ctx context.Context, namespace ident.ID, shard uint32, id ident.ID, starts []time.Time) ([]block.FetchBlockResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocks", ctx, namespace, shard, id, starts) ret0, _ := ret[0].([]block.FetchBlockResult) @@ -746,7 +768,7 @@ func (mr *MockdatabaseMockRecorder) FetchBlocks(ctx, namespace, shard, id, start } // FetchBlocksMetadataV2 mocks base method -func (m *Mockdatabase) FetchBlocksMetadataV2(ctx context.Context, namespace ident.ID, shard uint32, start, end time0.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { +func (m *Mockdatabase) FetchBlocksMetadataV2(ctx context.Context, namespace ident.ID, shard uint32, start, end time.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocksMetadataV2", ctx, namespace, shard, start, end, limit, pageToken, opts) ret0, _ := ret[0].(block.FetchBlocksMetadataResults) @@ -861,7 +883,7 @@ func (mr *MockdatabaseMockRecorder) BootstrapState() *gomock.Call { } // FlushState mocks base method -func (m *Mockdatabase) FlushState(namespace ident.ID, shardID uint32, blockStart time0.Time) (fileOpState, error) { +func (m *Mockdatabase) FlushState(namespace ident.ID, shardID uint32, blockStart time.Time) (fileOpState, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FlushState", namespace, shardID, blockStart) ret0, _ := ret[0].(fileOpState) @@ -876,7 +898,7 @@ func (mr *MockdatabaseMockRecorder) FlushState(namespace, shardID, blockStart in } // AggregateTiles mocks base method -func (m *Mockdatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time0.Time) error { +func (m *Mockdatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNsID, targetNsID, start, end) ret0, _ := ret[0].(error) @@ -1231,7 +1253,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) OwnedShards() *gomock.Call { } // Tick mocks base method -func (m *MockdatabaseNamespace) Tick(c context.Cancellable, startTime time0.Time) error { +func (m *MockdatabaseNamespace) Tick(c context.Cancellable, startTime time.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Tick", c, startTime) ret0, _ := ret[0].(error) @@ -1245,7 +1267,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) Tick(c, startTime interface{}) *gom } // Write mocks base method -func (m *MockdatabaseNamespace) Write(ctx context.Context, id ident.ID, timestamp time0.Time, value float64, unit time.Unit, annotation []byte) (SeriesWrite, error) { +func (m *MockdatabaseNamespace) Write(ctx context.Context, id ident.ID, timestamp time.Time, value float64, unit time0.Unit, annotation []byte) (SeriesWrite, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Write", ctx, id, timestamp, value, unit, annotation) ret0, _ := ret[0].(SeriesWrite) @@ -1260,7 +1282,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) Write(ctx, id, timestamp, value, un } // WriteTagged mocks base method -func (m *MockdatabaseNamespace) WriteTagged(ctx context.Context, id ident.ID, tags ident.TagIterator, timestamp time0.Time, value float64, unit time.Unit, annotation []byte) (SeriesWrite, error) { +func (m *MockdatabaseNamespace) WriteTagged(ctx context.Context, id ident.ID, tags ident.TagIterator, timestamp time.Time, value float64, unit time0.Unit, annotation []byte) (SeriesWrite, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WriteTagged", ctx, id, tags, timestamp, value, unit, annotation) ret0, _ := ret[0].(SeriesWrite) @@ -1305,7 +1327,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) AggregateQuery(ctx, query, opts int } // ReadEncoded mocks base method -func (m *MockdatabaseNamespace) ReadEncoded(ctx context.Context, id ident.ID, start, end time0.Time) ([][]xio.BlockReader, error) { +func (m *MockdatabaseNamespace) ReadEncoded(ctx context.Context, id ident.ID, start, end time.Time) ([][]xio.BlockReader, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ReadEncoded", ctx, id, start, end) ret0, _ := ret[0].([][]xio.BlockReader) @@ -1320,7 +1342,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) ReadEncoded(ctx, id, start, end int } // FetchBlocks mocks base method -func (m *MockdatabaseNamespace) FetchBlocks(ctx context.Context, shardID uint32, id ident.ID, starts []time0.Time) ([]block.FetchBlockResult, error) { +func (m *MockdatabaseNamespace) FetchBlocks(ctx context.Context, shardID uint32, id ident.ID, starts []time.Time) ([]block.FetchBlockResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocks", ctx, shardID, id, starts) ret0, _ := ret[0].([]block.FetchBlockResult) @@ -1335,7 +1357,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) FetchBlocks(ctx, shardID, id, start } // FetchBlocksMetadataV2 mocks base method -func (m *MockdatabaseNamespace) FetchBlocksMetadataV2(ctx context.Context, shardID uint32, start, end time0.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { +func (m *MockdatabaseNamespace) FetchBlocksMetadataV2(ctx context.Context, shardID uint32, start, end time.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocksMetadataV2", ctx, shardID, start, end, limit, pageToken, opts) ret0, _ := ret[0].(block.FetchBlocksMetadataResults) @@ -1380,7 +1402,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) Bootstrap(ctx, bootstrapResult inte } // WarmFlush mocks base method -func (m *MockdatabaseNamespace) WarmFlush(blockStart time0.Time, flush persist.FlushPreparer) error { +func (m *MockdatabaseNamespace) WarmFlush(blockStart time.Time, flush persist.FlushPreparer) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WarmFlush", blockStart, flush) ret0, _ := ret[0].(error) @@ -1422,7 +1444,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) ColdFlush(flush interface{}) *gomoc } // Snapshot mocks base method -func (m *MockdatabaseNamespace) Snapshot(blockStart, snapshotTime time0.Time, flush persist.SnapshotPreparer) error { +func (m *MockdatabaseNamespace) Snapshot(blockStart, snapshotTime time.Time, flush persist.SnapshotPreparer) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Snapshot", blockStart, snapshotTime, flush) ret0, _ := ret[0].(error) @@ -1436,7 +1458,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) Snapshot(blockStart, snapshotTime, } // NeedsFlush mocks base method -func (m *MockdatabaseNamespace) NeedsFlush(alignedInclusiveStart, alignedInclusiveEnd time0.Time) (bool, error) { +func (m *MockdatabaseNamespace) NeedsFlush(alignedInclusiveStart, alignedInclusiveEnd time.Time) (bool, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NeedsFlush", alignedInclusiveStart, alignedInclusiveEnd) ret0, _ := ret[0].(bool) @@ -1466,7 +1488,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) Truncate() *gomock.Call { } // Repair mocks base method -func (m *MockdatabaseNamespace) Repair(repairer databaseShardRepairer, tr time.Range) error { +func (m *MockdatabaseNamespace) Repair(repairer databaseShardRepairer, tr time0.Range) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Repair", repairer, tr) ret0, _ := ret[0].(error) @@ -1494,7 +1516,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) BootstrapState() *gomock.Call { } // FlushState mocks base method -func (m *MockdatabaseNamespace) FlushState(shardID uint32, blockStart time0.Time) (fileOpState, error) { +func (m *MockdatabaseNamespace) FlushState(shardID uint32, blockStart time.Time) (fileOpState, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FlushState", shardID, blockStart) ret0, _ := ret[0].(fileOpState) @@ -1539,7 +1561,7 @@ func (mr *MockdatabaseNamespaceMockRecorder) WritePendingIndexInserts(pending in } // AggregateTiles mocks base method -func (m *MockdatabaseNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time0.Time) error { +func (m *MockdatabaseNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AggregateTiles", sourceNs, start, end) ret0, _ := ret[0].(error) @@ -1727,7 +1749,7 @@ func (mr *MockdatabaseShardMockRecorder) BootstrapState() *gomock.Call { } // OnEvictedFromWiredList mocks base method -func (m *MockdatabaseShard) OnEvictedFromWiredList(id ident.ID, blockStart time0.Time) { +func (m *MockdatabaseShard) OnEvictedFromWiredList(id ident.ID, blockStart time.Time) { m.ctrl.T.Helper() m.ctrl.Call(m, "OnEvictedFromWiredList", id, blockStart) } @@ -1753,7 +1775,7 @@ func (mr *MockdatabaseShardMockRecorder) Close() *gomock.Call { } // Tick mocks base method -func (m *MockdatabaseShard) Tick(c context.Cancellable, startTime time0.Time, nsCtx namespace.Context) (tickResult, error) { +func (m *MockdatabaseShard) Tick(c context.Cancellable, startTime time.Time, nsCtx namespace.Context) (tickResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Tick", c, startTime, nsCtx) ret0, _ := ret[0].(tickResult) @@ -1768,7 +1790,7 @@ func (mr *MockdatabaseShardMockRecorder) Tick(c, startTime, nsCtx interface{}) * } // Write mocks base method -func (m *MockdatabaseShard) Write(ctx context.Context, id ident.ID, timestamp time0.Time, value float64, unit time.Unit, annotation []byte, wOpts series.WriteOptions) (SeriesWrite, error) { +func (m *MockdatabaseShard) Write(ctx context.Context, id ident.ID, timestamp time.Time, value float64, unit time0.Unit, annotation []byte, wOpts series.WriteOptions) (SeriesWrite, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Write", ctx, id, timestamp, value, unit, annotation, wOpts) ret0, _ := ret[0].(SeriesWrite) @@ -1783,7 +1805,7 @@ func (mr *MockdatabaseShardMockRecorder) Write(ctx, id, timestamp, value, unit, } // WriteTagged mocks base method -func (m *MockdatabaseShard) WriteTagged(ctx context.Context, id ident.ID, tags ident.TagIterator, timestamp time0.Time, value float64, unit time.Unit, annotation []byte, wOpts series.WriteOptions) (SeriesWrite, error) { +func (m *MockdatabaseShard) WriteTagged(ctx context.Context, id ident.ID, tags ident.TagIterator, timestamp time.Time, value float64, unit time0.Unit, annotation []byte, wOpts series.WriteOptions) (SeriesWrite, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WriteTagged", ctx, id, tags, timestamp, value, unit, annotation, wOpts) ret0, _ := ret[0].(SeriesWrite) @@ -1798,7 +1820,7 @@ func (mr *MockdatabaseShardMockRecorder) WriteTagged(ctx, id, tags, timestamp, v } // ReadEncoded mocks base method -func (m *MockdatabaseShard) ReadEncoded(ctx context.Context, id ident.ID, start, end time0.Time, nsCtx namespace.Context) ([][]xio.BlockReader, error) { +func (m *MockdatabaseShard) ReadEncoded(ctx context.Context, id ident.ID, start, end time.Time, nsCtx namespace.Context) ([][]xio.BlockReader, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ReadEncoded", ctx, id, start, end, nsCtx) ret0, _ := ret[0].([][]xio.BlockReader) @@ -1813,7 +1835,7 @@ func (mr *MockdatabaseShardMockRecorder) ReadEncoded(ctx, id, start, end, nsCtx } // FetchBlocks mocks base method -func (m *MockdatabaseShard) FetchBlocks(ctx context.Context, id ident.ID, starts []time0.Time, nsCtx namespace.Context) ([]block.FetchBlockResult, error) { +func (m *MockdatabaseShard) FetchBlocks(ctx context.Context, id ident.ID, starts []time.Time, nsCtx namespace.Context) ([]block.FetchBlockResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocks", ctx, id, starts, nsCtx) ret0, _ := ret[0].([]block.FetchBlockResult) @@ -1828,7 +1850,7 @@ func (mr *MockdatabaseShardMockRecorder) FetchBlocks(ctx, id, starts, nsCtx inte } // FetchBlocksForColdFlush mocks base method -func (m *MockdatabaseShard) FetchBlocksForColdFlush(ctx context.Context, seriesID ident.ID, start time0.Time, version int, nsCtx namespace.Context) (block.FetchBlockResult, error) { +func (m *MockdatabaseShard) FetchBlocksForColdFlush(ctx context.Context, seriesID ident.ID, start time.Time, version int, nsCtx namespace.Context) (block.FetchBlockResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocksForColdFlush", ctx, seriesID, start, version, nsCtx) ret0, _ := ret[0].(block.FetchBlockResult) @@ -1843,7 +1865,7 @@ func (mr *MockdatabaseShardMockRecorder) FetchBlocksForColdFlush(ctx, seriesID, } // FetchBlocksMetadataV2 mocks base method -func (m *MockdatabaseShard) FetchBlocksMetadataV2(ctx context.Context, start, end time0.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { +func (m *MockdatabaseShard) FetchBlocksMetadataV2(ctx context.Context, start, end time.Time, limit int64, pageToken PageToken, opts block.FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResults, PageToken, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchBlocksMetadataV2", ctx, start, end, limit, pageToken, opts) ret0, _ := ret[0].(block.FetchBlocksMetadataResults) @@ -1913,7 +1935,7 @@ func (mr *MockdatabaseShardMockRecorder) LoadBlocks(series interface{}) *gomock. } // WarmFlush mocks base method -func (m *MockdatabaseShard) WarmFlush(blockStart time0.Time, flush persist.FlushPreparer, nsCtx namespace.Context) error { +func (m *MockdatabaseShard) WarmFlush(blockStart time.Time, flush persist.FlushPreparer, nsCtx namespace.Context) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WarmFlush", blockStart, flush, nsCtx) ret0, _ := ret[0].(error) @@ -1942,7 +1964,7 @@ func (mr *MockdatabaseShardMockRecorder) ColdFlush(flush, resources, nsCtx, onFl } // Snapshot mocks base method -func (m *MockdatabaseShard) Snapshot(blockStart, snapshotStart time0.Time, flush persist.SnapshotPreparer, nsCtx namespace.Context) error { +func (m *MockdatabaseShard) Snapshot(blockStart, snapshotStart time.Time, flush persist.SnapshotPreparer, nsCtx namespace.Context) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Snapshot", blockStart, snapshotStart, flush, nsCtx) ret0, _ := ret[0].(error) @@ -1956,7 +1978,7 @@ func (mr *MockdatabaseShardMockRecorder) Snapshot(blockStart, snapshotStart, flu } // FlushState mocks base method -func (m *MockdatabaseShard) FlushState(blockStart time0.Time) (fileOpState, error) { +func (m *MockdatabaseShard) FlushState(blockStart time.Time) (fileOpState, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FlushState", blockStart) ret0, _ := ret[0].(fileOpState) @@ -1971,7 +1993,7 @@ func (mr *MockdatabaseShardMockRecorder) FlushState(blockStart interface{}) *gom } // CleanupExpiredFileSets mocks base method -func (m *MockdatabaseShard) CleanupExpiredFileSets(earliestToRetain time0.Time) error { +func (m *MockdatabaseShard) CleanupExpiredFileSets(earliestToRetain time.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CleanupExpiredFileSets", earliestToRetain) ret0, _ := ret[0].(error) @@ -1999,7 +2021,7 @@ func (mr *MockdatabaseShardMockRecorder) CleanupCompactedFileSets() *gomock.Call } // Repair mocks base method -func (m *MockdatabaseShard) Repair(ctx context.Context, nsCtx namespace.Context, nsMeta namespace.Metadata, tr time.Range, repairer databaseShardRepairer) (repair.MetadataComparisonResult, error) { +func (m *MockdatabaseShard) Repair(ctx context.Context, nsCtx namespace.Context, nsMeta namespace.Metadata, tr time0.Range, repairer databaseShardRepairer) (repair.MetadataComparisonResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Repair", ctx, nsCtx, nsMeta, tr, repairer) ret0, _ := ret[0].(repair.MetadataComparisonResult) @@ -2045,7 +2067,7 @@ func (mr *MockdatabaseShardMockRecorder) DocRef(id interface{}) *gomock.Call { } // AggregateTiles mocks base method -func (m *MockdatabaseShard) AggregateTiles(reader fs.DataFileSetReader, sourceNsID ident.ID, sourceShard databaseShard, blockStart time0.Time, resources coldFlushReuseableResources, nsCtx namespace.Context, onFlush persist.OnFlushSeries) (ShardColdFlush, error) { +func (m *MockdatabaseShard) AggregateTiles(reader fs.DataFileSetReader, sourceNsID ident.ID, sourceShard databaseShard, blockStart time.Time, resources coldFlushReuseableResources, nsCtx namespace.Context, onFlush persist.OnFlushSeries) (ShardColdFlush, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AggregateTiles", reader, sourceNsID, sourceShard, blockStart, resources, nsCtx, onFlush) ret0, _ := ret[0].(ShardColdFlush) @@ -2060,7 +2082,7 @@ func (mr *MockdatabaseShardMockRecorder) AggregateTiles(reader, sourceNsID, sour } // latestVolume mocks base method -func (m *MockdatabaseShard) latestVolume(blockStart time0.Time) (int, error) { +func (m *MockdatabaseShard) latestVolume(blockStart time.Time) (int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "latestVolume", blockStart) ret0, _ := ret[0].(int) @@ -2147,10 +2169,10 @@ func (mr *MockNamespaceIndexMockRecorder) AssignShardSet(shardSet interface{}) * } // BlockStartForWriteTime mocks base method -func (m *MockNamespaceIndex) BlockStartForWriteTime(writeTime time0.Time) time.UnixNano { +func (m *MockNamespaceIndex) BlockStartForWriteTime(writeTime time.Time) time0.UnixNano { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BlockStartForWriteTime", writeTime) - ret0, _ := ret[0].(time.UnixNano) + ret0, _ := ret[0].(time0.UnixNano) return ret0 } @@ -2161,7 +2183,7 @@ func (mr *MockNamespaceIndexMockRecorder) BlockStartForWriteTime(writeTime inter } // BlockForBlockStart mocks base method -func (m *MockNamespaceIndex) BlockForBlockStart(blockStart time0.Time) (index.Block, error) { +func (m *MockNamespaceIndex) BlockForBlockStart(blockStart time.Time) (index.Block, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BlockForBlockStart", blockStart) ret0, _ := ret[0].(index.Block) @@ -2262,7 +2284,7 @@ func (mr *MockNamespaceIndexMockRecorder) BootstrapsDone() *gomock.Call { } // CleanupExpiredFileSets mocks base method -func (m *MockNamespaceIndex) CleanupExpiredFileSets(t time0.Time) error { +func (m *MockNamespaceIndex) CleanupExpiredFileSets(t time.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CleanupExpiredFileSets", t) ret0, _ := ret[0].(error) @@ -2290,7 +2312,7 @@ func (mr *MockNamespaceIndexMockRecorder) CleanupDuplicateFileSets() *gomock.Cal } // Tick mocks base method -func (m *MockNamespaceIndex) Tick(c context.Cancellable, startTime time0.Time) (namespaceIndexTickResult, error) { +func (m *MockNamespaceIndex) Tick(c context.Cancellable, startTime time.Time) (namespaceIndexTickResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Tick", c, startTime) ret0, _ := ret[0].(namespaceIndexTickResult) @@ -2413,10 +2435,10 @@ func (mr *MocknamespaceIndexInsertQueueMockRecorder) Stop() *gomock.Call { } // InsertBatch mocks base method -func (m *MocknamespaceIndexInsertQueue) InsertBatch(batch *index.WriteBatch) (*sync0.WaitGroup, error) { +func (m *MocknamespaceIndexInsertQueue) InsertBatch(batch *index.WriteBatch) (*sync.WaitGroup, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "InsertBatch", batch) - ret0, _ := ret[0].(*sync0.WaitGroup) + ret0, _ := ret[0].(*sync.WaitGroup) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2428,10 +2450,10 @@ func (mr *MocknamespaceIndexInsertQueueMockRecorder) InsertBatch(batch interface } // InsertPending mocks base method -func (m *MocknamespaceIndexInsertQueue) InsertPending(pending []writes.PendingIndexInsert) (*sync0.WaitGroup, error) { +func (m *MocknamespaceIndexInsertQueue) InsertPending(pending []writes.PendingIndexInsert) (*sync.WaitGroup, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "InsertPending", pending) - ret0, _ := ret[0].(*sync0.WaitGroup) + ret0, _ := ret[0].(*sync.WaitGroup) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2480,10 +2502,10 @@ func (mr *MockdatabaseBootstrapManagerMockRecorder) IsBootstrapped() *gomock.Cal } // LastBootstrapCompletionTime mocks base method -func (m *MockdatabaseBootstrapManager) LastBootstrapCompletionTime() (time0.Time, bool) { +func (m *MockdatabaseBootstrapManager) LastBootstrapCompletionTime() (time.Time, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LastBootstrapCompletionTime") - ret0, _ := ret[0].(time0.Time) + ret0, _ := ret[0].(time.Time) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -2545,7 +2567,7 @@ func (m *MockdatabaseFlushManager) EXPECT() *MockdatabaseFlushManagerMockRecorde } // Flush mocks base method -func (m *MockdatabaseFlushManager) Flush(startTime time0.Time) error { +func (m *MockdatabaseFlushManager) Flush(startTime time.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Flush", startTime) ret0, _ := ret[0].(error) @@ -2559,10 +2581,10 @@ func (mr *MockdatabaseFlushManagerMockRecorder) Flush(startTime interface{}) *go } // LastSuccessfulSnapshotStartTime mocks base method -func (m *MockdatabaseFlushManager) LastSuccessfulSnapshotStartTime() (time0.Time, bool) { +func (m *MockdatabaseFlushManager) LastSuccessfulSnapshotStartTime() (time.Time, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LastSuccessfulSnapshotStartTime") - ret0, _ := ret[0].(time0.Time) + ret0, _ := ret[0].(time.Time) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -2609,7 +2631,7 @@ func (m *MockdatabaseCleanupManager) EXPECT() *MockdatabaseCleanupManagerMockRec } // Cleanup mocks base method -func (m *MockdatabaseCleanupManager) Cleanup(t time0.Time, isBootstrapped bool) error { +func (m *MockdatabaseCleanupManager) Cleanup(t time.Time, isBootstrapped bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Cleanup", t, isBootstrapped) ret0, _ := ret[0].(error) @@ -2658,7 +2680,7 @@ func (m *MockdatabaseFileSystemManager) EXPECT() *MockdatabaseFileSystemManagerM } // Cleanup mocks base method -func (m *MockdatabaseFileSystemManager) Cleanup(t time0.Time, isBootstrapped bool) error { +func (m *MockdatabaseFileSystemManager) Cleanup(t time.Time, isBootstrapped bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Cleanup", t, isBootstrapped) ret0, _ := ret[0].(error) @@ -2672,7 +2694,7 @@ func (mr *MockdatabaseFileSystemManagerMockRecorder) Cleanup(t, isBootstrapped i } // Flush mocks base method -func (m *MockdatabaseFileSystemManager) Flush(t time0.Time) error { +func (m *MockdatabaseFileSystemManager) Flush(t time.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Flush", t) ret0, _ := ret[0].(error) @@ -2728,7 +2750,7 @@ func (mr *MockdatabaseFileSystemManagerMockRecorder) Status() *gomock.Call { } // Run mocks base method -func (m *MockdatabaseFileSystemManager) Run(t time0.Time, runType runType, forceType forceType) bool { +func (m *MockdatabaseFileSystemManager) Run(t time.Time, runType runType, forceType forceType) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Run", t, runType, forceType) ret0, _ := ret[0].(bool) @@ -2754,10 +2776,10 @@ func (mr *MockdatabaseFileSystemManagerMockRecorder) Report() *gomock.Call { } // LastSuccessfulSnapshotStartTime mocks base method -func (m *MockdatabaseFileSystemManager) LastSuccessfulSnapshotStartTime() (time0.Time, bool) { +func (m *MockdatabaseFileSystemManager) LastSuccessfulSnapshotStartTime() (time.Time, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LastSuccessfulSnapshotStartTime") - ret0, _ := ret[0].(time0.Time) + ret0, _ := ret[0].(time.Time) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -2806,7 +2828,7 @@ func (mr *MockdatabaseShardRepairerMockRecorder) Options() *gomock.Call { } // Repair mocks base method -func (m *MockdatabaseShardRepairer) Repair(ctx context.Context, nsCtx namespace.Context, nsMeta namespace.Metadata, tr time.Range, shard databaseShard) (repair.MetadataComparisonResult, error) { +func (m *MockdatabaseShardRepairer) Repair(ctx context.Context, nsCtx namespace.Context, nsMeta namespace.Metadata, tr time0.Range, shard databaseShard) (repair.MetadataComparisonResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Repair", ctx, nsCtx, nsMeta, tr, shard) ret0, _ := ret[0].(repair.MetadataComparisonResult) @@ -2917,7 +2939,7 @@ func (m *MockdatabaseTickManager) EXPECT() *MockdatabaseTickManagerMockRecorder } // Tick mocks base method -func (m *MockdatabaseTickManager) Tick(forceType forceType, startTime time0.Time) error { +func (m *MockdatabaseTickManager) Tick(forceType forceType, startTime time.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Tick", forceType, startTime) ret0, _ := ret[0].(error) @@ -2982,10 +3004,10 @@ func (mr *MockdatabaseMediatorMockRecorder) IsBootstrapped() *gomock.Call { } // LastBootstrapCompletionTime mocks base method -func (m *MockdatabaseMediator) LastBootstrapCompletionTime() (time0.Time, bool) { +func (m *MockdatabaseMediator) LastBootstrapCompletionTime() (time.Time, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LastBootstrapCompletionTime") - ret0, _ := ret[0].(time0.Time) + ret0, _ := ret[0].(time.Time) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -3036,7 +3058,7 @@ func (mr *MockdatabaseMediatorMockRecorder) EnableFileOps() *gomock.Call { } // Tick mocks base method -func (m *MockdatabaseMediator) Tick(forceType forceType, startTime time0.Time) error { +func (m *MockdatabaseMediator) Tick(forceType forceType, startTime time.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Tick", forceType, startTime) ret0, _ := ret[0].(error) @@ -3102,10 +3124,10 @@ func (mr *MockdatabaseMediatorMockRecorder) Report() *gomock.Call { } // LastSuccessfulSnapshotStartTime mocks base method -func (m *MockdatabaseMediator) LastSuccessfulSnapshotStartTime() (time0.Time, bool) { +func (m *MockdatabaseMediator) LastSuccessfulSnapshotStartTime() (time.Time, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LastSuccessfulSnapshotStartTime") - ret0, _ := ret[0].(time0.Time) + ret0, _ := ret[0].(time.Time) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -3425,7 +3447,7 @@ func (mr *MockOptionsMockRecorder) RuntimeOptionsManager() *gomock.Call { } // SetErrorWindowForLoad mocks base method -func (m *MockOptions) SetErrorWindowForLoad(value time0.Duration) Options { +func (m *MockOptions) SetErrorWindowForLoad(value time.Duration) Options { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SetErrorWindowForLoad", value) ret0, _ := ret[0].(Options) @@ -3439,10 +3461,10 @@ func (mr *MockOptionsMockRecorder) SetErrorWindowForLoad(value interface{}) *gom } // ErrorWindowForLoad mocks base method -func (m *MockOptions) ErrorWindowForLoad() time0.Duration { +func (m *MockOptions) ErrorWindowForLoad() time.Duration { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ErrorWindowForLoad") - ret0, _ := ret[0].(time0.Duration) + ret0, _ := ret[0].(time.Duration) return ret0 } @@ -4041,7 +4063,7 @@ func (mr *MockOptionsMockRecorder) FetchBlocksMetadataResultsPool() *gomock.Call } // SetQueryIDsWorkerPool mocks base method -func (m *MockOptions) SetQueryIDsWorkerPool(value sync.WorkerPool) Options { +func (m *MockOptions) SetQueryIDsWorkerPool(value sync0.WorkerPool) Options { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SetQueryIDsWorkerPool", value) ret0, _ := ret[0].(Options) @@ -4055,10 +4077,10 @@ func (mr *MockOptionsMockRecorder) SetQueryIDsWorkerPool(value interface{}) *gom } // QueryIDsWorkerPool mocks base method -func (m *MockOptions) QueryIDsWorkerPool() sync.WorkerPool { +func (m *MockOptions) QueryIDsWorkerPool() sync0.WorkerPool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "QueryIDsWorkerPool") - ret0, _ := ret[0].(sync.WorkerPool) + ret0, _ := ret[0].(sync0.WorkerPool) return ret0 } From 20c07e117468d9ea7c5307a1dc74f9d766a70122 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Thu, 16 Jul 2020 10:52:57 +0300 Subject: [PATCH 13/32] Fix test --- src/dbnode/storage/shard_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/dbnode/storage/shard_test.go b/src/dbnode/storage/shard_test.go index 0f3b1e0740..3f92064d36 100644 --- a/src/dbnode/storage/shard_test.go +++ b/src/dbnode/storage/shard_test.go @@ -1777,7 +1777,11 @@ func TestAggregateTiles(t *testing.T) { Return(nil, nil, nil, uint32(0), io.EOF) reader.EXPECT().Close() + //FIXME - this should most likely be removed once the actual writes are integrated: + targetShard.flushState.initialized = true + cfReusableResources := coldFlushReuseableResources{dirtySeries: &dirtySeriesMap{}} + _, err = targetShard.AggregateTiles( - reader, sourceNsID, sourceShard, blockStart, coldFlushReuseableResources{}, namespace.Context{}, &persist.NoOpColdFlushNamespace{}) + reader, sourceNsID, sourceShard, blockStart, cfReusableResources, namespace.Context{}, &persist.NoOpColdFlushNamespace{}) require.NoError(t, err) } From efa16e7f3bdd154384d507d3da81ed529a61e433 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Fri, 17 Jul 2020 11:03:43 +0300 Subject: [PATCH 14/32] Resurrect rpc_mock.go --- src/dbnode/generated/thrift/rpc/rpc_mock.go | 654 ++++++++++++++++++++ 1 file changed, 654 insertions(+) create mode 100644 src/dbnode/generated/thrift/rpc/rpc_mock.go diff --git a/src/dbnode/generated/thrift/rpc/rpc_mock.go b/src/dbnode/generated/thrift/rpc/rpc_mock.go new file mode 100644 index 0000000000..a7be5ca909 --- /dev/null +++ b/src/dbnode/generated/thrift/rpc/rpc_mock.go @@ -0,0 +1,654 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/dbnode/generated/thrift/rpc/tchan-go + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package rpc is a generated GoMock package. +package rpc + +import ( + "reflect" + + "github.com/golang/mock/gomock" + "github.com/uber/tchannel-go/thrift" +) + +// MockTChanCluster is a mock of TChanCluster interface +type MockTChanCluster struct { + ctrl *gomock.Controller + recorder *MockTChanClusterMockRecorder +} + +// MockTChanClusterMockRecorder is the mock recorder for MockTChanCluster +type MockTChanClusterMockRecorder struct { + mock *MockTChanCluster +} + +// NewMockTChanCluster creates a new mock instance +func NewMockTChanCluster(ctrl *gomock.Controller) *MockTChanCluster { + mock := &MockTChanCluster{ctrl: ctrl} + mock.recorder = &MockTChanClusterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockTChanCluster) EXPECT() *MockTChanClusterMockRecorder { + return m.recorder +} + +// Aggregate mocks base method +func (m *MockTChanCluster) Aggregate(ctx thrift.Context, req *AggregateQueryRequest) (*AggregateQueryResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Aggregate", ctx, req) + ret0, _ := ret[0].(*AggregateQueryResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Aggregate indicates an expected call of Aggregate +func (mr *MockTChanClusterMockRecorder) Aggregate(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Aggregate", reflect.TypeOf((*MockTChanCluster)(nil).Aggregate), ctx, req) +} + +// Fetch mocks base method +func (m *MockTChanCluster) Fetch(ctx thrift.Context, req *FetchRequest) (*FetchResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Fetch", ctx, req) + ret0, _ := ret[0].(*FetchResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Fetch indicates an expected call of Fetch +func (mr *MockTChanClusterMockRecorder) Fetch(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fetch", reflect.TypeOf((*MockTChanCluster)(nil).Fetch), ctx, req) +} + +// Health mocks base method +func (m *MockTChanCluster) Health(ctx thrift.Context) (*HealthResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Health", ctx) + ret0, _ := ret[0].(*HealthResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Health indicates an expected call of Health +func (mr *MockTChanClusterMockRecorder) Health(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Health", reflect.TypeOf((*MockTChanCluster)(nil).Health), ctx) +} + +// Query mocks base method +func (m *MockTChanCluster) Query(ctx thrift.Context, req *QueryRequest) (*QueryResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Query", ctx, req) + ret0, _ := ret[0].(*QueryResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Query indicates an expected call of Query +func (mr *MockTChanClusterMockRecorder) Query(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockTChanCluster)(nil).Query), ctx, req) +} + +// Truncate mocks base method +func (m *MockTChanCluster) Truncate(ctx thrift.Context, req *TruncateRequest) (*TruncateResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Truncate", ctx, req) + ret0, _ := ret[0].(*TruncateResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Truncate indicates an expected call of Truncate +func (mr *MockTChanClusterMockRecorder) Truncate(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Truncate", reflect.TypeOf((*MockTChanCluster)(nil).Truncate), ctx, req) +} + +// Write mocks base method +func (m *MockTChanCluster) Write(ctx thrift.Context, req *WriteRequest) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Write", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// Write indicates an expected call of Write +func (mr *MockTChanClusterMockRecorder) Write(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockTChanCluster)(nil).Write), ctx, req) +} + +// WriteTagged mocks base method +func (m *MockTChanCluster) WriteTagged(ctx thrift.Context, req *WriteTaggedRequest) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteTagged", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteTagged indicates an expected call of WriteTagged +func (mr *MockTChanClusterMockRecorder) WriteTagged(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTagged", reflect.TypeOf((*MockTChanCluster)(nil).WriteTagged), ctx, req) +} + +// MockTChanNode is a mock of TChanNode interface +type MockTChanNode struct { + ctrl *gomock.Controller + recorder *MockTChanNodeMockRecorder +} + +// MockTChanNodeMockRecorder is the mock recorder for MockTChanNode +type MockTChanNodeMockRecorder struct { + mock *MockTChanNode +} + +// NewMockTChanNode creates a new mock instance +func NewMockTChanNode(ctrl *gomock.Controller) *MockTChanNode { + mock := &MockTChanNode{ctrl: ctrl} + mock.recorder = &MockTChanNodeMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockTChanNode) EXPECT() *MockTChanNodeMockRecorder { + return m.recorder +} + +// Aggregate mocks base method +func (m *MockTChanNode) Aggregate(ctx thrift.Context, req *AggregateQueryRequest) (*AggregateQueryResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Aggregate", ctx, req) + ret0, _ := ret[0].(*AggregateQueryResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Aggregate indicates an expected call of Aggregate +func (mr *MockTChanNodeMockRecorder) Aggregate(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Aggregate", reflect.TypeOf((*MockTChanNode)(nil).Aggregate), ctx, req) +} + +// AggregateRaw mocks base method +func (m *MockTChanNode) AggregateRaw(ctx thrift.Context, req *AggregateQueryRawRequest) (*AggregateQueryRawResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AggregateRaw", ctx, req) + ret0, _ := ret[0].(*AggregateQueryRawResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AggregateRaw indicates an expected call of AggregateRaw +func (mr *MockTChanNodeMockRecorder) AggregateRaw(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateRaw", reflect.TypeOf((*MockTChanNode)(nil).AggregateRaw), ctx, req) +} + +// AggregateTiles mocks base method +func (m *MockTChanNode) AggregateTiles(ctx thrift.Context, req *AggregateTilesRequest) (*AggregateTilesResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AggregateTiles", ctx, req) + ret0, _ := ret[0].(*AggregateTilesResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AggregateTiles indicates an expected call of AggregateTiles +func (mr *MockTChanNodeMockRecorder) AggregateTiles(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockTChanNode)(nil).AggregateTiles), ctx, req) +} + +// Bootstrapped mocks base method +func (m *MockTChanNode) Bootstrapped(ctx thrift.Context) (*NodeBootstrappedResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Bootstrapped", ctx) + ret0, _ := ret[0].(*NodeBootstrappedResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Bootstrapped indicates an expected call of Bootstrapped +func (mr *MockTChanNodeMockRecorder) Bootstrapped(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Bootstrapped", reflect.TypeOf((*MockTChanNode)(nil).Bootstrapped), ctx) +} + +// BootstrappedInPlacementOrNoPlacement mocks base method +func (m *MockTChanNode) BootstrappedInPlacementOrNoPlacement(ctx thrift.Context) (*NodeBootstrappedInPlacementOrNoPlacementResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BootstrappedInPlacementOrNoPlacement", ctx) + ret0, _ := ret[0].(*NodeBootstrappedInPlacementOrNoPlacementResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BootstrappedInPlacementOrNoPlacement indicates an expected call of BootstrappedInPlacementOrNoPlacement +func (mr *MockTChanNodeMockRecorder) BootstrappedInPlacementOrNoPlacement(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BootstrappedInPlacementOrNoPlacement", reflect.TypeOf((*MockTChanNode)(nil).BootstrappedInPlacementOrNoPlacement), ctx) +} + +// DebugIndexMemorySegments mocks base method +func (m *MockTChanNode) DebugIndexMemorySegments(ctx thrift.Context, req *DebugIndexMemorySegmentsRequest) (*DebugIndexMemorySegmentsResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DebugIndexMemorySegments", ctx, req) + ret0, _ := ret[0].(*DebugIndexMemorySegmentsResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DebugIndexMemorySegments indicates an expected call of DebugIndexMemorySegments +func (mr *MockTChanNodeMockRecorder) DebugIndexMemorySegments(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DebugIndexMemorySegments", reflect.TypeOf((*MockTChanNode)(nil).DebugIndexMemorySegments), ctx, req) +} + +// DebugProfileStart mocks base method +func (m *MockTChanNode) DebugProfileStart(ctx thrift.Context, req *DebugProfileStartRequest) (*DebugProfileStartResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DebugProfileStart", ctx, req) + ret0, _ := ret[0].(*DebugProfileStartResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DebugProfileStart indicates an expected call of DebugProfileStart +func (mr *MockTChanNodeMockRecorder) DebugProfileStart(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DebugProfileStart", reflect.TypeOf((*MockTChanNode)(nil).DebugProfileStart), ctx, req) +} + +// DebugProfileStop mocks base method +func (m *MockTChanNode) DebugProfileStop(ctx thrift.Context, req *DebugProfileStopRequest) (*DebugProfileStopResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DebugProfileStop", ctx, req) + ret0, _ := ret[0].(*DebugProfileStopResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DebugProfileStop indicates an expected call of DebugProfileStop +func (mr *MockTChanNodeMockRecorder) DebugProfileStop(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DebugProfileStop", reflect.TypeOf((*MockTChanNode)(nil).DebugProfileStop), ctx, req) +} + +// Fetch mocks base method +func (m *MockTChanNode) Fetch(ctx thrift.Context, req *FetchRequest) (*FetchResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Fetch", ctx, req) + ret0, _ := ret[0].(*FetchResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Fetch indicates an expected call of Fetch +func (mr *MockTChanNodeMockRecorder) Fetch(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fetch", reflect.TypeOf((*MockTChanNode)(nil).Fetch), ctx, req) +} + +// FetchBatchRaw mocks base method +func (m *MockTChanNode) FetchBatchRaw(ctx thrift.Context, req *FetchBatchRawRequest) (*FetchBatchRawResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBatchRaw", ctx, req) + ret0, _ := ret[0].(*FetchBatchRawResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBatchRaw indicates an expected call of FetchBatchRaw +func (mr *MockTChanNodeMockRecorder) FetchBatchRaw(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBatchRaw", reflect.TypeOf((*MockTChanNode)(nil).FetchBatchRaw), ctx, req) +} + +// FetchBatchRawV2 mocks base method +func (m *MockTChanNode) FetchBatchRawV2(ctx thrift.Context, req *FetchBatchRawV2Request) (*FetchBatchRawResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBatchRawV2", ctx, req) + ret0, _ := ret[0].(*FetchBatchRawResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBatchRawV2 indicates an expected call of FetchBatchRawV2 +func (mr *MockTChanNodeMockRecorder) FetchBatchRawV2(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBatchRawV2", reflect.TypeOf((*MockTChanNode)(nil).FetchBatchRawV2), ctx, req) +} + +// FetchBlocksMetadataRawV2 mocks base method +func (m *MockTChanNode) FetchBlocksMetadataRawV2(ctx thrift.Context, req *FetchBlocksMetadataRawV2Request) (*FetchBlocksMetadataRawV2Result_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBlocksMetadataRawV2", ctx, req) + ret0, _ := ret[0].(*FetchBlocksMetadataRawV2Result_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBlocksMetadataRawV2 indicates an expected call of FetchBlocksMetadataRawV2 +func (mr *MockTChanNodeMockRecorder) FetchBlocksMetadataRawV2(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocksMetadataRawV2", reflect.TypeOf((*MockTChanNode)(nil).FetchBlocksMetadataRawV2), ctx, req) +} + +// FetchBlocksRaw mocks base method +func (m *MockTChanNode) FetchBlocksRaw(ctx thrift.Context, req *FetchBlocksRawRequest) (*FetchBlocksRawResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBlocksRaw", ctx, req) + ret0, _ := ret[0].(*FetchBlocksRawResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBlocksRaw indicates an expected call of FetchBlocksRaw +func (mr *MockTChanNodeMockRecorder) FetchBlocksRaw(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocksRaw", reflect.TypeOf((*MockTChanNode)(nil).FetchBlocksRaw), ctx, req) +} + +// FetchTagged mocks base method +func (m *MockTChanNode) FetchTagged(ctx thrift.Context, req *FetchTaggedRequest) (*FetchTaggedResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchTagged", ctx, req) + ret0, _ := ret[0].(*FetchTaggedResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchTagged indicates an expected call of FetchTagged +func (mr *MockTChanNodeMockRecorder) FetchTagged(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchTagged", reflect.TypeOf((*MockTChanNode)(nil).FetchTagged), ctx, req) +} + +// GetPersistRateLimit mocks base method +func (m *MockTChanNode) GetPersistRateLimit(ctx thrift.Context) (*NodePersistRateLimitResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetPersistRateLimit", ctx) + ret0, _ := ret[0].(*NodePersistRateLimitResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetPersistRateLimit indicates an expected call of GetPersistRateLimit +func (mr *MockTChanNodeMockRecorder) GetPersistRateLimit(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPersistRateLimit", reflect.TypeOf((*MockTChanNode)(nil).GetPersistRateLimit), ctx) +} + +// GetWriteNewSeriesAsync mocks base method +func (m *MockTChanNode) GetWriteNewSeriesAsync(ctx thrift.Context) (*NodeWriteNewSeriesAsyncResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetWriteNewSeriesAsync", ctx) + ret0, _ := ret[0].(*NodeWriteNewSeriesAsyncResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetWriteNewSeriesAsync indicates an expected call of GetWriteNewSeriesAsync +func (mr *MockTChanNodeMockRecorder) GetWriteNewSeriesAsync(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWriteNewSeriesAsync", reflect.TypeOf((*MockTChanNode)(nil).GetWriteNewSeriesAsync), ctx) +} + +// GetWriteNewSeriesBackoffDuration mocks base method +func (m *MockTChanNode) GetWriteNewSeriesBackoffDuration(ctx thrift.Context) (*NodeWriteNewSeriesBackoffDurationResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetWriteNewSeriesBackoffDuration", ctx) + ret0, _ := ret[0].(*NodeWriteNewSeriesBackoffDurationResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetWriteNewSeriesBackoffDuration indicates an expected call of GetWriteNewSeriesBackoffDuration +func (mr *MockTChanNodeMockRecorder) GetWriteNewSeriesBackoffDuration(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWriteNewSeriesBackoffDuration", reflect.TypeOf((*MockTChanNode)(nil).GetWriteNewSeriesBackoffDuration), ctx) +} + +// GetWriteNewSeriesLimitPerShardPerSecond mocks base method +func (m *MockTChanNode) GetWriteNewSeriesLimitPerShardPerSecond(ctx thrift.Context) (*NodeWriteNewSeriesLimitPerShardPerSecondResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetWriteNewSeriesLimitPerShardPerSecond", ctx) + ret0, _ := ret[0].(*NodeWriteNewSeriesLimitPerShardPerSecondResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetWriteNewSeriesLimitPerShardPerSecond indicates an expected call of GetWriteNewSeriesLimitPerShardPerSecond +func (mr *MockTChanNodeMockRecorder) GetWriteNewSeriesLimitPerShardPerSecond(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWriteNewSeriesLimitPerShardPerSecond", reflect.TypeOf((*MockTChanNode)(nil).GetWriteNewSeriesLimitPerShardPerSecond), ctx) +} + +// Health mocks base method +func (m *MockTChanNode) Health(ctx thrift.Context) (*NodeHealthResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Health", ctx) + ret0, _ := ret[0].(*NodeHealthResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Health indicates an expected call of Health +func (mr *MockTChanNodeMockRecorder) Health(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Health", reflect.TypeOf((*MockTChanNode)(nil).Health), ctx) +} + +// Query mocks base method +func (m *MockTChanNode) Query(ctx thrift.Context, req *QueryRequest) (*QueryResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Query", ctx, req) + ret0, _ := ret[0].(*QueryResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Query indicates an expected call of Query +func (mr *MockTChanNodeMockRecorder) Query(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockTChanNode)(nil).Query), ctx, req) +} + +// Repair mocks base method +func (m *MockTChanNode) Repair(ctx thrift.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Repair", ctx) + ret0, _ := ret[0].(error) + return ret0 +} + +// Repair indicates an expected call of Repair +func (mr *MockTChanNodeMockRecorder) Repair(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Repair", reflect.TypeOf((*MockTChanNode)(nil).Repair), ctx) +} + +// SetPersistRateLimit mocks base method +func (m *MockTChanNode) SetPersistRateLimit(ctx thrift.Context, req *NodeSetPersistRateLimitRequest) (*NodePersistRateLimitResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetPersistRateLimit", ctx, req) + ret0, _ := ret[0].(*NodePersistRateLimitResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetPersistRateLimit indicates an expected call of SetPersistRateLimit +func (mr *MockTChanNodeMockRecorder) SetPersistRateLimit(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetPersistRateLimit", reflect.TypeOf((*MockTChanNode)(nil).SetPersistRateLimit), ctx, req) +} + +// SetWriteNewSeriesAsync mocks base method +func (m *MockTChanNode) SetWriteNewSeriesAsync(ctx thrift.Context, req *NodeSetWriteNewSeriesAsyncRequest) (*NodeWriteNewSeriesAsyncResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteNewSeriesAsync", ctx, req) + ret0, _ := ret[0].(*NodeWriteNewSeriesAsyncResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetWriteNewSeriesAsync indicates an expected call of SetWriteNewSeriesAsync +func (mr *MockTChanNodeMockRecorder) SetWriteNewSeriesAsync(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteNewSeriesAsync", reflect.TypeOf((*MockTChanNode)(nil).SetWriteNewSeriesAsync), ctx, req) +} + +// SetWriteNewSeriesBackoffDuration mocks base method +func (m *MockTChanNode) SetWriteNewSeriesBackoffDuration(ctx thrift.Context, req *NodeSetWriteNewSeriesBackoffDurationRequest) (*NodeWriteNewSeriesBackoffDurationResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteNewSeriesBackoffDuration", ctx, req) + ret0, _ := ret[0].(*NodeWriteNewSeriesBackoffDurationResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetWriteNewSeriesBackoffDuration indicates an expected call of SetWriteNewSeriesBackoffDuration +func (mr *MockTChanNodeMockRecorder) SetWriteNewSeriesBackoffDuration(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteNewSeriesBackoffDuration", reflect.TypeOf((*MockTChanNode)(nil).SetWriteNewSeriesBackoffDuration), ctx, req) +} + +// SetWriteNewSeriesLimitPerShardPerSecond mocks base method +func (m *MockTChanNode) SetWriteNewSeriesLimitPerShardPerSecond(ctx thrift.Context, req *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest) (*NodeWriteNewSeriesLimitPerShardPerSecondResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteNewSeriesLimitPerShardPerSecond", ctx, req) + ret0, _ := ret[0].(*NodeWriteNewSeriesLimitPerShardPerSecondResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetWriteNewSeriesLimitPerShardPerSecond indicates an expected call of SetWriteNewSeriesLimitPerShardPerSecond +func (mr *MockTChanNodeMockRecorder) SetWriteNewSeriesLimitPerShardPerSecond(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteNewSeriesLimitPerShardPerSecond", reflect.TypeOf((*MockTChanNode)(nil).SetWriteNewSeriesLimitPerShardPerSecond), ctx, req) +} + +// Truncate mocks base method +func (m *MockTChanNode) Truncate(ctx thrift.Context, req *TruncateRequest) (*TruncateResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Truncate", ctx, req) + ret0, _ := ret[0].(*TruncateResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Truncate indicates an expected call of Truncate +func (mr *MockTChanNodeMockRecorder) Truncate(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Truncate", reflect.TypeOf((*MockTChanNode)(nil).Truncate), ctx, req) +} + +// Write mocks base method +func (m *MockTChanNode) Write(ctx thrift.Context, req *WriteRequest) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Write", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// Write indicates an expected call of Write +func (mr *MockTChanNodeMockRecorder) Write(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockTChanNode)(nil).Write), ctx, req) +} + +// WriteBatchRaw mocks base method +func (m *MockTChanNode) WriteBatchRaw(ctx thrift.Context, req *WriteBatchRawRequest) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteBatchRaw", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteBatchRaw indicates an expected call of WriteBatchRaw +func (mr *MockTChanNodeMockRecorder) WriteBatchRaw(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteBatchRaw", reflect.TypeOf((*MockTChanNode)(nil).WriteBatchRaw), ctx, req) +} + +// WriteBatchRawV2 mocks base method +func (m *MockTChanNode) WriteBatchRawV2(ctx thrift.Context, req *WriteBatchRawV2Request) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteBatchRawV2", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteBatchRawV2 indicates an expected call of WriteBatchRawV2 +func (mr *MockTChanNodeMockRecorder) WriteBatchRawV2(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteBatchRawV2", reflect.TypeOf((*MockTChanNode)(nil).WriteBatchRawV2), ctx, req) +} + +// WriteTagged mocks base method +func (m *MockTChanNode) WriteTagged(ctx thrift.Context, req *WriteTaggedRequest) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteTagged", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteTagged indicates an expected call of WriteTagged +func (mr *MockTChanNodeMockRecorder) WriteTagged(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTagged", reflect.TypeOf((*MockTChanNode)(nil).WriteTagged), ctx, req) +} + +// WriteTaggedBatchRaw mocks base method +func (m *MockTChanNode) WriteTaggedBatchRaw(ctx thrift.Context, req *WriteTaggedBatchRawRequest) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteTaggedBatchRaw", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteTaggedBatchRaw indicates an expected call of WriteTaggedBatchRaw +func (mr *MockTChanNodeMockRecorder) WriteTaggedBatchRaw(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTaggedBatchRaw", reflect.TypeOf((*MockTChanNode)(nil).WriteTaggedBatchRaw), ctx, req) +} + +// WriteTaggedBatchRawV2 mocks base method +func (m *MockTChanNode) WriteTaggedBatchRawV2(ctx thrift.Context, req *WriteTaggedBatchRawV2Request) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteTaggedBatchRawV2", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteTaggedBatchRawV2 indicates an expected call of WriteTaggedBatchRawV2 +func (mr *MockTChanNodeMockRecorder) WriteTaggedBatchRawV2(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTaggedBatchRawV2", reflect.TypeOf((*MockTChanNode)(nil).WriteTaggedBatchRawV2), ctx, req) +} From 13fd5e1551d94b825a886c4eea63f45d14796788 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Fri, 17 Jul 2020 11:09:50 +0300 Subject: [PATCH 15/32] Remove accidentally committed files --- scripts/development/m3_stack/m3db_data/.lock | 0 .../m3_stack/m3db_data/etcd/member/snap/db | Bin 24576 -> 0 bytes .../wal/0000000000000000-0000000000000000.wal | Bin 64000000 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 scripts/development/m3_stack/m3db_data/.lock delete mode 100644 scripts/development/m3_stack/m3db_data/etcd/member/snap/db delete mode 100644 scripts/development/m3_stack/m3db_data/etcd/member/wal/0000000000000000-0000000000000000.wal diff --git a/scripts/development/m3_stack/m3db_data/.lock b/scripts/development/m3_stack/m3db_data/.lock deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/scripts/development/m3_stack/m3db_data/etcd/member/snap/db b/scripts/development/m3_stack/m3db_data/etcd/member/snap/db deleted file mode 100644 index 40a6cd8eb8fbacdac00ebcb8408bd2ac2bc83417..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 zcmeI&zi!h&90%|uKq;sK-hk)^rYN=J=AS1dSdf?^3PM$>oa9g=?4*jFN>DLWtc-mC zHl6?pi8tX57_zW2!T0AoOIFf0twc*vzE_>?-`&~1d^-K^Tqu}w-JYl4*QO=8zGoWJ zYuhKM-?psSw(MN|y4C8JlApPuyrcjHC_n)UP=Epypa2CZKmiI+;ED(o?L1D(|F6x= zb2k6KY5Na9Kll~-?>^29XGj4GP=Epypa2CZKmiI+fC3btz!eb4_V-JL+v#j%J>V1S z4b(EK#9vTlec-W;r#Rn2E!%hngYxlx#Ii1s^*0d9IzkpdL7ad7E5tJX2o;xwA2{5_ zxoqQAOj6!2aS#UM2=ZoBTaH)?IyskgkQ>$aSV+S7Wx*?Af(e@pEq$)3Ny?$(-B z2Y;?#^IDGDuBc%UY2~ZP>vwm;Q7;J9dpotAv5rRjx^E^if6PQ8odol}rX?G5Qa{@% zKmiI+fC3bt00k&O0SZvS+0u-PC1t>rP3Q&Lo3k4*vmQqSHY?H4)M4aEhe}OokuZJ`J9}s8x`WZL4|IY3; z-ivb1on&(pj})K)1t>rP3Q&Lo6rcbFC_sT_5|F%J%0=w|m+@TL&pzw-|JnEnZpzjZ vrP3Q&Lo6rcbF{wIMyDMjt3 diff --git a/scripts/development/m3_stack/m3db_data/etcd/member/wal/0000000000000000-0000000000000000.wal b/scripts/development/m3_stack/m3db_data/etcd/member/wal/0000000000000000-0000000000000000.wal deleted file mode 100644 index 4cd716ac5a202055c5c34c1501c08e820ed48757..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64000000 zcmeFt&1+Ow7zf}xAF0;}aVQj~gHSjNaS<|K#>oubbSLN{h=L$N^D$y16GJjqAq0|= zl0^+&lqg93z(p5bC@zeGTbC^@rMM7^#g#~@t?MA(%%qq~?O*Vm%jMjA?z!)Keor>) zjO93+>pXnYeP4=GxtI4gUhF7*6#wz-(w{fK`|a!dsodo|E7xwUKEJgm>g(?NBJRmO ze17$>-acrT| zsdM9_Q(>WVhRq|yncSntUp>kcK1ljU`Q+}7IGy`tZT0)UWIf8I^XZSf%PYzLS6A=e z*j3n_?09?1e0uA@n_F}8^~&PPot=fXRHr~DTuQ}D53Vo1e){eD*$*?r$Bq{E7E8re zvo+S7ohy#j%BO3C)k9 z002P#uZ@u4z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95{d-IuHN=0002;e{F;W2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J^Xw(18E|0001x|7#;8IB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yRZ zhYkb)0001h{9hX(!GQw@4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`?QJ9Hob00000b%7 z0Kg!B>uKyLgbWxkV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM X7%*VKfB^#r3>YwAz<>b*27Utpr7NOp From 7d03515b96d51d676098c4bfe4cbe385d15cbcb4 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Fri, 17 Jul 2020 11:41:12 +0300 Subject: [PATCH 16/32] Trigger build --- src/dbnode/storage/shard.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dbnode/storage/shard.go b/src/dbnode/storage/shard.go index be7bed9105..0203b2fdea 100644 --- a/src/dbnode/storage/shard.go +++ b/src/dbnode/storage/shard.go @@ -2563,7 +2563,7 @@ func (s *dbShard) AggregateTiles( VolumeIndex: latestSourceVolume, }, FileSetType: persist.FileSetFlushType, - //TODO after https://github.com/chronosphereio/m3/pull/10 for proper streaming - OrderByIndex: true + //TODO add after https://github.com/chronosphereio/m3/pull/10 for proper streaming - OrderByIndex: true } if err := reader.Open(openOpts); err != nil { return nil, err From bd248a0ac0059ce7f8b46581f41518a017750fa5 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Mon, 20 Jul 2020 10:11:13 +0300 Subject: [PATCH 17/32] Add step parameter --- .../server/tchannelthrift/node/service.go | 7 ++-- src/dbnode/storage/database.go | 3 +- src/dbnode/storage/database_test.go | 5 +-- src/dbnode/storage/namespace.go | 5 +-- src/dbnode/storage/namespace_test.go | 16 +++++++--- src/dbnode/storage/shard.go | 1 + src/dbnode/storage/shard_test.go | 3 +- src/dbnode/storage/storage_mock.go | 32 +++++++++---------- src/dbnode/storage/types.go | 5 +-- 9 files changed, 45 insertions(+), 32 deletions(-) diff --git a/src/dbnode/network/server/tchannelthrift/node/service.go b/src/dbnode/network/server/tchannelthrift/node/service.go index ce84d2dcc0..3c8dac50b9 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service.go +++ b/src/dbnode/network/server/tchannelthrift/node/service.go @@ -567,14 +567,15 @@ func (s *service) AggregateTiles(tctx thrift.Context, req *rpc.AggregateTilesReq func (s *service) aggregateTiles(ctx context.Context, db storage.Database, req *rpc.AggregateTilesRequest) error { start, rangeStartErr := convert.ToTime(req.RangeStart, req.RangeType) end, rangeEndErr := convert.ToTime(req.RangeEnd, req.RangeType) - if rangeStartErr != nil || rangeEndErr != nil { - return tterrors.NewBadRequestError(xerrors.FirstError(rangeStartErr, rangeEndErr)) + step, stepErr := time.ParseDuration(req.Step) + if rangeStartErr != nil || rangeEndErr != nil || stepErr != nil { + return tterrors.NewBadRequestError(xerrors.FirstError(rangeStartErr, rangeEndErr, stepErr)) } sourceNsID := s.pools.id.GetStringID(ctx, req.SourceNameSpace) targetNsID := s.pools.id.GetStringID(ctx, req.TargetNameSpace) - err := db.AggregateTiles(ctx, sourceNsID, targetNsID, start, end) + err := db.AggregateTiles(ctx, sourceNsID, targetNsID, start, end, step) if err != nil { return convert.ToRPCError(err) } diff --git a/src/dbnode/storage/database.go b/src/dbnode/storage/database.go index 783ca3c5f8..088226242d 100644 --- a/src/dbnode/storage/database.go +++ b/src/dbnode/storage/database.go @@ -1067,6 +1067,7 @@ func (d *db) AggregateTiles( ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time.Time, + step time.Duration, ) error { ctx, sp, sampled := ctx.StartSampledTraceSpan(tracepoint.DBAggregateTiles) if sampled { @@ -1091,7 +1092,7 @@ func (d *db) AggregateTiles( return err } - return targetNs.AggregateTiles(sourceNs, start, end) + return targetNs.AggregateTiles(sourceNs, start, end, step) } func (d *db) nextIndex() uint64 { diff --git a/src/dbnode/storage/database_test.go b/src/dbnode/storage/database_test.go index 8729858914..99bb9fe135 100644 --- a/src/dbnode/storage/database_test.go +++ b/src/dbnode/storage/database_test.go @@ -1303,11 +1303,12 @@ func TestDatabaseAggregateTiles(t *testing.T) { ctx = context.NewContext() end = time.Now().Truncate(time.Hour) start = end.Add(-time.Hour) + step = time.Minute ) sourceNs := dbAddNewMockNamespace(ctrl, d, sourceNsID.String()) targetNs := dbAddNewMockNamespace(ctrl, d, targetNsID.String()) - targetNs.EXPECT().AggregateTiles(sourceNs, start, end).Return(nil) + targetNs.EXPECT().AggregateTiles(sourceNs, start, end, step).Return(nil) - require.NoError(t, d.AggregateTiles(ctx, sourceNsID, targetNsID, start, end)) + require.NoError(t, d.AggregateTiles(ctx, sourceNsID, targetNsID, start, end, step)) } diff --git a/src/dbnode/storage/namespace.go b/src/dbnode/storage/namespace.go index 1ac5b6ddc3..1b89fbdc76 100644 --- a/src/dbnode/storage/namespace.go +++ b/src/dbnode/storage/namespace.go @@ -1590,7 +1590,7 @@ func (n *dbNamespace) nsContextWithRLock() namespace.Context { return namespace.Context{ID: n.id, Schema: n.schemaDescr} } -func (n *dbNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time.Time) error { +func (n *dbNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time.Time, step time.Duration) error { n.RLock() if n.bootstrapState != Bootstrapped { n.RUnlock() @@ -1642,7 +1642,8 @@ func (n *dbNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time multiErr = multiErr.Add(detailedErr) continue } - shardColdFlush, err := targetShard.AggregateTiles(reader, sourceNs.ID(), sourceShard, start, resources, nsCtx, onColdFlushNs) + shardColdFlush, err := targetShard.AggregateTiles( + reader, sourceNs.ID(), sourceShard, start, step, resources, nsCtx, onColdFlushNs) if err != nil { detailedErr := fmt.Errorf("shard %d failed to compact: %v", targetShard.ID(), err) multiErr = multiErr.Add(detailedErr) diff --git a/src/dbnode/storage/namespace_test.go b/src/dbnode/storage/namespace_test.go index 7c042b882b..03cf200343 100644 --- a/src/dbnode/storage/namespace_test.go +++ b/src/dbnode/storage/namespace_test.go @@ -1283,6 +1283,7 @@ func TestNamespaceAggregateTilesFailOnBootstrapping(t *testing.T) { targetNsID = ident.StringID("target") end = time.Now().Truncate(time.Hour) start = end.Add(-time.Hour) + step = time.Minute ) sourceNs, sourceCloser := newTestNamespaceWithIDOpts(t, sourceNsID, namespace.NewOptions()) @@ -1292,7 +1293,7 @@ func TestNamespaceAggregateTilesFailOnBootstrapping(t *testing.T) { defer targetCloser() targetNs.bootstrapState = Bootstrapping - require.Equal(t, errNamespaceNotBootstrapped, targetNs.AggregateTiles(sourceNs, start, end)) + require.Equal(t, errNamespaceNotBootstrapped, targetNs.AggregateTiles(sourceNs, start, end, step)) } func TestNamespaceAggregateTiles(t *testing.T) { @@ -1304,6 +1305,7 @@ func TestNamespaceAggregateTiles(t *testing.T) { targetNsID = ident.StringID("target") end = time.Now().Truncate(time.Hour) start = end.Add(-time.Hour) + step = time.Minute ) sourceNs, sourceCloser := newTestNamespaceWithIDOpts(t, sourceNsID, namespace.NewOptions()) @@ -1340,10 +1342,14 @@ func TestNamespaceAggregateTiles(t *testing.T) { shardColdFlush2.EXPECT().Done().Return(nil) sourceNsIDMatcher := ident.NewIDMatcher(sourceNsID.String()) - targetShard0.EXPECT().AggregateTiles(gomock.Any(), sourceNsIDMatcher, sourceShard0, start, gomock.Any(), nsCtx, onColdFlushNs).Return(shardColdFlush1, nil) - targetShard1.EXPECT().AggregateTiles(gomock.Any(), sourceNsIDMatcher, sourceShard1, start, gomock.Any(), nsCtx, onColdFlushNs).Return(shardColdFlush2, nil) - - require.NoError(t, targetNs.AggregateTiles(sourceNs, start, end)) + targetShard0.EXPECT().AggregateTiles( + gomock.Any(), sourceNsIDMatcher, sourceShard0, start, step, gomock.Any(), nsCtx, onColdFlushNs). + Return(shardColdFlush1, nil) + targetShard1.EXPECT().AggregateTiles( + gomock.Any(), sourceNsIDMatcher, sourceShard1, start, step, gomock.Any(), nsCtx, onColdFlushNs). + Return(shardColdFlush2, nil) + + require.NoError(t, targetNs.AggregateTiles(sourceNs, start, end, step)) } func waitForStats( diff --git a/src/dbnode/storage/shard.go b/src/dbnode/storage/shard.go index 0203b2fdea..14155e0173 100644 --- a/src/dbnode/storage/shard.go +++ b/src/dbnode/storage/shard.go @@ -2546,6 +2546,7 @@ func (s *dbShard) AggregateTiles( sourceNsID ident.ID, sourceShard databaseShard, blockStart time.Time, + step time.Duration, resources coldFlushReuseableResources, nsCtx namespace.Context, onFlush persist.OnFlushSeries, diff --git a/src/dbnode/storage/shard_test.go b/src/dbnode/storage/shard_test.go index 3f92064d36..5c4cda78a6 100644 --- a/src/dbnode/storage/shard_test.go +++ b/src/dbnode/storage/shard_test.go @@ -1746,6 +1746,7 @@ func TestAggregateTiles(t *testing.T) { var ( blockStart = time.Now().Truncate(time.Hour) + step = time.Minute ) sourceShard := testDatabaseShard(t, DefaultTestOptions()) @@ -1782,6 +1783,6 @@ func TestAggregateTiles(t *testing.T) { cfReusableResources := coldFlushReuseableResources{dirtySeries: &dirtySeriesMap{}} _, err = targetShard.AggregateTiles( - reader, sourceNsID, sourceShard, blockStart, cfReusableResources, namespace.Context{}, &persist.NoOpColdFlushNamespace{}) + reader, sourceNsID, sourceShard, blockStart, step, cfReusableResources, namespace.Context{}, &persist.NoOpColdFlushNamespace{}) require.NoError(t, err) } diff --git a/src/dbnode/storage/storage_mock.go b/src/dbnode/storage/storage_mock.go index f7f3147252..535d989bbe 100644 --- a/src/dbnode/storage/storage_mock.go +++ b/src/dbnode/storage/storage_mock.go @@ -489,17 +489,17 @@ func (mr *MockDatabaseMockRecorder) FlushState(namespace, shardID, blockStart in } // AggregateTiles mocks base method -func (m *MockDatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time.Time) error { +func (m *MockDatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time.Time, step time.Duration) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNsID, targetNsID, start, end) + ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNsID, targetNsID, start, end, step) ret0, _ := ret[0].(error) return ret0 } // AggregateTiles indicates an expected call of AggregateTiles -func (mr *MockDatabaseMockRecorder) AggregateTiles(ctx, sourceNsID, targetNsID, start, end interface{}) *gomock.Call { +func (mr *MockDatabaseMockRecorder) AggregateTiles(ctx, sourceNsID, targetNsID, start, end, step interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockDatabase)(nil).AggregateTiles), ctx, sourceNsID, targetNsID, start, end) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockDatabase)(nil).AggregateTiles), ctx, sourceNsID, targetNsID, start, end, step) } // Mockdatabase is a mock of database interface @@ -898,17 +898,17 @@ func (mr *MockdatabaseMockRecorder) FlushState(namespace, shardID, blockStart in } // AggregateTiles mocks base method -func (m *Mockdatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time.Time) error { +func (m *Mockdatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time.Time, step time.Duration) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNsID, targetNsID, start, end) + ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNsID, targetNsID, start, end, step) ret0, _ := ret[0].(error) return ret0 } // AggregateTiles indicates an expected call of AggregateTiles -func (mr *MockdatabaseMockRecorder) AggregateTiles(ctx, sourceNsID, targetNsID, start, end interface{}) *gomock.Call { +func (mr *MockdatabaseMockRecorder) AggregateTiles(ctx, sourceNsID, targetNsID, start, end, step interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*Mockdatabase)(nil).AggregateTiles), ctx, sourceNsID, targetNsID, start, end) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*Mockdatabase)(nil).AggregateTiles), ctx, sourceNsID, targetNsID, start, end, step) } // OwnedNamespaces mocks base method @@ -1561,17 +1561,17 @@ func (mr *MockdatabaseNamespaceMockRecorder) WritePendingIndexInserts(pending in } // AggregateTiles mocks base method -func (m *MockdatabaseNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time.Time) error { +func (m *MockdatabaseNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time.Time, step time.Duration) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AggregateTiles", sourceNs, start, end) + ret := m.ctrl.Call(m, "AggregateTiles", sourceNs, start, end, step) ret0, _ := ret[0].(error) return ret0 } // AggregateTiles indicates an expected call of AggregateTiles -func (mr *MockdatabaseNamespaceMockRecorder) AggregateTiles(sourceNs, start, end interface{}) *gomock.Call { +func (mr *MockdatabaseNamespaceMockRecorder) AggregateTiles(sourceNs, start, end, step interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseNamespace)(nil).AggregateTiles), sourceNs, start, end) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseNamespace)(nil).AggregateTiles), sourceNs, start, end, step) } // readableShardAt mocks base method @@ -2067,18 +2067,18 @@ func (mr *MockdatabaseShardMockRecorder) DocRef(id interface{}) *gomock.Call { } // AggregateTiles mocks base method -func (m *MockdatabaseShard) AggregateTiles(reader fs.DataFileSetReader, sourceNsID ident.ID, sourceShard databaseShard, blockStart time.Time, resources coldFlushReuseableResources, nsCtx namespace.Context, onFlush persist.OnFlushSeries) (ShardColdFlush, error) { +func (m *MockdatabaseShard) AggregateTiles(reader fs.DataFileSetReader, sourceNsID ident.ID, sourceShard databaseShard, blockStart time.Time, step time.Duration, resources coldFlushReuseableResources, nsCtx namespace.Context, onFlush persist.OnFlushSeries) (ShardColdFlush, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AggregateTiles", reader, sourceNsID, sourceShard, blockStart, resources, nsCtx, onFlush) + ret := m.ctrl.Call(m, "AggregateTiles", reader, sourceNsID, sourceShard, blockStart, step, resources, nsCtx, onFlush) ret0, _ := ret[0].(ShardColdFlush) ret1, _ := ret[1].(error) return ret0, ret1 } // AggregateTiles indicates an expected call of AggregateTiles -func (mr *MockdatabaseShardMockRecorder) AggregateTiles(reader, sourceNsID, sourceShard, blockStart, resources, nsCtx, onFlush interface{}) *gomock.Call { +func (mr *MockdatabaseShardMockRecorder) AggregateTiles(reader, sourceNsID, sourceShard, blockStart, step, resources, nsCtx, onFlush interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseShard)(nil).AggregateTiles), reader, sourceNsID, sourceShard, blockStart, resources, nsCtx, onFlush) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseShard)(nil).AggregateTiles), reader, sourceNsID, sourceShard, blockStart, step, resources, nsCtx, onFlush) } // latestVolume mocks base method diff --git a/src/dbnode/storage/types.go b/src/dbnode/storage/types.go index 9a692baa36..8323b7c276 100644 --- a/src/dbnode/storage/types.go +++ b/src/dbnode/storage/types.go @@ -221,7 +221,7 @@ type Database interface { FlushState(namespace ident.ID, shardID uint32, blockStart time.Time) (fileOpState, error) // AggregateTiles does large tile aggregation from source namespace to target namespace. - AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time.Time) error + AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time.Time, step time.Duration) error } // database is the internal database interface. @@ -410,7 +410,7 @@ type databaseNamespace interface { WritePendingIndexInserts(pending []writes.PendingIndexInsert) error // AggregateTiles does large tile aggregation from source namespace into this namespace. - AggregateTiles(sourceNs databaseNamespace, start, end time.Time) error + AggregateTiles(sourceNs databaseNamespace, start, end time.Time, step time.Duration) error readableShardAt(shardID uint32) (databaseShard, namespace.Context, error) } @@ -596,6 +596,7 @@ type databaseShard interface { sourceNsID ident.ID, sourceShard databaseShard, blockStart time.Time, + step time.Duration, resources coldFlushReuseableResources, nsCtx namespace.Context, onFlush persist.OnFlushSeries, From 7359124be6607e68246b02c32040d9d84df2d5e5 Mon Sep 17 00:00:00 2001 From: Gediminas Date: Mon, 20 Jul 2020 16:48:50 +0300 Subject: [PATCH 18/32] Write aggregated data to other namespace --- src/dbnode/storage/database.go | 4 +- src/dbnode/storage/namespace.go | 140 +++++++++++++++++++++++++------- src/dbnode/storage/shard.go | 39 +++++---- src/dbnode/storage/types.go | 16 ++-- 4 files changed, 148 insertions(+), 51 deletions(-) diff --git a/src/dbnode/storage/database.go b/src/dbnode/storage/database.go index 088226242d..4555073232 100644 --- a/src/dbnode/storage/database.go +++ b/src/dbnode/storage/database.go @@ -1092,7 +1092,9 @@ func (d *db) AggregateTiles( return err } - return targetNs.AggregateTiles(sourceNs, start, end, step) + // TODO: Create and use a dedicated persist manager + pm := d.opts.PersistManager() + return targetNs.AggregateTiles(ctx, sourceNs, start, end, step, pm) } func (d *db) nextIndex() uint64 { diff --git a/src/dbnode/storage/namespace.go b/src/dbnode/storage/namespace.go index 1b89fbdc76..ec9f1b81c1 100644 --- a/src/dbnode/storage/namespace.go +++ b/src/dbnode/storage/namespace.go @@ -155,6 +155,7 @@ type databaseNamespaceMetrics struct { flushWarmData instrument.MethodMetrics flushColdData instrument.MethodMetrics flushIndex instrument.MethodMetrics + writeAggData instrument.MethodMetrics snapshot instrument.MethodMetrics write instrument.MethodMetrics writeTagged instrument.MethodMetrics @@ -237,6 +238,7 @@ func newDatabaseNamespaceMetrics( flushWarmData: instrument.NewMethodMetrics(scope, "flushWarmData", opts), flushColdData: instrument.NewMethodMetrics(scope, "flushColdData", opts), flushIndex: instrument.NewMethodMetrics(scope, "flushIndex", opts), + writeAggData: instrument.NewMethodMetrics(scope, "writeAggData", opts), snapshot: instrument.NewMethodMetrics(scope, "snapshot", opts), write: instrument.NewMethodMetrics(scope, "write", opts), writeTagged: instrument.NewMethodMetrics(scope, "write-tagged", opts), @@ -1590,27 +1592,96 @@ func (n *dbNamespace) nsContextWithRLock() namespace.Context { return namespace.Context{ID: n.id, Schema: n.schemaDescr} } -func (n *dbNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time.Time, step time.Duration) error { +func (n *dbNamespace) AggregateTiles( + ctx context.Context, + sourceNs databaseNamespace, + start, end time.Time, + step time.Duration, + pm persist.Manager, +) error { + // NB(rartoul): This value can be used for emitting metrics, but should not be used + // for business logic. + callStart := n.nowFn() + n.RLock() if n.bootstrapState != Bootstrapped { n.RUnlock() + n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) return errNamespaceNotBootstrapped } nsCtx := n.nsContextWithRLock() targetShards := n.OwnedShards() n.RUnlock() + // If repair is enabled we still need cold flush regardless of whether cold writes is + // enabled since repairs are dependent on the cold flushing logic. + // Note: Cold writes must be enabled for Large Tiles to work. + if !n.nopts.ColdWritesEnabled() && !n.nopts.RepairEnabled() { + n.metrics.writeAggData.ReportSuccess(n.nowFn().Sub(callStart)) + return nil + } + sourceNsOpts := sourceNs.StorageOptions() reader, err := fs.NewReader(sourceNsOpts.BytesPool(), sourceNsOpts.CommitLogOptions().FilesystemOptions()) if err != nil { + n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) return err } + wOpts := series.WriteOptions{ + TruncateType: n.opts.TruncateType(), + SchemaDesc: nsCtx.Schema, + } + resources, err := newColdFlushReuseableResources(n.opts) if err != nil { + n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) return err } + // NB(bodu): Deferred targetShard cold flushes so that we can ensure that cold flush index data is + // persisted before persisting TSDB data to ensure crash consistency. + multiErr := xerrors.NewMultiError() + for _, targetShard := range targetShards { + sourceShard, _, err := sourceNs.readableShardAt(targetShard.ID()) + if err != nil { + detailedErr := fmt.Errorf("no matching shard in source namespace %s: %v", sourceNs.ID(), err) + multiErr = multiErr.Add(detailedErr) + continue + } + err = targetShard.AggregateTiles( + ctx, + reader, + sourceNs.ID(), + sourceShard, + start, + wOpts, + ) + if err != nil { + detailedErr := fmt.Errorf("shard %d aggregation failed: %v", targetShard.ID(), err) + multiErr = multiErr.Add(detailedErr) + continue + } + + multiErr = n.coldFlushSingleShard(nsCtx, targetShard, pm, resources, multiErr) + } + + res := multiErr.FinalError() + n.metrics.writeAggData.ReportSuccessOrError(res, n.nowFn().Sub(callStart)) + return res +} + +func (n *dbNamespace) coldFlushSingleShard( + nsCtx namespace.Context, + shard databaseShard, + pm persist.Manager, + resources coldFlushReuseableResources, + multiErr xerrors.MultiError, +) xerrors.MultiError { + // NB(rartoul): This value can be used for emitting metrics, but should not be used + // for business logic. + callStart := n.nowFn() + // NB(bodu): The in-mem index will lag behind the TSDB in terms of new series writes. For a period of // time between when we rotate out the active cold mutable index segments (happens here) and when // we actually cold flush the data to disk we will be making writes to the newly active mutable seg. @@ -1618,38 +1689,42 @@ func (n *dbNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time // where they will be evicted from the in-mem index. var ( onColdFlushDone OnColdFlushDone + err error ) if n.reverseIndex != nil { - onColdFlushDone, err = n.reverseIndex.ColdFlush(targetShards) + onColdFlushDone, err = n.reverseIndex.ColdFlush([]databaseShard{shard}) if err != nil { - return err + n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) + return multiErr.Add( + fmt.Errorf("error preparing to coldflush a reverse index for shard %d: %v", + shard.ID(), + err)) } } onColdFlushNs, err := n.opts.OnColdFlush().ColdFlushNamespace(n) if err != nil { - return err + n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) + return multiErr.Add( + fmt.Errorf("error preparing to coldflush a namespace for shard %d: %v", + shard.ID(), + err)) } - // NB(bodu): Deferred targetShard cold flushes so that we can ensure that cold flush index data is - // persisted before persisting TSDB data to ensure crash consistency. - multiErr := xerrors.NewMultiError() - shardColdFlushes := make([]ShardColdFlush, 0, len(targetShards)) - for _, targetShard := range targetShards { - sourceShard, _, err := sourceNs.readableShardAt(targetShard.ID()) - if err != nil { - detailedErr := fmt.Errorf("no matching shard in source namespace %s: %v", sourceNs.ID(), err) - multiErr = multiErr.Add(detailedErr) - continue - } - shardColdFlush, err := targetShard.AggregateTiles( - reader, sourceNs.ID(), sourceShard, start, step, resources, nsCtx, onColdFlushNs) - if err != nil { - detailedErr := fmt.Errorf("shard %d failed to compact: %v", targetShard.ID(), err) - multiErr = multiErr.Add(detailedErr) - continue - } - shardColdFlushes = append(shardColdFlushes, shardColdFlush) + flushPersist, err := pm.StartFlushPersist() + if err != nil { + n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) + return multiErr.Add( + fmt.Errorf("error starting flush persist for shard %d: %v", + shard.ID(), + err)) + } + + localErrors := xerrors.NewMultiError() + shardColdFlush, err := shard.ColdFlush(flushPersist, resources, nsCtx, onColdFlushNs) + if err != nil { + detailedErr := fmt.Errorf("shard %d failed to compact: %v", shard.ID(), err) + localErrors = localErrors.Add(detailedErr) } // We go through this error checking process to allow for partially successful flushes. @@ -1662,12 +1737,19 @@ func (n *dbNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time if indexColdFlushError == nil { // NB(bodu): We only want to complete data cold flushes if the index cold flush // is successful. If index cold flush is successful, we want to attempt writing - // of checkpoint files to complete the cold data flush lifecycle for successful targetShards. - for _, shardColdFlush := range shardColdFlushes { - multiErr = multiErr.Add(shardColdFlush.Done()) - } + // of checkpoint files to complete the cold data flush lifecycle for successful shards. + localErrors = localErrors.Add(shardColdFlush.Done()) } - multiErr = multiErr.Add(indexColdFlushError) + localErrors = localErrors.Add(indexColdFlushError) + err = flushPersist.DoneFlush() + localErrors = multiErr.Add(err) - return multiErr.FinalError() + res := localErrors.FinalError() + n.metrics.writeAggData.ReportSuccessOrError(res, n.nowFn().Sub(callStart)) + + for _, err := range localErrors.Errors() { + multiErr = multiErr.Add(err) + } + + return multiErr } diff --git a/src/dbnode/storage/shard.go b/src/dbnode/storage/shard.go index 14155e0173..4bb71c6693 100644 --- a/src/dbnode/storage/shard.go +++ b/src/dbnode/storage/shard.go @@ -25,14 +25,14 @@ import ( "container/list" "errors" "fmt" - "github.com/m3db/m3/src/dbnode/encoding" - "github.com/m3db/m3/src/dbnode/encoding/m3tsz" "io" "math" "sync" "time" "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/encoding/m3tsz" "github.com/m3db/m3/src/dbnode/generated/proto/pagetoken" "github.com/m3db/m3/src/dbnode/namespace" "github.com/m3db/m3/src/dbnode/persist" @@ -213,6 +213,7 @@ type dbShardMetrics struct { insertAsyncWriteInternalErrors tally.Counter insertAsyncWriteInvalidParamsErrors tally.Counter insertAsyncIndexErrors tally.Counter + largeTilesWriteErrors tally.Counter } func newDatabaseShardMetrics(shardID uint32, scope tally.Scope) dbShardMetrics { @@ -241,6 +242,10 @@ func newDatabaseShardMetrics(shardID uint32, scope tally.Scope) dbShardMetrics { "error_type": "reverse-index", "suberror_type": "write-batch-error", }).Counter(insertErrorName), + largeTilesWriteErrors: scope.Tagged(map[string]string{ + "error_type": "large_tiles", + "suberror_type": "write-error", + }).Counter(insertErrorName), } } @@ -2542,18 +2547,16 @@ func (s *dbShard) Repair( } func (s *dbShard) AggregateTiles( + ctx context.Context, reader fs.DataFileSetReader, sourceNsID ident.ID, sourceShard databaseShard, blockStart time.Time, - step time.Duration, - resources coldFlushReuseableResources, - nsCtx namespace.Context, - onFlush persist.OnFlushSeries, -) (ShardColdFlush, error) { + wOpts series.WriteOptions, +) error { latestSourceVolume, err := sourceShard.latestVolume(blockStart) if err != nil { - return nil, err + return err } openOpts := fs.DataReaderOpenOptions{ @@ -2567,29 +2570,36 @@ func (s *dbShard) AggregateTiles( //TODO add after https://github.com/chronosphereio/m3/pull/10 for proper streaming - OrderByIndex: true } if err := reader.Open(openOpts); err != nil { - return nil, err + return err } defer reader.Close() encodingOpts := encoding.NewOptions().SetBytesPool(s.opts.BytesPool()) bytesReader := bytes.NewReader(nil) dataPointIter := m3tsz.NewReaderIterator(bytesReader, true, encodingOpts) + var lastWriteError error for { - id, tags, data, checksum, err := reader.Read() + id, tags, data, _, err := reader.Read() if err == io.EOF { break } if err != nil { - return nil, err + return err } data.IncRef() bytesReader.Reset(data.Bytes()) dataPointIter.Reset(bytesReader, nil) - //TODO persist the data from dataPointIter - _, _, _ = id, tags, checksum + for dataPointIter.Next() { + dp, unit, annot := dataPointIter.Current() + _, err = s.writeAndIndex(ctx, id, tags, dp.Timestamp, dp.Value, unit, annot, wOpts, true) + if err != nil { + s.metrics.largeTilesWriteErrors.Inc(1) + lastWriteError = err + } + } dataPointIter.Close() @@ -2597,8 +2607,7 @@ func (s *dbShard) AggregateTiles( data.Finalize() } - var flush persist.FlushPreparer //FIXME what is this? - return s.ColdFlush(flush, resources, nsCtx, onFlush) + return lastWriteError } func (s *dbShard) BootstrapState() BootstrapState { diff --git a/src/dbnode/storage/types.go b/src/dbnode/storage/types.go index 8323b7c276..7377f564e9 100644 --- a/src/dbnode/storage/types.go +++ b/src/dbnode/storage/types.go @@ -410,7 +410,13 @@ type databaseNamespace interface { WritePendingIndexInserts(pending []writes.PendingIndexInsert) error // AggregateTiles does large tile aggregation from source namespace into this namespace. - AggregateTiles(sourceNs databaseNamespace, start, end time.Time, step time.Duration) error + AggregateTiles( + ctx context.Context, + sourceNs databaseNamespace, + start, end time.Time, + step time.Duration, + pm persist.Manager, + ) error readableShardAt(shardID uint32) (databaseShard, namespace.Context, error) } @@ -592,15 +598,13 @@ type databaseShard interface { // AggregateTiles does large tile aggregation from source shards into this shard. AggregateTiles( + ctx context.Context, reader fs.DataFileSetReader, sourceNsID ident.ID, sourceShard databaseShard, blockStart time.Time, - step time.Duration, - resources coldFlushReuseableResources, - nsCtx namespace.Context, - onFlush persist.OnFlushSeries, - ) (ShardColdFlush, error) + wOpts series.WriteOptions, + ) error latestVolume(blockStart time.Time) (int, error) } From 12ebe54b6565d1cbd9ec8e92fd2d99722ea17a90 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Tue, 21 Jul 2020 09:54:41 +0300 Subject: [PATCH 19/32] Fix tests --- .../tchannelthrift/node/service_test.go | 2 + src/dbnode/storage/database_test.go | 5 ++- src/dbnode/storage/namespace.go | 1 + src/dbnode/storage/namespace_test.go | 40 +++++++++++-------- src/dbnode/storage/shard.go | 1 + src/dbnode/storage/shard_test.go | 8 +--- src/dbnode/storage/storage_mock.go | 21 +++++----- src/dbnode/storage/types.go | 1 + 8 files changed, 44 insertions(+), 35 deletions(-) diff --git a/src/dbnode/network/server/tchannelthrift/node/service_test.go b/src/dbnode/network/server/tchannelthrift/node/service_test.go index 34dcbba1a0..64fe5e35ba 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service_test.go +++ b/src/dbnode/network/server/tchannelthrift/node/service_test.go @@ -3038,6 +3038,7 @@ func TestServiceAggregateTiles(t *testing.T) { start, end = start.Truncate(time.Second), end.Truncate(time.Second) step := "2h" + stepDuration, _ := time.ParseDuration(step) sourceNsID := "source" targetNsID := "target" @@ -3048,6 +3049,7 @@ func TestServiceAggregateTiles(t *testing.T) { ident.NewIDMatcher(targetNsID), start, end, + stepDuration, ).Return(nil) _, err := service.AggregateTiles(tctx, &rpc.AggregateTilesRequest{ diff --git a/src/dbnode/storage/database_test.go b/src/dbnode/storage/database_test.go index 99bb9fe135..61f6121d12 100644 --- a/src/dbnode/storage/database_test.go +++ b/src/dbnode/storage/database_test.go @@ -1301,14 +1301,15 @@ func TestDatabaseAggregateTiles(t *testing.T) { sourceNsID = ident.StringID("source") targetNsID = ident.StringID("target") ctx = context.NewContext() + pm = d.opts.PersistManager() end = time.Now().Truncate(time.Hour) start = end.Add(-time.Hour) - step = time.Minute + step = time.Minute ) sourceNs := dbAddNewMockNamespace(ctrl, d, sourceNsID.String()) targetNs := dbAddNewMockNamespace(ctrl, d, targetNsID.String()) - targetNs.EXPECT().AggregateTiles(sourceNs, start, end, step).Return(nil) + targetNs.EXPECT().AggregateTiles(ctx, sourceNs, start, end, step, pm).Return(nil) require.NoError(t, d.AggregateTiles(ctx, sourceNsID, targetNsID, start, end, step)) } diff --git a/src/dbnode/storage/namespace.go b/src/dbnode/storage/namespace.go index ec9f1b81c1..e2076e3dfa 100644 --- a/src/dbnode/storage/namespace.go +++ b/src/dbnode/storage/namespace.go @@ -1655,6 +1655,7 @@ func (n *dbNamespace) AggregateTiles( sourceNs.ID(), sourceShard, start, + step, wOpts, ) if err != nil { diff --git a/src/dbnode/storage/namespace_test.go b/src/dbnode/storage/namespace_test.go index 03cf200343..1b63c7a4a5 100644 --- a/src/dbnode/storage/namespace_test.go +++ b/src/dbnode/storage/namespace_test.go @@ -30,6 +30,7 @@ import ( "github.com/m3db/m3/src/cluster/shard" "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/persist/fs" "github.com/m3db/m3/src/dbnode/retention" "github.com/m3db/m3/src/dbnode/runtime" "github.com/m3db/m3/src/dbnode/sharding" @@ -1281,6 +1282,8 @@ func TestNamespaceAggregateTilesFailOnBootstrapping(t *testing.T) { var ( sourceNsID = ident.StringID("source") targetNsID = ident.StringID("target") + ctx = context.NewContext() + pm, _ = fs.NewPersistManager(fs.NewOptions()) end = time.Now().Truncate(time.Hour) start = end.Add(-time.Hour) step = time.Minute @@ -1293,7 +1296,7 @@ func TestNamespaceAggregateTilesFailOnBootstrapping(t *testing.T) { defer targetCloser() targetNs.bootstrapState = Bootstrapping - require.Equal(t, errNamespaceNotBootstrapped, targetNs.AggregateTiles(sourceNs, start, end, step)) + require.Equal(t, errNamespaceNotBootstrapped, targetNs.AggregateTiles(ctx, sourceNs, start, end, step, pm)) } func TestNamespaceAggregateTiles(t *testing.T) { @@ -1303,6 +1306,8 @@ func TestNamespaceAggregateTiles(t *testing.T) { var ( sourceNsID = ident.StringID("source") targetNsID = ident.StringID("target") + ctx = context.NewContext() + pm, _ = fs.NewPersistManager(fs.NewOptions()) end = time.Now().Truncate(time.Hour) start = end.Add(-time.Hour) step = time.Minute @@ -1314,11 +1319,12 @@ func TestNamespaceAggregateTiles(t *testing.T) { targetNs, targetCloser := newTestNamespaceWithIDOpts(t, targetNsID, namespace.NewOptions()) defer targetCloser() targetNs.bootstrapState = Bootstrapped + targetNs.nopts = targetNs.nopts.SetColdWritesEnabled(true) - nsCtx := targetNs.nsContextWithRLock() - - onColdFlushNs, err := targetNs.opts.OnColdFlush().ColdFlushNamespace(targetNs) - require.NoError(t, err) + wOpts := series.WriteOptions{ + TruncateType: targetNs.opts.TruncateType(), + SchemaDesc: targetNs.Schema(), + } sourceShard0 := NewMockdatabaseShard(ctrl) sourceShard1 := NewMockdatabaseShard(ctrl) @@ -1336,20 +1342,22 @@ func TestNamespaceAggregateTiles(t *testing.T) { targetShard0.EXPECT().ID().Return(uint32(0)) targetShard1.EXPECT().ID().Return(uint32(1)) + sourceNsIDMatcher := ident.NewIDMatcher(sourceNsID.String()) + targetShard0.EXPECT().AggregateTiles(ctx, gomock.Any(), sourceNsIDMatcher, sourceShard0, start, step, wOpts).Return(nil) + targetShard1.EXPECT().AggregateTiles(ctx, gomock.Any(), sourceNsIDMatcher, sourceShard1, start, step, wOpts).Return(nil) + + shardColdFlush0 := NewMockShardColdFlush(ctrl) + shardColdFlush0.EXPECT().Done().Return(nil) shardColdFlush1 := NewMockShardColdFlush(ctrl) shardColdFlush1.EXPECT().Done().Return(nil) - shardColdFlush2 := NewMockShardColdFlush(ctrl) - shardColdFlush2.EXPECT().Done().Return(nil) - sourceNsIDMatcher := ident.NewIDMatcher(sourceNsID.String()) - targetShard0.EXPECT().AggregateTiles( - gomock.Any(), sourceNsIDMatcher, sourceShard0, start, step, gomock.Any(), nsCtx, onColdFlushNs). - Return(shardColdFlush1, nil) - targetShard1.EXPECT().AggregateTiles( - gomock.Any(), sourceNsIDMatcher, sourceShard1, start, step, gomock.Any(), nsCtx, onColdFlushNs). - Return(shardColdFlush2, nil) - - require.NoError(t, targetNs.AggregateTiles(sourceNs, start, end, step)) + nsCtx := targetNs.nsContextWithRLock() + onColdFlushNs, err := targetNs.opts.OnColdFlush().ColdFlushNamespace(targetNs) + require.NoError(t, err) + targetShard0.EXPECT().ColdFlush(gomock.Any(), gomock.Any(), nsCtx, onColdFlushNs).Return(shardColdFlush0, nil) + targetShard1.EXPECT().ColdFlush(gomock.Any(), gomock.Any(), nsCtx, onColdFlushNs).Return(shardColdFlush1, nil) + + require.NoError(t, targetNs.AggregateTiles(ctx, sourceNs, start, end, step, pm)) } func waitForStats( diff --git a/src/dbnode/storage/shard.go b/src/dbnode/storage/shard.go index 4bb71c6693..089625e3a8 100644 --- a/src/dbnode/storage/shard.go +++ b/src/dbnode/storage/shard.go @@ -2552,6 +2552,7 @@ func (s *dbShard) AggregateTiles( sourceNsID ident.ID, sourceShard databaseShard, blockStart time.Time, + step time.Duration, wOpts series.WriteOptions, ) error { latestSourceVolume, err := sourceShard.latestVolume(blockStart) diff --git a/src/dbnode/storage/shard_test.go b/src/dbnode/storage/shard_test.go index 5c4cda78a6..2e3a9f5bc5 100644 --- a/src/dbnode/storage/shard_test.go +++ b/src/dbnode/storage/shard_test.go @@ -1745,6 +1745,7 @@ func TestAggregateTiles(t *testing.T) { defer ctrl.Finish() var ( + ctx = context.NewContext() blockStart = time.Now().Truncate(time.Hour) step = time.Minute ) @@ -1778,11 +1779,6 @@ func TestAggregateTiles(t *testing.T) { Return(nil, nil, nil, uint32(0), io.EOF) reader.EXPECT().Close() - //FIXME - this should most likely be removed once the actual writes are integrated: - targetShard.flushState.initialized = true - cfReusableResources := coldFlushReuseableResources{dirtySeries: &dirtySeriesMap{}} - - _, err = targetShard.AggregateTiles( - reader, sourceNsID, sourceShard, blockStart, step, cfReusableResources, namespace.Context{}, &persist.NoOpColdFlushNamespace{}) + err = targetShard.AggregateTiles(ctx, reader, sourceNsID, sourceShard, blockStart, step, series.WriteOptions{}) require.NoError(t, err) } diff --git a/src/dbnode/storage/storage_mock.go b/src/dbnode/storage/storage_mock.go index 535d989bbe..7daeba1782 100644 --- a/src/dbnode/storage/storage_mock.go +++ b/src/dbnode/storage/storage_mock.go @@ -1561,17 +1561,17 @@ func (mr *MockdatabaseNamespaceMockRecorder) WritePendingIndexInserts(pending in } // AggregateTiles mocks base method -func (m *MockdatabaseNamespace) AggregateTiles(sourceNs databaseNamespace, start, end time.Time, step time.Duration) error { +func (m *MockdatabaseNamespace) AggregateTiles(ctx context.Context, sourceNs databaseNamespace, start, end time.Time, step time.Duration, pm persist.Manager) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AggregateTiles", sourceNs, start, end, step) + ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNs, start, end, step, pm) ret0, _ := ret[0].(error) return ret0 } // AggregateTiles indicates an expected call of AggregateTiles -func (mr *MockdatabaseNamespaceMockRecorder) AggregateTiles(sourceNs, start, end, step interface{}) *gomock.Call { +func (mr *MockdatabaseNamespaceMockRecorder) AggregateTiles(ctx, sourceNs, start, end, step, pm interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseNamespace)(nil).AggregateTiles), sourceNs, start, end, step) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseNamespace)(nil).AggregateTiles), ctx, sourceNs, start, end, step, pm) } // readableShardAt mocks base method @@ -2067,18 +2067,17 @@ func (mr *MockdatabaseShardMockRecorder) DocRef(id interface{}) *gomock.Call { } // AggregateTiles mocks base method -func (m *MockdatabaseShard) AggregateTiles(reader fs.DataFileSetReader, sourceNsID ident.ID, sourceShard databaseShard, blockStart time.Time, step time.Duration, resources coldFlushReuseableResources, nsCtx namespace.Context, onFlush persist.OnFlushSeries) (ShardColdFlush, error) { +func (m *MockdatabaseShard) AggregateTiles(ctx context.Context, reader fs.DataFileSetReader, sourceNsID ident.ID, sourceShard databaseShard, blockStart time.Time, step time.Duration, wOpts series.WriteOptions) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AggregateTiles", reader, sourceNsID, sourceShard, blockStart, step, resources, nsCtx, onFlush) - ret0, _ := ret[0].(ShardColdFlush) - ret1, _ := ret[1].(error) - return ret0, ret1 + ret := m.ctrl.Call(m, "AggregateTiles", ctx, reader, sourceNsID, sourceShard, blockStart, step, wOpts) + ret0, _ := ret[0].(error) + return ret0 } // AggregateTiles indicates an expected call of AggregateTiles -func (mr *MockdatabaseShardMockRecorder) AggregateTiles(reader, sourceNsID, sourceShard, blockStart, step, resources, nsCtx, onFlush interface{}) *gomock.Call { +func (mr *MockdatabaseShardMockRecorder) AggregateTiles(ctx, reader, sourceNsID, sourceShard, blockStart, step, wOpts interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseShard)(nil).AggregateTiles), reader, sourceNsID, sourceShard, blockStart, step, resources, nsCtx, onFlush) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseShard)(nil).AggregateTiles), ctx, reader, sourceNsID, sourceShard, blockStart, step, wOpts) } // latestVolume mocks base method diff --git a/src/dbnode/storage/types.go b/src/dbnode/storage/types.go index 7377f564e9..02881c4942 100644 --- a/src/dbnode/storage/types.go +++ b/src/dbnode/storage/types.go @@ -603,6 +603,7 @@ type databaseShard interface { sourceNsID ident.ID, sourceShard databaseShard, blockStart time.Time, + step time.Duration, wOpts series.WriteOptions, ) error From 3ef69206a2d3e90d000287e8c1cb195701f5d87f Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Tue, 21 Jul 2020 10:26:19 +0300 Subject: [PATCH 20/32] Introduced AggregateTilesOptions --- .../server/tchannelthrift/node/service.go | 4 ++- .../tchannelthrift/node/service_test.go | 4 +-- src/dbnode/storage/database.go | 14 +++----- src/dbnode/storage/database_test.go | 8 ++--- src/dbnode/storage/namespace.go | 13 ++------ src/dbnode/storage/namespace_test.go | 16 ++++------ src/dbnode/storage/shard.go | 7 ++-- src/dbnode/storage/shard_test.go | 9 +++--- src/dbnode/storage/storage_mock.go | 32 +++++++++---------- src/dbnode/storage/types.go | 13 +++++--- 10 files changed, 51 insertions(+), 69 deletions(-) diff --git a/src/dbnode/network/server/tchannelthrift/node/service.go b/src/dbnode/network/server/tchannelthrift/node/service.go index 3c8dac50b9..8e6e80838e 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service.go +++ b/src/dbnode/network/server/tchannelthrift/node/service.go @@ -575,7 +575,9 @@ func (s *service) aggregateTiles(ctx context.Context, db storage.Database, req * sourceNsID := s.pools.id.GetStringID(ctx, req.SourceNameSpace) targetNsID := s.pools.id.GetStringID(ctx, req.TargetNameSpace) - err := db.AggregateTiles(ctx, sourceNsID, targetNsID, start, end, step) + opts := storage.AggregateTilesOptions{Start: start, End: end, Step: step} + + err := db.AggregateTiles(ctx, sourceNsID, targetNsID, opts) if err != nil { return convert.ToRPCError(err) } diff --git a/src/dbnode/network/server/tchannelthrift/node/service_test.go b/src/dbnode/network/server/tchannelthrift/node/service_test.go index 64fe5e35ba..6a73f0dcab 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service_test.go +++ b/src/dbnode/network/server/tchannelthrift/node/service_test.go @@ -3047,9 +3047,7 @@ func TestServiceAggregateTiles(t *testing.T) { ctx, ident.NewIDMatcher(sourceNsID), ident.NewIDMatcher(targetNsID), - start, - end, - stepDuration, + storage.AggregateTilesOptions{Start: start, End: end, Step: stepDuration}, ).Return(nil) _, err := service.AggregateTiles(tctx, &rpc.AggregateTilesRequest{ diff --git a/src/dbnode/storage/database.go b/src/dbnode/storage/database.go index 4555073232..6782611520 100644 --- a/src/dbnode/storage/database.go +++ b/src/dbnode/storage/database.go @@ -1063,19 +1063,15 @@ func (d *db) OwnedNamespaces() ([]databaseNamespace, error) { return d.ownedNamespacesWithLock(), nil } -func (d *db) AggregateTiles( - ctx context.Context, - sourceNsID, targetNsID ident.ID, - start, end time.Time, - step time.Duration, -) error { +func (d *db) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, opts AggregateTilesOptions) error { ctx, sp, sampled := ctx.StartSampledTraceSpan(tracepoint.DBAggregateTiles) if sampled { sp.LogFields( opentracinglog.String("sourceNameSpace", sourceNsID.String()), opentracinglog.String("targetNameSpace", targetNsID.String()), - xopentracing.Time("start", start), - xopentracing.Time("end", end), + xopentracing.Time("start", opts.Start), + xopentracing.Time("end", opts.End), + xopentracing.Duration("step", opts.Step), ) } defer sp.Finish() @@ -1094,7 +1090,7 @@ func (d *db) AggregateTiles( // TODO: Create and use a dedicated persist manager pm := d.opts.PersistManager() - return targetNs.AggregateTiles(ctx, sourceNs, start, end, step, pm) + return targetNs.AggregateTiles(ctx, sourceNs, opts, pm) } func (d *db) nextIndex() uint64 { diff --git a/src/dbnode/storage/database_test.go b/src/dbnode/storage/database_test.go index 61f6121d12..8b62363d90 100644 --- a/src/dbnode/storage/database_test.go +++ b/src/dbnode/storage/database_test.go @@ -1302,14 +1302,12 @@ func TestDatabaseAggregateTiles(t *testing.T) { targetNsID = ident.StringID("target") ctx = context.NewContext() pm = d.opts.PersistManager() - end = time.Now().Truncate(time.Hour) - start = end.Add(-time.Hour) - step = time.Minute + opts = AggregateTilesOptions{Start: time.Now().Truncate(time.Hour)} ) sourceNs := dbAddNewMockNamespace(ctrl, d, sourceNsID.String()) targetNs := dbAddNewMockNamespace(ctrl, d, targetNsID.String()) - targetNs.EXPECT().AggregateTiles(ctx, sourceNs, start, end, step, pm).Return(nil) + targetNs.EXPECT().AggregateTiles(ctx, sourceNs, opts, pm).Return(nil) - require.NoError(t, d.AggregateTiles(ctx, sourceNsID, targetNsID, start, end, step)) + require.NoError(t, d.AggregateTiles(ctx, sourceNsID, targetNsID, opts)) } diff --git a/src/dbnode/storage/namespace.go b/src/dbnode/storage/namespace.go index e2076e3dfa..71682090df 100644 --- a/src/dbnode/storage/namespace.go +++ b/src/dbnode/storage/namespace.go @@ -1595,8 +1595,7 @@ func (n *dbNamespace) nsContextWithRLock() namespace.Context { func (n *dbNamespace) AggregateTiles( ctx context.Context, sourceNs databaseNamespace, - start, end time.Time, - step time.Duration, + opts AggregateTilesOptions, pm persist.Manager, ) error { // NB(rartoul): This value can be used for emitting metrics, but should not be used @@ -1649,15 +1648,7 @@ func (n *dbNamespace) AggregateTiles( multiErr = multiErr.Add(detailedErr) continue } - err = targetShard.AggregateTiles( - ctx, - reader, - sourceNs.ID(), - sourceShard, - start, - step, - wOpts, - ) + err = targetShard.AggregateTiles(ctx, reader, sourceNs.ID(), sourceShard, opts, wOpts) if err != nil { detailedErr := fmt.Errorf("shard %d aggregation failed: %v", targetShard.ID(), err) multiErr = multiErr.Add(detailedErr) diff --git a/src/dbnode/storage/namespace_test.go b/src/dbnode/storage/namespace_test.go index 1b63c7a4a5..d6a20b5f4d 100644 --- a/src/dbnode/storage/namespace_test.go +++ b/src/dbnode/storage/namespace_test.go @@ -1284,9 +1284,7 @@ func TestNamespaceAggregateTilesFailOnBootstrapping(t *testing.T) { targetNsID = ident.StringID("target") ctx = context.NewContext() pm, _ = fs.NewPersistManager(fs.NewOptions()) - end = time.Now().Truncate(time.Hour) - start = end.Add(-time.Hour) - step = time.Minute + opts = AggregateTilesOptions{Start: time.Now().Truncate(time.Hour)} ) sourceNs, sourceCloser := newTestNamespaceWithIDOpts(t, sourceNsID, namespace.NewOptions()) @@ -1296,7 +1294,7 @@ func TestNamespaceAggregateTilesFailOnBootstrapping(t *testing.T) { defer targetCloser() targetNs.bootstrapState = Bootstrapping - require.Equal(t, errNamespaceNotBootstrapped, targetNs.AggregateTiles(ctx, sourceNs, start, end, step, pm)) + require.Equal(t, errNamespaceNotBootstrapped, targetNs.AggregateTiles(ctx, sourceNs, opts, pm)) } func TestNamespaceAggregateTiles(t *testing.T) { @@ -1308,9 +1306,7 @@ func TestNamespaceAggregateTiles(t *testing.T) { targetNsID = ident.StringID("target") ctx = context.NewContext() pm, _ = fs.NewPersistManager(fs.NewOptions()) - end = time.Now().Truncate(time.Hour) - start = end.Add(-time.Hour) - step = time.Minute + opts = AggregateTilesOptions{Start: time.Now().Truncate(time.Hour)} ) sourceNs, sourceCloser := newTestNamespaceWithIDOpts(t, sourceNsID, namespace.NewOptions()) @@ -1343,8 +1339,8 @@ func TestNamespaceAggregateTiles(t *testing.T) { targetShard1.EXPECT().ID().Return(uint32(1)) sourceNsIDMatcher := ident.NewIDMatcher(sourceNsID.String()) - targetShard0.EXPECT().AggregateTiles(ctx, gomock.Any(), sourceNsIDMatcher, sourceShard0, start, step, wOpts).Return(nil) - targetShard1.EXPECT().AggregateTiles(ctx, gomock.Any(), sourceNsIDMatcher, sourceShard1, start, step, wOpts).Return(nil) + targetShard0.EXPECT().AggregateTiles(ctx, gomock.Any(), sourceNsIDMatcher, sourceShard0, opts, wOpts).Return(nil) + targetShard1.EXPECT().AggregateTiles(ctx, gomock.Any(), sourceNsIDMatcher, sourceShard1, opts, wOpts).Return(nil) shardColdFlush0 := NewMockShardColdFlush(ctrl) shardColdFlush0.EXPECT().Done().Return(nil) @@ -1357,7 +1353,7 @@ func TestNamespaceAggregateTiles(t *testing.T) { targetShard0.EXPECT().ColdFlush(gomock.Any(), gomock.Any(), nsCtx, onColdFlushNs).Return(shardColdFlush0, nil) targetShard1.EXPECT().ColdFlush(gomock.Any(), gomock.Any(), nsCtx, onColdFlushNs).Return(shardColdFlush1, nil) - require.NoError(t, targetNs.AggregateTiles(ctx, sourceNs, start, end, step, pm)) + require.NoError(t, targetNs.AggregateTiles(ctx, sourceNs, opts, pm)) } func waitForStats( diff --git a/src/dbnode/storage/shard.go b/src/dbnode/storage/shard.go index 089625e3a8..154e4fc04d 100644 --- a/src/dbnode/storage/shard.go +++ b/src/dbnode/storage/shard.go @@ -2551,11 +2551,10 @@ func (s *dbShard) AggregateTiles( reader fs.DataFileSetReader, sourceNsID ident.ID, sourceShard databaseShard, - blockStart time.Time, - step time.Duration, + opts AggregateTilesOptions, wOpts series.WriteOptions, ) error { - latestSourceVolume, err := sourceShard.latestVolume(blockStart) + latestSourceVolume, err := sourceShard.latestVolume(opts.Start) if err != nil { return err } @@ -2564,7 +2563,7 @@ func (s *dbShard) AggregateTiles( Identifier: fs.FileSetFileIdentifier{ Namespace: sourceNsID, Shard: sourceShard.ID(), - BlockStart: blockStart, + BlockStart: opts.Start, VolumeIndex: latestSourceVolume, }, FileSetType: persist.FileSetFlushType, diff --git a/src/dbnode/storage/shard_test.go b/src/dbnode/storage/shard_test.go index 2e3a9f5bc5..6e0c4ec768 100644 --- a/src/dbnode/storage/shard_test.go +++ b/src/dbnode/storage/shard_test.go @@ -1746,8 +1746,7 @@ func TestAggregateTiles(t *testing.T) { var ( ctx = context.NewContext() - blockStart = time.Now().Truncate(time.Hour) - step = time.Minute + opts = AggregateTilesOptions{Start: time.Now().Truncate(time.Hour)} ) sourceShard := testDatabaseShard(t, DefaultTestOptions()) @@ -1758,7 +1757,7 @@ func TestAggregateTiles(t *testing.T) { targetShard.bootstrapState = Bootstrapped - latestSourceVolume, err := sourceShard.latestVolume(blockStart) + latestSourceVolume, err := sourceShard.latestVolume(opts.Start) require.NoError(t, err) sourceNsID := sourceShard.namespace.ID() @@ -1766,7 +1765,7 @@ func TestAggregateTiles(t *testing.T) { Identifier: fs.FileSetFileIdentifier{ Namespace: sourceNsID, Shard: sourceShard.ID(), - BlockStart: blockStart, + BlockStart: opts.Start, VolumeIndex: latestSourceVolume, }, FileSetType: persist.FileSetFlushType, @@ -1779,6 +1778,6 @@ func TestAggregateTiles(t *testing.T) { Return(nil, nil, nil, uint32(0), io.EOF) reader.EXPECT().Close() - err = targetShard.AggregateTiles(ctx, reader, sourceNsID, sourceShard, blockStart, step, series.WriteOptions{}) + err = targetShard.AggregateTiles(ctx, reader, sourceNsID, sourceShard, opts, series.WriteOptions{}) require.NoError(t, err) } diff --git a/src/dbnode/storage/storage_mock.go b/src/dbnode/storage/storage_mock.go index 7daeba1782..16e371d49e 100644 --- a/src/dbnode/storage/storage_mock.go +++ b/src/dbnode/storage/storage_mock.go @@ -489,17 +489,17 @@ func (mr *MockDatabaseMockRecorder) FlushState(namespace, shardID, blockStart in } // AggregateTiles mocks base method -func (m *MockDatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time.Time, step time.Duration) error { +func (m *MockDatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, opts AggregateTilesOptions) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNsID, targetNsID, start, end, step) + ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNsID, targetNsID, opts) ret0, _ := ret[0].(error) return ret0 } // AggregateTiles indicates an expected call of AggregateTiles -func (mr *MockDatabaseMockRecorder) AggregateTiles(ctx, sourceNsID, targetNsID, start, end, step interface{}) *gomock.Call { +func (mr *MockDatabaseMockRecorder) AggregateTiles(ctx, sourceNsID, targetNsID, opts interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockDatabase)(nil).AggregateTiles), ctx, sourceNsID, targetNsID, start, end, step) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockDatabase)(nil).AggregateTiles), ctx, sourceNsID, targetNsID, opts) } // Mockdatabase is a mock of database interface @@ -898,17 +898,17 @@ func (mr *MockdatabaseMockRecorder) FlushState(namespace, shardID, blockStart in } // AggregateTiles mocks base method -func (m *Mockdatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time.Time, step time.Duration) error { +func (m *Mockdatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, opts AggregateTilesOptions) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNsID, targetNsID, start, end, step) + ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNsID, targetNsID, opts) ret0, _ := ret[0].(error) return ret0 } // AggregateTiles indicates an expected call of AggregateTiles -func (mr *MockdatabaseMockRecorder) AggregateTiles(ctx, sourceNsID, targetNsID, start, end, step interface{}) *gomock.Call { +func (mr *MockdatabaseMockRecorder) AggregateTiles(ctx, sourceNsID, targetNsID, opts interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*Mockdatabase)(nil).AggregateTiles), ctx, sourceNsID, targetNsID, start, end, step) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*Mockdatabase)(nil).AggregateTiles), ctx, sourceNsID, targetNsID, opts) } // OwnedNamespaces mocks base method @@ -1561,17 +1561,17 @@ func (mr *MockdatabaseNamespaceMockRecorder) WritePendingIndexInserts(pending in } // AggregateTiles mocks base method -func (m *MockdatabaseNamespace) AggregateTiles(ctx context.Context, sourceNs databaseNamespace, start, end time.Time, step time.Duration, pm persist.Manager) error { +func (m *MockdatabaseNamespace) AggregateTiles(ctx context.Context, sourceNs databaseNamespace, opts AggregateTilesOptions, pm persist.Manager) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNs, start, end, step, pm) + ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNs, opts, pm) ret0, _ := ret[0].(error) return ret0 } // AggregateTiles indicates an expected call of AggregateTiles -func (mr *MockdatabaseNamespaceMockRecorder) AggregateTiles(ctx, sourceNs, start, end, step, pm interface{}) *gomock.Call { +func (mr *MockdatabaseNamespaceMockRecorder) AggregateTiles(ctx, sourceNs, opts, pm interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseNamespace)(nil).AggregateTiles), ctx, sourceNs, start, end, step, pm) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseNamespace)(nil).AggregateTiles), ctx, sourceNs, opts, pm) } // readableShardAt mocks base method @@ -2067,17 +2067,17 @@ func (mr *MockdatabaseShardMockRecorder) DocRef(id interface{}) *gomock.Call { } // AggregateTiles mocks base method -func (m *MockdatabaseShard) AggregateTiles(ctx context.Context, reader fs.DataFileSetReader, sourceNsID ident.ID, sourceShard databaseShard, blockStart time.Time, step time.Duration, wOpts series.WriteOptions) error { +func (m *MockdatabaseShard) AggregateTiles(ctx context.Context, reader fs.DataFileSetReader, sourceNsID ident.ID, sourceShard databaseShard, opts AggregateTilesOptions, wOpts series.WriteOptions) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AggregateTiles", ctx, reader, sourceNsID, sourceShard, blockStart, step, wOpts) + ret := m.ctrl.Call(m, "AggregateTiles", ctx, reader, sourceNsID, sourceShard, opts, wOpts) ret0, _ := ret[0].(error) return ret0 } // AggregateTiles indicates an expected call of AggregateTiles -func (mr *MockdatabaseShardMockRecorder) AggregateTiles(ctx, reader, sourceNsID, sourceShard, blockStart, step, wOpts interface{}) *gomock.Call { +func (mr *MockdatabaseShardMockRecorder) AggregateTiles(ctx, reader, sourceNsID, sourceShard, opts, wOpts interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseShard)(nil).AggregateTiles), ctx, reader, sourceNsID, sourceShard, blockStart, step, wOpts) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseShard)(nil).AggregateTiles), ctx, reader, sourceNsID, sourceShard, opts, wOpts) } // latestVolume mocks base method diff --git a/src/dbnode/storage/types.go b/src/dbnode/storage/types.go index 02881c4942..133bcad7a5 100644 --- a/src/dbnode/storage/types.go +++ b/src/dbnode/storage/types.go @@ -221,7 +221,7 @@ type Database interface { FlushState(namespace ident.ID, shardID uint32, blockStart time.Time) (fileOpState, error) // AggregateTiles does large tile aggregation from source namespace to target namespace. - AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, start, end time.Time, step time.Duration) error + AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, opts AggregateTilesOptions) error } // database is the internal database interface. @@ -413,8 +413,7 @@ type databaseNamespace interface { AggregateTiles( ctx context.Context, sourceNs databaseNamespace, - start, end time.Time, - step time.Duration, + opts AggregateTilesOptions, pm persist.Manager, ) error @@ -602,8 +601,7 @@ type databaseShard interface { reader fs.DataFileSetReader, sourceNsID ident.ID, sourceShard databaseShard, - blockStart time.Time, - step time.Duration, + opts AggregateTilesOptions, wOpts series.WriteOptions, ) error @@ -1232,3 +1230,8 @@ type newFSMergeWithMemFn func( dirtySeries *dirtySeriesMap, dirtySeriesToWrite map[xtime.UnixNano]*idList, ) fs.MergeWith + +type AggregateTilesOptions struct { + Start, End time.Time + Step time.Duration +} From 3e4de5c86f03789b86cf0d73609a0fab1436bd3a Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Tue, 21 Jul 2020 11:25:05 +0300 Subject: [PATCH 21/32] Minor improvements --- .../server/tchannelthrift/node/service.go | 1 + .../tchannelthrift/node/service_test.go | 6 +++--- src/dbnode/storage/bootstrap.go | 3 +++ src/dbnode/storage/namespace.go | 8 +++----- src/dbnode/storage/namespace_test.go | 19 +++++++++++++++++++ 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/dbnode/network/server/tchannelthrift/node/service.go b/src/dbnode/network/server/tchannelthrift/node/service.go index 8e6e80838e..80bd51d54d 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service.go +++ b/src/dbnode/network/server/tchannelthrift/node/service.go @@ -552,6 +552,7 @@ func (s *service) AggregateTiles(tctx thrift.Context, req *rpc.AggregateTilesReq opentracinglog.String("targetNameSpace", req.TargetNameSpace), xopentracing.Time("start", time.Unix(0, req.RangeStart)), xopentracing.Time("end", time.Unix(0, req.RangeEnd)), + opentracinglog.String("step", req.Step), ) } diff --git a/src/dbnode/network/server/tchannelthrift/node/service_test.go b/src/dbnode/network/server/tchannelthrift/node/service_test.go index 6a73f0dcab..9ea2d778cb 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service_test.go +++ b/src/dbnode/network/server/tchannelthrift/node/service_test.go @@ -3032,12 +3032,12 @@ func TestServiceAggregateTiles(t *testing.T) { ctx := tchannelthrift.Context(tctx) defer ctx.Close() - start := time.Now().Add(-2 * time.Hour) - end := start.Add(2 * time.Hour) + start := time.Now().Truncate(time.Hour).Add(-1 * time.Hour) + end := start.Add(time.Hour) start, end = start.Truncate(time.Second), end.Truncate(time.Second) - step := "2h" + step := "10m" stepDuration, _ := time.ParseDuration(step) sourceNsID := "source" diff --git a/src/dbnode/storage/bootstrap.go b/src/dbnode/storage/bootstrap.go index a730d829c4..d7e6dc8bf7 100644 --- a/src/dbnode/storage/bootstrap.go +++ b/src/dbnode/storage/bootstrap.go @@ -61,6 +61,9 @@ var ( // errBootstrapEnqueued raised when trying to bootstrap and bootstrap becomes enqueued. errBootstrapEnqueued = errors.New("database bootstrapping enqueued bootstrap") + + // errColdWritesDisabled raised when trying to do large tiles aggregation with cold writes disabled. + errColdWritesDisabled = errors.New("cold writes are disabled") ) const ( diff --git a/src/dbnode/storage/namespace.go b/src/dbnode/storage/namespace.go index 71682090df..9871fe5115 100644 --- a/src/dbnode/storage/namespace.go +++ b/src/dbnode/storage/namespace.go @@ -1612,12 +1612,10 @@ func (n *dbNamespace) AggregateTiles( targetShards := n.OwnedShards() n.RUnlock() - // If repair is enabled we still need cold flush regardless of whether cold writes is - // enabled since repairs are dependent on the cold flushing logic. // Note: Cold writes must be enabled for Large Tiles to work. - if !n.nopts.ColdWritesEnabled() && !n.nopts.RepairEnabled() { - n.metrics.writeAggData.ReportSuccess(n.nowFn().Sub(callStart)) - return nil + if !n.nopts.ColdWritesEnabled() { + n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) + return errColdWritesDisabled } sourceNsOpts := sourceNs.StorageOptions() diff --git a/src/dbnode/storage/namespace_test.go b/src/dbnode/storage/namespace_test.go index d6a20b5f4d..1d22a6a2d8 100644 --- a/src/dbnode/storage/namespace_test.go +++ b/src/dbnode/storage/namespace_test.go @@ -1297,6 +1297,25 @@ func TestNamespaceAggregateTilesFailOnBootstrapping(t *testing.T) { require.Equal(t, errNamespaceNotBootstrapped, targetNs.AggregateTiles(ctx, sourceNs, opts, pm)) } +func TestNamespaceAggregateTilesFailOnDisabledColdWrites(t *testing.T) { + var ( + sourceNsID = ident.StringID("source") + targetNsID = ident.StringID("target") + ctx = context.NewContext() + pm, _ = fs.NewPersistManager(fs.NewOptions()) + opts = AggregateTilesOptions{Start: time.Now().Truncate(time.Hour)} + ) + + sourceNs, sourceCloser := newTestNamespaceWithIDOpts(t, sourceNsID, namespace.NewOptions()) + defer sourceCloser() + + targetNs, targetCloser := newTestNamespaceWithIDOpts(t, targetNsID, namespace.NewOptions()) + defer targetCloser() + targetNs.bootstrapState = Bootstrapped + + require.Equal(t, errColdWritesDisabled, targetNs.AggregateTiles(ctx, sourceNs, opts, pm)) +} + func TestNamespaceAggregateTiles(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() From 5579b765618b53721d74ecf8f0bc8c6a87e334cf Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Tue, 21 Jul 2020 11:33:27 +0300 Subject: [PATCH 22/32] Cleanup --- src/dbnode/storage/shard_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/dbnode/storage/shard_test.go b/src/dbnode/storage/shard_test.go index 6e0c4ec768..16a2ea96b7 100644 --- a/src/dbnode/storage/shard_test.go +++ b/src/dbnode/storage/shard_test.go @@ -1755,8 +1755,6 @@ func TestAggregateTiles(t *testing.T) { targetShard := testDatabaseShard(t, DefaultTestOptions()) defer targetShard.Close() - targetShard.bootstrapState = Bootstrapped - latestSourceVolume, err := sourceShard.latestVolume(opts.Start) require.NoError(t, err) From c1de7cd506a810c43fcbb69dd42a59b2f5608760 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Thu, 23 Jul 2020 13:22:49 +0300 Subject: [PATCH 23/32] Compute and validate block time frames --- src/dbnode/storage/namespace.go | 17 ++++++++++++++++- src/dbnode/storage/namespace_test.go | 13 ++++++++----- src/dbnode/storage/shard.go | 5 +++-- src/dbnode/storage/shard_test.go | 5 +++-- src/dbnode/storage/storage_mock.go | 8 ++++---- src/dbnode/storage/types.go | 1 + 6 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/dbnode/storage/namespace.go b/src/dbnode/storage/namespace.go index 9871fe5115..56f40086fb 100644 --- a/src/dbnode/storage/namespace.go +++ b/src/dbnode/storage/namespace.go @@ -1603,13 +1603,25 @@ func (n *dbNamespace) AggregateTiles( callStart := n.nowFn() n.RLock() + + targetBlockSize := n.Metadata().Options().RetentionOptions().BlockSize() + blockStart := opts.Start.Truncate(targetBlockSize) + if blockStart.Add(targetBlockSize).Before(opts.End) { + n.RUnlock() + n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) + return fmt.Errorf("tile aggregation must be done within a single target block (start=%s, end=%s, blockSize=%s)", + opts.Start, opts.End, targetBlockSize.String()) + } + if n.bootstrapState != Bootstrapped { n.RUnlock() n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) return errNamespaceNotBootstrapped } + nsCtx := n.nsContextWithRLock() targetShards := n.OwnedShards() + n.RUnlock() // Note: Cold writes must be enabled for Large Tiles to work. @@ -1618,6 +1630,9 @@ func (n *dbNamespace) AggregateTiles( return errColdWritesDisabled } + sourceBlockSize := sourceNs.Metadata().Options().RetentionOptions().BlockSize() + sourceBlockStart := opts.Start.Truncate(sourceBlockSize) + sourceNsOpts := sourceNs.StorageOptions() reader, err := fs.NewReader(sourceNsOpts.BytesPool(), sourceNsOpts.CommitLogOptions().FilesystemOptions()) if err != nil { @@ -1646,7 +1661,7 @@ func (n *dbNamespace) AggregateTiles( multiErr = multiErr.Add(detailedErr) continue } - err = targetShard.AggregateTiles(ctx, reader, sourceNs.ID(), sourceShard, opts, wOpts) + err = targetShard.AggregateTiles(ctx, reader, sourceNs.ID(), sourceBlockStart, sourceShard, opts, wOpts) if err != nil { detailedErr := fmt.Errorf("shard %d aggregation failed: %v", targetShard.ID(), err) multiErr = multiErr.Add(detailedErr) diff --git a/src/dbnode/storage/namespace_test.go b/src/dbnode/storage/namespace_test.go index 1d22a6a2d8..bec4fee853 100644 --- a/src/dbnode/storage/namespace_test.go +++ b/src/dbnode/storage/namespace_test.go @@ -1284,7 +1284,8 @@ func TestNamespaceAggregateTilesFailOnBootstrapping(t *testing.T) { targetNsID = ident.StringID("target") ctx = context.NewContext() pm, _ = fs.NewPersistManager(fs.NewOptions()) - opts = AggregateTilesOptions{Start: time.Now().Truncate(time.Hour)} + start = time.Now().Truncate(time.Hour) + opts = AggregateTilesOptions{Start: start, End: start.Add(time.Hour)} ) sourceNs, sourceCloser := newTestNamespaceWithIDOpts(t, sourceNsID, namespace.NewOptions()) @@ -1303,7 +1304,8 @@ func TestNamespaceAggregateTilesFailOnDisabledColdWrites(t *testing.T) { targetNsID = ident.StringID("target") ctx = context.NewContext() pm, _ = fs.NewPersistManager(fs.NewOptions()) - opts = AggregateTilesOptions{Start: time.Now().Truncate(time.Hour)} + start = time.Now().Truncate(time.Hour) + opts = AggregateTilesOptions{Start: start, End: start.Add(time.Hour)} ) sourceNs, sourceCloser := newTestNamespaceWithIDOpts(t, sourceNsID, namespace.NewOptions()) @@ -1325,7 +1327,8 @@ func TestNamespaceAggregateTiles(t *testing.T) { targetNsID = ident.StringID("target") ctx = context.NewContext() pm, _ = fs.NewPersistManager(fs.NewOptions()) - opts = AggregateTilesOptions{Start: time.Now().Truncate(time.Hour)} + start = time.Now().Truncate(time.Hour) + opts = AggregateTilesOptions{Start: start, End: start.Add(time.Hour)} ) sourceNs, sourceCloser := newTestNamespaceWithIDOpts(t, sourceNsID, namespace.NewOptions()) @@ -1358,8 +1361,8 @@ func TestNamespaceAggregateTiles(t *testing.T) { targetShard1.EXPECT().ID().Return(uint32(1)) sourceNsIDMatcher := ident.NewIDMatcher(sourceNsID.String()) - targetShard0.EXPECT().AggregateTiles(ctx, gomock.Any(), sourceNsIDMatcher, sourceShard0, opts, wOpts).Return(nil) - targetShard1.EXPECT().AggregateTiles(ctx, gomock.Any(), sourceNsIDMatcher, sourceShard1, opts, wOpts).Return(nil) + targetShard0.EXPECT().AggregateTiles(ctx, gomock.Any(), sourceNsIDMatcher, start, sourceShard0, opts, wOpts).Return(nil) + targetShard1.EXPECT().AggregateTiles(ctx, gomock.Any(), sourceNsIDMatcher, start, sourceShard1, opts, wOpts).Return(nil) shardColdFlush0 := NewMockShardColdFlush(ctrl) shardColdFlush0.EXPECT().Done().Return(nil) diff --git a/src/dbnode/storage/shard.go b/src/dbnode/storage/shard.go index 154e4fc04d..21ed29a5cd 100644 --- a/src/dbnode/storage/shard.go +++ b/src/dbnode/storage/shard.go @@ -2550,11 +2550,12 @@ func (s *dbShard) AggregateTiles( ctx context.Context, reader fs.DataFileSetReader, sourceNsID ident.ID, + sourceBlockStart time.Time, sourceShard databaseShard, opts AggregateTilesOptions, wOpts series.WriteOptions, ) error { - latestSourceVolume, err := sourceShard.latestVolume(opts.Start) + latestSourceVolume, err := sourceShard.latestVolume(sourceBlockStart) if err != nil { return err } @@ -2563,7 +2564,7 @@ func (s *dbShard) AggregateTiles( Identifier: fs.FileSetFileIdentifier{ Namespace: sourceNsID, Shard: sourceShard.ID(), - BlockStart: opts.Start, + BlockStart: sourceBlockStart, VolumeIndex: latestSourceVolume, }, FileSetType: persist.FileSetFlushType, diff --git a/src/dbnode/storage/shard_test.go b/src/dbnode/storage/shard_test.go index 16a2ea96b7..c405d80d38 100644 --- a/src/dbnode/storage/shard_test.go +++ b/src/dbnode/storage/shard_test.go @@ -1746,7 +1746,8 @@ func TestAggregateTiles(t *testing.T) { var ( ctx = context.NewContext() - opts = AggregateTilesOptions{Start: time.Now().Truncate(time.Hour)} + start = time.Now().Truncate(time.Hour) + opts = AggregateTilesOptions{Start: start, End: start.Add(time.Hour)} ) sourceShard := testDatabaseShard(t, DefaultTestOptions()) @@ -1776,6 +1777,6 @@ func TestAggregateTiles(t *testing.T) { Return(nil, nil, nil, uint32(0), io.EOF) reader.EXPECT().Close() - err = targetShard.AggregateTiles(ctx, reader, sourceNsID, sourceShard, opts, series.WriteOptions{}) + err = targetShard.AggregateTiles(ctx, reader, sourceNsID, start, sourceShard, opts, series.WriteOptions{}) require.NoError(t, err) } diff --git a/src/dbnode/storage/storage_mock.go b/src/dbnode/storage/storage_mock.go index 16e371d49e..ad87da6879 100644 --- a/src/dbnode/storage/storage_mock.go +++ b/src/dbnode/storage/storage_mock.go @@ -2067,17 +2067,17 @@ func (mr *MockdatabaseShardMockRecorder) DocRef(id interface{}) *gomock.Call { } // AggregateTiles mocks base method -func (m *MockdatabaseShard) AggregateTiles(ctx context.Context, reader fs.DataFileSetReader, sourceNsID ident.ID, sourceShard databaseShard, opts AggregateTilesOptions, wOpts series.WriteOptions) error { +func (m *MockdatabaseShard) AggregateTiles(ctx context.Context, reader fs.DataFileSetReader, sourceNsID ident.ID, sourceBlockStart time.Time, sourceShard databaseShard, opts AggregateTilesOptions, wOpts series.WriteOptions) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AggregateTiles", ctx, reader, sourceNsID, sourceShard, opts, wOpts) + ret := m.ctrl.Call(m, "AggregateTiles", ctx, reader, sourceNsID, sourceBlockStart, sourceShard, opts, wOpts) ret0, _ := ret[0].(error) return ret0 } // AggregateTiles indicates an expected call of AggregateTiles -func (mr *MockdatabaseShardMockRecorder) AggregateTiles(ctx, reader, sourceNsID, sourceShard, opts, wOpts interface{}) *gomock.Call { +func (mr *MockdatabaseShardMockRecorder) AggregateTiles(ctx, reader, sourceNsID, sourceBlockStart, sourceShard, opts, wOpts interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseShard)(nil).AggregateTiles), ctx, reader, sourceNsID, sourceShard, opts, wOpts) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockdatabaseShard)(nil).AggregateTiles), ctx, reader, sourceNsID, sourceBlockStart, sourceShard, opts, wOpts) } // latestVolume mocks base method diff --git a/src/dbnode/storage/types.go b/src/dbnode/storage/types.go index 133bcad7a5..d811649c32 100644 --- a/src/dbnode/storage/types.go +++ b/src/dbnode/storage/types.go @@ -600,6 +600,7 @@ type databaseShard interface { ctx context.Context, reader fs.DataFileSetReader, sourceNsID ident.ID, + sourceBlockStart time.Time, sourceShard databaseShard, opts AggregateTilesOptions, wOpts series.WriteOptions, From 81fc3cea82337c1d70c97693f00f6d5e821e5ba9 Mon Sep 17 00:00:00 2001 From: Gediminas Guoba Date: Thu, 23 Jul 2020 18:07:18 +0300 Subject: [PATCH 24/32] [dbnode] Integration test for large tiles (#2478) --- src/dbnode/integration/large_tiles_test.go | 163 +++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 src/dbnode/integration/large_tiles_test.go diff --git a/src/dbnode/integration/large_tiles_test.go b/src/dbnode/integration/large_tiles_test.go new file mode 100644 index 0000000000..34f3f4858f --- /dev/null +++ b/src/dbnode/integration/large_tiles_test.go @@ -0,0 +1,163 @@ +// +build integration + +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package integration + +import ( + "testing" + "time" + + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/retention" + "github.com/m3db/m3/src/dbnode/storage" + xmetrics "github.com/m3db/m3/src/dbnode/x/metrics" + xclock "github.com/m3db/m3/src/x/clock" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + xtime "github.com/m3db/m3/src/x/time" + "github.com/stretchr/testify/require" + "github.com/uber-go/tally" + "go.uber.org/zap" +) + +func TestReadAggregateWrite(t *testing.T) { + var ( + blockSize = 2 * time.Hour + indexBlockSize = 2 * blockSize + rOpts = retention.NewOptions().SetRetentionPeriod(24 * blockSize).SetBlockSize(blockSize) + idxOpts = namespace.NewIndexOptions().SetEnabled(true).SetBlockSize(indexBlockSize) + nsOpts = namespace.NewOptions(). + SetRetentionOptions(rOpts). + SetIndexOptions(idxOpts). + SetColdWritesEnabled(true) + ) + + srcNs, err := namespace.NewMetadata(testNamespaces[0], nsOpts) + require.NoError(t, err) + trgNs, err := namespace.NewMetadata(testNamespaces[1], nsOpts) + require.NoError(t, err) + + testOpts := NewTestOptions(t). + SetNamespaces([]namespace.Metadata{srcNs, trgNs}). + SetWriteNewSeriesAsync(true) + + testSetup := newTestSetupWithCommitLogAndFilesystemBootstrapper(t, testOpts) + defer testSetup.Close() + + reporter := xmetrics.NewTestStatsReporter(xmetrics.NewTestStatsReporterOptions()) + scope, closer := tally.NewRootScope( + tally.ScopeOptions{Reporter: reporter}, time.Millisecond) + defer closer.Close() + testSetup.SetStorageOpts(testSetup.StorageOpts().SetInstrumentOptions( + instrument.NewOptions().SetMetricsScope(scope))) + + storageOpts := testSetup.StorageOpts() + testSetup.SetStorageOpts(storageOpts) + + // Start the server. + log := storageOpts.InstrumentOptions().Logger() + require.NoError(t, testSetup.StartServer()) + + // Stop the server. + defer func() { + require.NoError(t, testSetup.StopServer()) + log.Debug("server is now down") + }() + + start := time.Now() + session, err := testSetup.M3DBClient().DefaultSession() + require.NoError(t, err) + nowFn := testSetup.NowFn() + + tags := []ident.Tag{ + ident.StringTag("__name__", "cpu"), + ident.StringTag("job", "job1"), + } + + dpTimeStart := nowFn().Truncate(indexBlockSize).Add(-3 * indexBlockSize) + dpTime := dpTimeStart + + // Write test data. + for a := 0.0; a < 20.0; a++ { + err = session.WriteTagged(srcNs.ID(), ident.StringID("foo"), ident.NewTagsIterator(ident.NewTags(tags...)), dpTime, 42.1+a, xtime.Second, nil) + require.NoError(t, err) + dpTime = dpTime.Add(10 * time.Minute) + } + log.Info("test data written", zap.Duration("took", time.Since(start))) + + log.Info("waiting till data is cold flushed") + start = time.Now() + expectedNumWrites := int64(20) + flushed := xclock.WaitUntil(func() bool { + counters := reporter.Counters() + counter, ok := counters["database.series.cold-writes"] // Wait until data is written + warmData, ok := counters["database.flushWarmData.success"] // Wait until data is flushed + return ok && counter == expectedNumWrites && warmData >= expectedNumWrites + }, time.Minute) + require.True(t, flushed) + log.Info("verified data has been cold flushed", zap.Duration("took", time.Since(start))) + + aggOpts := storage.AggregateTilesOptions{ + Start: dpTimeStart, + End: time.Now(), + Step: time.Hour, + } + + // Retry aggregation as persist manager could be still locked by cold writes. + // TODO: Remove retry when a separate persist manager will be implemented. + for retries := 0; retries < 10; retries++ { + err = testSetup.DB().AggregateTiles(storageOpts.ContextPool().Get(), srcNs.ID(), trgNs.ID(), aggOpts) + if err == nil { + break + } + time.Sleep(time.Second) + } + require.NoError(t, err) + + log.Info("fetching aggregated data") + series, err := session.Fetch(trgNs.ID(), ident.StringID("foo"), dpTimeStart, nowFn()) + require.NoError(t, err) + + expectedDps := make(map[int64]float64) + // TODO: Replace with exact values when aggregation will be implemented. + timestamp := dpTimeStart + // TODO: now we aggregate only a single block, that's why we do expect + // 12 items in place of 20 + for a := 0; a < 12; a++ { + expectedDps[timestamp.Unix()] = 42.1 + float64(a) + timestamp = timestamp.Add(10 * time.Minute) + } + + count := 0 + for series.Next() { + dp, _, _ := series.Current() + value, ok := expectedDps[dp.Timestamp.Unix()] + require.True(t, ok, + "didn't expect to find timestamp %v in aggregated result", + dp.Timestamp.Unix()) + require.Equal(t, value, dp.Value, + "value for timestamp %v doesn't match. Expected %v but got %v", + dp.Timestamp.Unix(), value, dp.Value) + count++ + } + require.Equal(t, len(expectedDps), count) +} From 07a091c000da967f84e125cfa92d51dba561d0a2 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Fri, 24 Jul 2020 10:25:52 +0300 Subject: [PATCH 25/32] Return processedBlockCount from AggregateTiles --- src/dbnode/generated/thrift/rpc.thrift | 1 + src/dbnode/generated/thrift/rpc/rpc.go | 48 ++++++++++++++++++- src/dbnode/integration/large_tiles_test.go | 7 ++- .../server/tchannelthrift/node/service.go | 20 +++++--- src/dbnode/storage/database.go | 11 +++-- src/dbnode/storage/database_test.go | 6 ++- src/dbnode/storage/namespace.go | 19 ++++---- src/dbnode/storage/namespace_test.go | 16 ++++--- src/dbnode/storage/shard.go | 17 +++++-- src/dbnode/storage/shard_test.go | 3 +- src/dbnode/storage/storage_mock.go | 28 ++++++----- src/dbnode/storage/types.go | 6 +-- 12 files changed, 131 insertions(+), 51 deletions(-) diff --git a/src/dbnode/generated/thrift/rpc.thrift b/src/dbnode/generated/thrift/rpc.thrift index cda46e19d6..afc834b7c1 100644 --- a/src/dbnode/generated/thrift/rpc.thrift +++ b/src/dbnode/generated/thrift/rpc.thrift @@ -504,6 +504,7 @@ struct AggregateTilesRequest { } struct AggregateTilesResult { + 1: required i64 processedBlockCount } struct DebugProfileStartRequest { diff --git a/src/dbnode/generated/thrift/rpc/rpc.go b/src/dbnode/generated/thrift/rpc/rpc.go index 6748c61670..9c9a7ae137 100644 --- a/src/dbnode/generated/thrift/rpc/rpc.go +++ b/src/dbnode/generated/thrift/rpc/rpc.go @@ -13246,18 +13246,26 @@ func (p *AggregateTilesRequest) String() string { return fmt.Sprintf("AggregateTilesRequest(%+v)", *p) } +// Attributes: +// - ProcessedBlockCount type AggregateTilesResult_ struct { + ProcessedBlockCount int64 `thrift:"processedBlockCount,1,required" db:"processedBlockCount" json:"processedBlockCount"` } func NewAggregateTilesResult_() *AggregateTilesResult_ { return &AggregateTilesResult_{} } +func (p *AggregateTilesResult_) GetProcessedBlockCount() int64 { + return p.ProcessedBlockCount +} func (p *AggregateTilesResult_) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } + var issetProcessedBlockCount bool = false + for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { @@ -13266,8 +13274,16 @@ func (p *AggregateTilesResult_) Read(iprot thrift.TProtocol) error { if fieldTypeId == thrift.STOP { break } - if err := iprot.Skip(fieldTypeId); err != nil { - return err + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetProcessedBlockCount = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } } if err := iprot.ReadFieldEnd(); err != nil { return err @@ -13276,6 +13292,18 @@ func (p *AggregateTilesResult_) Read(iprot thrift.TProtocol) error { if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } + if !issetProcessedBlockCount { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ProcessedBlockCount is not set")) + } + return nil +} + +func (p *AggregateTilesResult_) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.ProcessedBlockCount = v + } return nil } @@ -13284,6 +13312,9 @@ func (p *AggregateTilesResult_) Write(oprot thrift.TProtocol) error { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) @@ -13294,6 +13325,19 @@ func (p *AggregateTilesResult_) Write(oprot thrift.TProtocol) error { return nil } +func (p *AggregateTilesResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("processedBlockCount", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:processedBlockCount: ", p), err) + } + if err := oprot.WriteI64(int64(p.ProcessedBlockCount)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.processedBlockCount (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:processedBlockCount: ", p), err) + } + return err +} + func (p *AggregateTilesResult_) String() string { if p == nil { return "" diff --git a/src/dbnode/integration/large_tiles_test.go b/src/dbnode/integration/large_tiles_test.go index 34f3f4858f..6285e64c1c 100644 --- a/src/dbnode/integration/large_tiles_test.go +++ b/src/dbnode/integration/large_tiles_test.go @@ -23,6 +23,7 @@ package integration import ( + "github.com/stretchr/testify/assert" "testing" "time" @@ -118,20 +119,22 @@ func TestReadAggregateWrite(t *testing.T) { aggOpts := storage.AggregateTilesOptions{ Start: dpTimeStart, - End: time.Now(), + End: dpTimeStart.Add(blockSize), Step: time.Hour, } // Retry aggregation as persist manager could be still locked by cold writes. // TODO: Remove retry when a separate persist manager will be implemented. + var processedBlockCount int64 for retries := 0; retries < 10; retries++ { - err = testSetup.DB().AggregateTiles(storageOpts.ContextPool().Get(), srcNs.ID(), trgNs.ID(), aggOpts) + processedBlockCount, err = testSetup.DB().AggregateTiles(storageOpts.ContextPool().Get(), srcNs.ID(), trgNs.ID(), aggOpts) if err == nil { break } time.Sleep(time.Second) } require.NoError(t, err) + assert.Equal(t, int64(1), processedBlockCount) log.Info("fetching aggregated data") series, err := session.Fetch(trgNs.ID(), ident.StringID("foo"), dpTimeStart, nowFn()) diff --git a/src/dbnode/network/server/tchannelthrift/node/service.go b/src/dbnode/network/server/tchannelthrift/node/service.go index 80bd51d54d..3759c97885 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service.go +++ b/src/dbnode/network/server/tchannelthrift/node/service.go @@ -556,21 +556,27 @@ func (s *service) AggregateTiles(tctx thrift.Context, req *rpc.AggregateTilesReq ) } - err = s.aggregateTiles(ctx, db, req) + processedBlockCount, err := s.aggregateTiles(ctx, db, req) if sampled && err != nil { sp.LogFields(opentracinglog.Error(err)) } sp.Finish() - return &rpc.AggregateTilesResult_{}, err + return &rpc.AggregateTilesResult_{ + ProcessedBlockCount: processedBlockCount, + }, err } -func (s *service) aggregateTiles(ctx context.Context, db storage.Database, req *rpc.AggregateTilesRequest) error { +func (s *service) aggregateTiles( + ctx context.Context, + db storage.Database, + req *rpc.AggregateTilesRequest, +) (int64, error) { start, rangeStartErr := convert.ToTime(req.RangeStart, req.RangeType) end, rangeEndErr := convert.ToTime(req.RangeEnd, req.RangeType) step, stepErr := time.ParseDuration(req.Step) if rangeStartErr != nil || rangeEndErr != nil || stepErr != nil { - return tterrors.NewBadRequestError(xerrors.FirstError(rangeStartErr, rangeEndErr, stepErr)) + return 0, tterrors.NewBadRequestError(xerrors.FirstError(rangeStartErr, rangeEndErr, stepErr)) } sourceNsID := s.pools.id.GetStringID(ctx, req.SourceNameSpace) @@ -578,12 +584,12 @@ func (s *service) aggregateTiles(ctx context.Context, db storage.Database, req * opts := storage.AggregateTilesOptions{Start: start, End: end, Step: step} - err := db.AggregateTiles(ctx, sourceNsID, targetNsID, opts) + processedBlockCount, err := db.AggregateTiles(ctx, sourceNsID, targetNsID, opts) if err != nil { - return convert.ToRPCError(err) + return processedBlockCount, convert.ToRPCError(err) } - return nil + return processedBlockCount, nil } func (s *service) Fetch(tctx thrift.Context, req *rpc.FetchRequest) (*rpc.FetchResult_, error) { diff --git a/src/dbnode/storage/database.go b/src/dbnode/storage/database.go index 6782611520..4ab8185153 100644 --- a/src/dbnode/storage/database.go +++ b/src/dbnode/storage/database.go @@ -1063,7 +1063,12 @@ func (d *db) OwnedNamespaces() ([]databaseNamespace, error) { return d.ownedNamespacesWithLock(), nil } -func (d *db) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, opts AggregateTilesOptions) error { +func (d *db) AggregateTiles( + ctx context.Context, + sourceNsID, + targetNsID ident.ID, + opts AggregateTilesOptions, +) (int64, error) { ctx, sp, sampled := ctx.StartSampledTraceSpan(tracepoint.DBAggregateTiles) if sampled { sp.LogFields( @@ -1079,13 +1084,13 @@ func (d *db) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID sourceNs, err := d.namespaceFor(sourceNsID) if err != nil { d.metrics.unknownNamespaceRead.Inc(1) - return err + return 0, err } targetNs, err := d.namespaceFor(targetNsID) if err != nil { d.metrics.unknownNamespaceRead.Inc(1) - return err + return 0, err } // TODO: Create and use a dedicated persist manager diff --git a/src/dbnode/storage/database_test.go b/src/dbnode/storage/database_test.go index 8b62363d90..bade84c385 100644 --- a/src/dbnode/storage/database_test.go +++ b/src/dbnode/storage/database_test.go @@ -1307,7 +1307,9 @@ func TestDatabaseAggregateTiles(t *testing.T) { sourceNs := dbAddNewMockNamespace(ctrl, d, sourceNsID.String()) targetNs := dbAddNewMockNamespace(ctrl, d, targetNsID.String()) - targetNs.EXPECT().AggregateTiles(ctx, sourceNs, opts, pm).Return(nil) + targetNs.EXPECT().AggregateTiles(ctx, sourceNs, opts, pm).Return(int64(4), nil) - require.NoError(t, d.AggregateTiles(ctx, sourceNsID, targetNsID, opts)) + processedBlockCount, err := d.AggregateTiles(ctx, sourceNsID, targetNsID, opts) + require.NoError(t, err) + assert.Equal(t, int64(4), processedBlockCount) } diff --git a/src/dbnode/storage/namespace.go b/src/dbnode/storage/namespace.go index 56f40086fb..1be87be4bb 100644 --- a/src/dbnode/storage/namespace.go +++ b/src/dbnode/storage/namespace.go @@ -1597,7 +1597,7 @@ func (n *dbNamespace) AggregateTiles( sourceNs databaseNamespace, opts AggregateTilesOptions, pm persist.Manager, -) error { +) (int64, error) { // NB(rartoul): This value can be used for emitting metrics, but should not be used // for business logic. callStart := n.nowFn() @@ -1609,14 +1609,14 @@ func (n *dbNamespace) AggregateTiles( if blockStart.Add(targetBlockSize).Before(opts.End) { n.RUnlock() n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) - return fmt.Errorf("tile aggregation must be done within a single target block (start=%s, end=%s, blockSize=%s)", + return 0, fmt.Errorf("tile aggregation must be done within a single target block (start=%s, end=%s, blockSize=%s)", opts.Start, opts.End, targetBlockSize.String()) } if n.bootstrapState != Bootstrapped { n.RUnlock() n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) - return errNamespaceNotBootstrapped + return 0, errNamespaceNotBootstrapped } nsCtx := n.nsContextWithRLock() @@ -1627,7 +1627,7 @@ func (n *dbNamespace) AggregateTiles( // Note: Cold writes must be enabled for Large Tiles to work. if !n.nopts.ColdWritesEnabled() { n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) - return errColdWritesDisabled + return 0, errColdWritesDisabled } sourceBlockSize := sourceNs.Metadata().Options().RetentionOptions().BlockSize() @@ -1637,7 +1637,7 @@ func (n *dbNamespace) AggregateTiles( reader, err := fs.NewReader(sourceNsOpts.BytesPool(), sourceNsOpts.CommitLogOptions().FilesystemOptions()) if err != nil { n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) - return err + return 0, err } wOpts := series.WriteOptions{ @@ -1648,12 +1648,13 @@ func (n *dbNamespace) AggregateTiles( resources, err := newColdFlushReuseableResources(n.opts) if err != nil { n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) - return err + return 0, err } // NB(bodu): Deferred targetShard cold flushes so that we can ensure that cold flush index data is // persisted before persisting TSDB data to ensure crash consistency. multiErr := xerrors.NewMultiError() + var processedBlockCount int64 for _, targetShard := range targetShards { sourceShard, _, err := sourceNs.readableShardAt(targetShard.ID()) if err != nil { @@ -1661,7 +1662,8 @@ func (n *dbNamespace) AggregateTiles( multiErr = multiErr.Add(detailedErr) continue } - err = targetShard.AggregateTiles(ctx, reader, sourceNs.ID(), sourceBlockStart, sourceShard, opts, wOpts) + shardProcessedBlockCount, err := targetShard.AggregateTiles(ctx, reader, sourceNs.ID(), sourceBlockStart, sourceShard, opts, wOpts) + processedBlockCount += shardProcessedBlockCount if err != nil { detailedErr := fmt.Errorf("shard %d aggregation failed: %v", targetShard.ID(), err) multiErr = multiErr.Add(detailedErr) @@ -1673,7 +1675,8 @@ func (n *dbNamespace) AggregateTiles( res := multiErr.FinalError() n.metrics.writeAggData.ReportSuccessOrError(res, n.nowFn().Sub(callStart)) - return res + + return processedBlockCount, res } func (n *dbNamespace) coldFlushSingleShard( diff --git a/src/dbnode/storage/namespace_test.go b/src/dbnode/storage/namespace_test.go index bec4fee853..eeea41ffd0 100644 --- a/src/dbnode/storage/namespace_test.go +++ b/src/dbnode/storage/namespace_test.go @@ -1295,7 +1295,8 @@ func TestNamespaceAggregateTilesFailOnBootstrapping(t *testing.T) { defer targetCloser() targetNs.bootstrapState = Bootstrapping - require.Equal(t, errNamespaceNotBootstrapped, targetNs.AggregateTiles(ctx, sourceNs, opts, pm)) + _, err := targetNs.AggregateTiles(ctx, sourceNs, opts, pm) + require.Equal(t, errNamespaceNotBootstrapped, err) } func TestNamespaceAggregateTilesFailOnDisabledColdWrites(t *testing.T) { @@ -1315,7 +1316,8 @@ func TestNamespaceAggregateTilesFailOnDisabledColdWrites(t *testing.T) { defer targetCloser() targetNs.bootstrapState = Bootstrapped - require.Equal(t, errColdWritesDisabled, targetNs.AggregateTiles(ctx, sourceNs, opts, pm)) + _, err := targetNs.AggregateTiles(ctx, sourceNs, opts, pm) + require.Equal(t, errColdWritesDisabled, err) } func TestNamespaceAggregateTiles(t *testing.T) { @@ -1327,7 +1329,7 @@ func TestNamespaceAggregateTiles(t *testing.T) { targetNsID = ident.StringID("target") ctx = context.NewContext() pm, _ = fs.NewPersistManager(fs.NewOptions()) - start = time.Now().Truncate(time.Hour) + start = time.Now().Truncate(2 * time.Hour) opts = AggregateTilesOptions{Start: start, End: start.Add(time.Hour)} ) @@ -1361,8 +1363,8 @@ func TestNamespaceAggregateTiles(t *testing.T) { targetShard1.EXPECT().ID().Return(uint32(1)) sourceNsIDMatcher := ident.NewIDMatcher(sourceNsID.String()) - targetShard0.EXPECT().AggregateTiles(ctx, gomock.Any(), sourceNsIDMatcher, start, sourceShard0, opts, wOpts).Return(nil) - targetShard1.EXPECT().AggregateTiles(ctx, gomock.Any(), sourceNsIDMatcher, start, sourceShard1, opts, wOpts).Return(nil) + targetShard0.EXPECT().AggregateTiles(ctx, gomock.Any(), sourceNsIDMatcher, start, sourceShard0, opts, wOpts).Return(int64(3), nil) + targetShard1.EXPECT().AggregateTiles(ctx, gomock.Any(), sourceNsIDMatcher, start, sourceShard1, opts, wOpts).Return(int64(2), nil) shardColdFlush0 := NewMockShardColdFlush(ctrl) shardColdFlush0.EXPECT().Done().Return(nil) @@ -1375,7 +1377,9 @@ func TestNamespaceAggregateTiles(t *testing.T) { targetShard0.EXPECT().ColdFlush(gomock.Any(), gomock.Any(), nsCtx, onColdFlushNs).Return(shardColdFlush0, nil) targetShard1.EXPECT().ColdFlush(gomock.Any(), gomock.Any(), nsCtx, onColdFlushNs).Return(shardColdFlush1, nil) - require.NoError(t, targetNs.AggregateTiles(ctx, sourceNs, opts, pm)) + processedBlockCount, err := targetNs.AggregateTiles(ctx, sourceNs, opts, pm) + require.NoError(t, err) + assert.Equal(t, int64(3+2), processedBlockCount) } func waitForStats( diff --git a/src/dbnode/storage/shard.go b/src/dbnode/storage/shard.go index 21ed29a5cd..9049f3daec 100644 --- a/src/dbnode/storage/shard.go +++ b/src/dbnode/storage/shard.go @@ -2554,10 +2554,10 @@ func (s *dbShard) AggregateTiles( sourceShard databaseShard, opts AggregateTilesOptions, wOpts series.WriteOptions, -) error { +) (int64, error) { latestSourceVolume, err := sourceShard.latestVolume(sourceBlockStart) if err != nil { - return err + return 0, err } openOpts := fs.DataReaderOpenOptions{ @@ -2571,7 +2571,7 @@ func (s *dbShard) AggregateTiles( //TODO add after https://github.com/chronosphereio/m3/pull/10 for proper streaming - OrderByIndex: true } if err := reader.Open(openOpts); err != nil { - return err + return 0, err } defer reader.Close() @@ -2579,6 +2579,7 @@ func (s *dbShard) AggregateTiles( bytesReader := bytes.NewReader(nil) dataPointIter := m3tsz.NewReaderIterator(bytesReader, true, encodingOpts) var lastWriteError error + var processedBlockCount int64 for { id, tags, data, _, err := reader.Read() @@ -2586,7 +2587,7 @@ func (s *dbShard) AggregateTiles( break } if err != nil { - return err + return processedBlockCount, err } data.IncRef() @@ -2606,9 +2607,15 @@ func (s *dbShard) AggregateTiles( data.DecRef() data.Finalize() + + processedBlockCount++ } - return lastWriteError + s.logger.Debug("finished aggregating tiles", + zap.Uint32("shard", s.ID()), + zap.Int64("processedBlocks", processedBlockCount)) + + return processedBlockCount, lastWriteError } func (s *dbShard) BootstrapState() BootstrapState { diff --git a/src/dbnode/storage/shard_test.go b/src/dbnode/storage/shard_test.go index c405d80d38..fcb39d1f77 100644 --- a/src/dbnode/storage/shard_test.go +++ b/src/dbnode/storage/shard_test.go @@ -1777,6 +1777,7 @@ func TestAggregateTiles(t *testing.T) { Return(nil, nil, nil, uint32(0), io.EOF) reader.EXPECT().Close() - err = targetShard.AggregateTiles(ctx, reader, sourceNsID, start, sourceShard, opts, series.WriteOptions{}) + processedBlockCount, err := targetShard.AggregateTiles(ctx, reader, sourceNsID, start, sourceShard, opts, series.WriteOptions{}) require.NoError(t, err) + assert.Equal(t, int64(1), processedBlockCount) } diff --git a/src/dbnode/storage/storage_mock.go b/src/dbnode/storage/storage_mock.go index ad87da6879..170f00d12e 100644 --- a/src/dbnode/storage/storage_mock.go +++ b/src/dbnode/storage/storage_mock.go @@ -489,11 +489,12 @@ func (mr *MockDatabaseMockRecorder) FlushState(namespace, shardID, blockStart in } // AggregateTiles mocks base method -func (m *MockDatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, opts AggregateTilesOptions) error { +func (m *MockDatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, opts AggregateTilesOptions) (int64, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNsID, targetNsID, opts) - ret0, _ := ret[0].(error) - return ret0 + ret0, _ := ret[0].(int64) + ret1, _ := ret[1].(error) + return ret0, ret1 } // AggregateTiles indicates an expected call of AggregateTiles @@ -898,11 +899,12 @@ func (mr *MockdatabaseMockRecorder) FlushState(namespace, shardID, blockStart in } // AggregateTiles mocks base method -func (m *Mockdatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, opts AggregateTilesOptions) error { +func (m *Mockdatabase) AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, opts AggregateTilesOptions) (int64, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNsID, targetNsID, opts) - ret0, _ := ret[0].(error) - return ret0 + ret0, _ := ret[0].(int64) + ret1, _ := ret[1].(error) + return ret0, ret1 } // AggregateTiles indicates an expected call of AggregateTiles @@ -1561,11 +1563,12 @@ func (mr *MockdatabaseNamespaceMockRecorder) WritePendingIndexInserts(pending in } // AggregateTiles mocks base method -func (m *MockdatabaseNamespace) AggregateTiles(ctx context.Context, sourceNs databaseNamespace, opts AggregateTilesOptions, pm persist.Manager) error { +func (m *MockdatabaseNamespace) AggregateTiles(ctx context.Context, sourceNs databaseNamespace, opts AggregateTilesOptions, pm persist.Manager) (int64, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AggregateTiles", ctx, sourceNs, opts, pm) - ret0, _ := ret[0].(error) - return ret0 + ret0, _ := ret[0].(int64) + ret1, _ := ret[1].(error) + return ret0, ret1 } // AggregateTiles indicates an expected call of AggregateTiles @@ -2067,11 +2070,12 @@ func (mr *MockdatabaseShardMockRecorder) DocRef(id interface{}) *gomock.Call { } // AggregateTiles mocks base method -func (m *MockdatabaseShard) AggregateTiles(ctx context.Context, reader fs.DataFileSetReader, sourceNsID ident.ID, sourceBlockStart time.Time, sourceShard databaseShard, opts AggregateTilesOptions, wOpts series.WriteOptions) error { +func (m *MockdatabaseShard) AggregateTiles(ctx context.Context, reader fs.DataFileSetReader, sourceNsID ident.ID, sourceBlockStart time.Time, sourceShard databaseShard, opts AggregateTilesOptions, wOpts series.WriteOptions) (int64, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AggregateTiles", ctx, reader, sourceNsID, sourceBlockStart, sourceShard, opts, wOpts) - ret0, _ := ret[0].(error) - return ret0 + ret0, _ := ret[0].(int64) + ret1, _ := ret[1].(error) + return ret0, ret1 } // AggregateTiles indicates an expected call of AggregateTiles diff --git a/src/dbnode/storage/types.go b/src/dbnode/storage/types.go index d811649c32..87d3251ceb 100644 --- a/src/dbnode/storage/types.go +++ b/src/dbnode/storage/types.go @@ -221,7 +221,7 @@ type Database interface { FlushState(namespace ident.ID, shardID uint32, blockStart time.Time) (fileOpState, error) // AggregateTiles does large tile aggregation from source namespace to target namespace. - AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, opts AggregateTilesOptions) error + AggregateTiles(ctx context.Context, sourceNsID, targetNsID ident.ID, opts AggregateTilesOptions) (int64, error) } // database is the internal database interface. @@ -415,7 +415,7 @@ type databaseNamespace interface { sourceNs databaseNamespace, opts AggregateTilesOptions, pm persist.Manager, - ) error + ) (int64, error) readableShardAt(shardID uint32) (databaseShard, namespace.Context, error) } @@ -604,7 +604,7 @@ type databaseShard interface { sourceShard databaseShard, opts AggregateTilesOptions, wOpts series.WriteOptions, - ) error + ) (int64, error) latestVolume(blockStart time.Time) (int, error) } From f94ca763ee5305abf0660974e6fc8cae4c7f5e4a Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Fri, 24 Jul 2020 10:55:05 +0300 Subject: [PATCH 26/32] Improve error handling --- src/dbnode/network/server/tchannelthrift/node/service.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/dbnode/network/server/tchannelthrift/node/service.go b/src/dbnode/network/server/tchannelthrift/node/service.go index 3759c97885..74c0f5217c 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service.go +++ b/src/dbnode/network/server/tchannelthrift/node/service.go @@ -546,6 +546,8 @@ func (s *service) AggregateTiles(tctx thrift.Context, req *rpc.AggregateTilesReq defer s.writeRPCCompleted() ctx, sp, sampled := tchannelthrift.Context(tctx).StartSampledTraceSpan(tracepoint.AggregateTiles) + defer sp.Finish() + if sampled { sp.LogFields( opentracinglog.String("sourceNameSpace", req.SourceNameSpace), @@ -557,10 +559,9 @@ func (s *service) AggregateTiles(tctx thrift.Context, req *rpc.AggregateTilesReq } processedBlockCount, err := s.aggregateTiles(ctx, db, req) - if sampled && err != nil { + if err != nil { sp.LogFields(opentracinglog.Error(err)) } - sp.Finish() return &rpc.AggregateTilesResult_{ ProcessedBlockCount: processedBlockCount, @@ -576,7 +577,8 @@ func (s *service) aggregateTiles( end, rangeEndErr := convert.ToTime(req.RangeEnd, req.RangeType) step, stepErr := time.ParseDuration(req.Step) if rangeStartErr != nil || rangeEndErr != nil || stepErr != nil { - return 0, tterrors.NewBadRequestError(xerrors.FirstError(rangeStartErr, rangeEndErr, stepErr)) + multiErr := xerrors.NewMultiError().Add(rangeStartErr).Add(rangeEndErr).Add(stepErr) + return 0, tterrors.NewBadRequestError(multiErr.FinalError()) } sourceNsID := s.pools.id.GetStringID(ctx, req.SourceNameSpace) From 00753884310da5030325e8f53a8202cb2c4e6ca9 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Fri, 24 Jul 2020 11:13:52 +0300 Subject: [PATCH 27/32] Validate AggregateTilesOptions --- src/dbnode/integration/large_tiles_test.go | 7 ++----- .../server/tchannelthrift/node/service.go | 7 +++---- src/dbnode/storage/database.go | 12 ++++++++++++ src/dbnode/storage/database_test.go | 19 +++++++++++++++++++ 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/dbnode/integration/large_tiles_test.go b/src/dbnode/integration/large_tiles_test.go index 6285e64c1c..906f1b34fe 100644 --- a/src/dbnode/integration/large_tiles_test.go +++ b/src/dbnode/integration/large_tiles_test.go @@ -117,11 +117,8 @@ func TestReadAggregateWrite(t *testing.T) { require.True(t, flushed) log.Info("verified data has been cold flushed", zap.Duration("took", time.Since(start))) - aggOpts := storage.AggregateTilesOptions{ - Start: dpTimeStart, - End: dpTimeStart.Add(blockSize), - Step: time.Hour, - } + aggOpts, err := storage.NewAggregateTilesOptions(dpTimeStart, dpTimeStart.Add(blockSize), time.Hour) + require.NoError(t, err) // Retry aggregation as persist manager could be still locked by cold writes. // TODO: Remove retry when a separate persist manager will be implemented. diff --git a/src/dbnode/network/server/tchannelthrift/node/service.go b/src/dbnode/network/server/tchannelthrift/node/service.go index 74c0f5217c..6f368f4969 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service.go +++ b/src/dbnode/network/server/tchannelthrift/node/service.go @@ -576,16 +576,15 @@ func (s *service) aggregateTiles( start, rangeStartErr := convert.ToTime(req.RangeStart, req.RangeType) end, rangeEndErr := convert.ToTime(req.RangeEnd, req.RangeType) step, stepErr := time.ParseDuration(req.Step) - if rangeStartErr != nil || rangeEndErr != nil || stepErr != nil { - multiErr := xerrors.NewMultiError().Add(rangeStartErr).Add(rangeEndErr).Add(stepErr) + opts, optsErr := storage.NewAggregateTilesOptions(start, end, step) + if rangeStartErr != nil || rangeEndErr != nil || stepErr != nil || optsErr != nil { + multiErr := xerrors.NewMultiError().Add(rangeStartErr).Add(rangeEndErr).Add(stepErr).Add(optsErr) return 0, tterrors.NewBadRequestError(multiErr.FinalError()) } sourceNsID := s.pools.id.GetStringID(ctx, req.SourceNameSpace) targetNsID := s.pools.id.GetStringID(ctx, req.TargetNameSpace) - opts := storage.AggregateTilesOptions{Start: start, End: end, Step: step} - processedBlockCount, err := db.AggregateTiles(ctx, sourceNsID, targetNsID, opts) if err != nil { return processedBlockCount, convert.ToRPCError(err) diff --git a/src/dbnode/storage/database.go b/src/dbnode/storage/database.go index 4ab8185153..e1531ee038 100644 --- a/src/dbnode/storage/database.go +++ b/src/dbnode/storage/database.go @@ -1141,3 +1141,15 @@ func (m metadatas) String() (string, error) { buf.WriteRune(']') return buf.String(), nil } + +func NewAggregateTilesOptions(start, end time.Time, step time.Duration) (AggregateTilesOptions, error) { + if !end.After(start) { + return AggregateTilesOptions{}, fmt.Errorf("AggregateTilesOptions.End must be after Start, got %s - %s", start, end) + } + + if step <= 0 { + return AggregateTilesOptions{}, fmt.Errorf("AggregateTilesOptions.Step must be positive, got %s", step) + } + + return AggregateTilesOptions{Start: start, End: end, Step: step}, nil +} diff --git a/src/dbnode/storage/database_test.go b/src/dbnode/storage/database_test.go index bade84c385..8a5cdfec98 100644 --- a/src/dbnode/storage/database_test.go +++ b/src/dbnode/storage/database_test.go @@ -1313,3 +1313,22 @@ func TestDatabaseAggregateTiles(t *testing.T) { require.NoError(t, err) assert.Equal(t, int64(4), processedBlockCount) } + +func TestNewAggregateTilesOptions(t *testing.T) { + start := time.Now().Truncate(time.Hour) + + _, err := NewAggregateTilesOptions(start, start.Add(-time.Second), time.Minute) + assert.Error(t, err) + + _, err = NewAggregateTilesOptions(start, start, time.Minute) + assert.Error(t, err) + + _, err = NewAggregateTilesOptions(start, start.Add(time.Second), -time.Minute) + assert.Error(t, err) + + _, err = NewAggregateTilesOptions(start, start.Add(time.Second), 0) + assert.Error(t, err) + + _, err = NewAggregateTilesOptions(start, start.Add(time.Second), time.Minute) + assert.NoError(t, err) +} From 5c857714b18788e3fa584a7d8ca1926f70ddaa08 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Fri, 24 Jul 2020 11:31:25 +0300 Subject: [PATCH 28/32] Unnest read locks --- .../server/tchannelthrift/node/service_test.go | 5 +++-- src/dbnode/storage/namespace.go | 11 +++-------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/dbnode/network/server/tchannelthrift/node/service_test.go b/src/dbnode/network/server/tchannelthrift/node/service_test.go index 9ea2d778cb..8cad7f01f4 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service_test.go +++ b/src/dbnode/network/server/tchannelthrift/node/service_test.go @@ -3048,9 +3048,9 @@ func TestServiceAggregateTiles(t *testing.T) { ident.NewIDMatcher(sourceNsID), ident.NewIDMatcher(targetNsID), storage.AggregateTilesOptions{Start: start, End: end, Step: stepDuration}, - ).Return(nil) + ).Return(int64(4), nil) - _, err := service.AggregateTiles(tctx, &rpc.AggregateTilesRequest{ + result, err := service.AggregateTiles(tctx, &rpc.AggregateTilesRequest{ SourceNameSpace: sourceNsID, TargetNameSpace: targetNsID, RangeStart: start.Unix(), @@ -3060,4 +3060,5 @@ func TestServiceAggregateTiles(t *testing.T) { RangeType: rpc.TimeType_UNIX_SECONDS, }) require.NoError(t, err) + assert.Equal(t, int64(4), result.ProcessedBlockCount) } diff --git a/src/dbnode/storage/namespace.go b/src/dbnode/storage/namespace.go index 1be87be4bb..2b2a3eb378 100644 --- a/src/dbnode/storage/namespace.go +++ b/src/dbnode/storage/namespace.go @@ -1598,32 +1598,27 @@ func (n *dbNamespace) AggregateTiles( opts AggregateTilesOptions, pm persist.Manager, ) (int64, error) { - // NB(rartoul): This value can be used for emitting metrics, but should not be used - // for business logic. callStart := n.nowFn() - n.RLock() - targetBlockSize := n.Metadata().Options().RetentionOptions().BlockSize() blockStart := opts.Start.Truncate(targetBlockSize) if blockStart.Add(targetBlockSize).Before(opts.End) { - n.RUnlock() n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) return 0, fmt.Errorf("tile aggregation must be done within a single target block (start=%s, end=%s, blockSize=%s)", opts.Start, opts.End, targetBlockSize.String()) } + n.RLock() if n.bootstrapState != Bootstrapped { n.RUnlock() n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) return 0, errNamespaceNotBootstrapped } - nsCtx := n.nsContextWithRLock() - targetShards := n.OwnedShards() - n.RUnlock() + targetShards := n.OwnedShards() + // Note: Cold writes must be enabled for Large Tiles to work. if !n.nopts.ColdWritesEnabled() { n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) From d22f27891a1e4f2bbe75172da8e2fa2e8bc46a86 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Fri, 24 Jul 2020 11:47:00 +0300 Subject: [PATCH 29/32] Use default instead of constant --- src/dbnode/storage/shard.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dbnode/storage/shard.go b/src/dbnode/storage/shard.go index 9049f3daec..c32fcc9c7f 100644 --- a/src/dbnode/storage/shard.go +++ b/src/dbnode/storage/shard.go @@ -2577,7 +2577,7 @@ func (s *dbShard) AggregateTiles( encodingOpts := encoding.NewOptions().SetBytesPool(s.opts.BytesPool()) bytesReader := bytes.NewReader(nil) - dataPointIter := m3tsz.NewReaderIterator(bytesReader, true, encodingOpts) + dataPointIter := m3tsz.NewReaderIterator(bytesReader, m3tsz.DefaultIntOptimizationEnabled, encodingOpts) var lastWriteError error var processedBlockCount int64 From 66a37a168959f6c2083b780a80a3ac12301a310b Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Fri, 24 Jul 2020 12:07:07 +0300 Subject: [PATCH 30/32] Fix test --- src/dbnode/storage/shard_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dbnode/storage/shard_test.go b/src/dbnode/storage/shard_test.go index fcb39d1f77..fd0e956f3d 100644 --- a/src/dbnode/storage/shard_test.go +++ b/src/dbnode/storage/shard_test.go @@ -1745,9 +1745,10 @@ func TestAggregateTiles(t *testing.T) { defer ctrl.Finish() var ( - ctx = context.NewContext() - start = time.Now().Truncate(time.Hour) - opts = AggregateTilesOptions{Start: start, End: start.Add(time.Hour)} + ctx = context.NewContext() + start = time.Now().Truncate(time.Hour) + opts = AggregateTilesOptions{Start: start, End: start.Add(time.Hour)} + bytes = checked.NewBytes([]byte{}, checked.NewBytesOptions()) ) sourceShard := testDatabaseShard(t, DefaultTestOptions()) @@ -1772,9 +1773,8 @@ func TestAggregateTiles(t *testing.T) { reader := fs.NewMockDataFileSetReader(ctrl) reader.EXPECT().Open(readerOpenOpts).Return(nil) - reader.EXPECT().Read(). - Return(ident.StringID("id1"), ident.EmptyTagIterator, checked.NewMockBytes(ctrl), uint32(11), nil). - Return(nil, nil, nil, uint32(0), io.EOF) + reader.EXPECT().Read().Return(ident.StringID("id1"), ident.EmptyTagIterator, bytes, uint32(11), nil) + reader.EXPECT().Read().Return(nil, nil, nil, uint32(0), io.EOF) reader.EXPECT().Close() processedBlockCount, err := targetShard.AggregateTiles(ctx, reader, sourceNsID, start, sourceShard, opts, series.WriteOptions{}) From f6a4d4336f0cbef9a223518e178d6f48b92de96f Mon Sep 17 00:00:00 2001 From: Gediminas Date: Fri, 24 Jul 2020 12:23:55 +0300 Subject: [PATCH 31/32] minor refactoring --- src/dbnode/storage/namespace.go | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/dbnode/storage/namespace.go b/src/dbnode/storage/namespace.go index 2b2a3eb378..dba0107966 100644 --- a/src/dbnode/storage/namespace.go +++ b/src/dbnode/storage/namespace.go @@ -1599,11 +1599,21 @@ func (n *dbNamespace) AggregateTiles( pm persist.Manager, ) (int64, error) { callStart := n.nowFn() + processedBlockCount, err := n.aggregateTiles(ctx, sourceNs, opts, pm) + n.metrics.writeAggData.ReportSuccessOrError(err, n.nowFn().Sub(callStart)) + return processedBlockCount, err +} + +func (n *dbNamespace) aggregateTiles( + ctx context.Context, + sourceNs databaseNamespace, + opts AggregateTilesOptions, + pm persist.Manager, +) (int64, error) { targetBlockSize := n.Metadata().Options().RetentionOptions().BlockSize() blockStart := opts.Start.Truncate(targetBlockSize) if blockStart.Add(targetBlockSize).Before(opts.End) { - n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) return 0, fmt.Errorf("tile aggregation must be done within a single target block (start=%s, end=%s, blockSize=%s)", opts.Start, opts.End, targetBlockSize.String()) } @@ -1611,7 +1621,6 @@ func (n *dbNamespace) AggregateTiles( n.RLock() if n.bootstrapState != Bootstrapped { n.RUnlock() - n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) return 0, errNamespaceNotBootstrapped } nsCtx := n.nsContextWithRLock() @@ -1621,7 +1630,6 @@ func (n *dbNamespace) AggregateTiles( // Note: Cold writes must be enabled for Large Tiles to work. if !n.nopts.ColdWritesEnabled() { - n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) return 0, errColdWritesDisabled } @@ -1631,7 +1639,6 @@ func (n *dbNamespace) AggregateTiles( sourceNsOpts := sourceNs.StorageOptions() reader, err := fs.NewReader(sourceNsOpts.BytesPool(), sourceNsOpts.CommitLogOptions().FilesystemOptions()) if err != nil { - n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) return 0, err } @@ -1642,7 +1649,6 @@ func (n *dbNamespace) AggregateTiles( resources, err := newColdFlushReuseableResources(n.opts) if err != nil { - n.metrics.writeAggData.ReportError(n.nowFn().Sub(callStart)) return 0, err } @@ -1668,10 +1674,7 @@ func (n *dbNamespace) AggregateTiles( multiErr = n.coldFlushSingleShard(nsCtx, targetShard, pm, resources, multiErr) } - res := multiErr.FinalError() - n.metrics.writeAggData.ReportSuccessOrError(res, n.nowFn().Sub(callStart)) - - return processedBlockCount, res + return processedBlockCount, multiErr.FinalError() } func (n *dbNamespace) coldFlushSingleShard( From d336b812a3382824debc256618d58b8529c3aff4 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Fri, 7 Aug 2020 13:15:34 +0300 Subject: [PATCH 32/32] Add HandleCounterResets to AggregateTilesOptions --- src/dbnode/integration/large_tiles_test.go | 2 +- .../network/server/tchannelthrift/node/service.go | 2 +- .../server/tchannelthrift/node/service_test.go | 2 +- src/dbnode/storage/database.go | 8 ++++++-- src/dbnode/storage/database_test.go | 15 +++++++++------ src/dbnode/storage/types.go | 7 +++++-- 6 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/dbnode/integration/large_tiles_test.go b/src/dbnode/integration/large_tiles_test.go index 906f1b34fe..a8d8f04a7a 100644 --- a/src/dbnode/integration/large_tiles_test.go +++ b/src/dbnode/integration/large_tiles_test.go @@ -117,7 +117,7 @@ func TestReadAggregateWrite(t *testing.T) { require.True(t, flushed) log.Info("verified data has been cold flushed", zap.Duration("took", time.Since(start))) - aggOpts, err := storage.NewAggregateTilesOptions(dpTimeStart, dpTimeStart.Add(blockSize), time.Hour) + aggOpts, err := storage.NewAggregateTilesOptions(dpTimeStart, dpTimeStart.Add(blockSize), time.Hour, false) require.NoError(t, err) // Retry aggregation as persist manager could be still locked by cold writes. diff --git a/src/dbnode/network/server/tchannelthrift/node/service.go b/src/dbnode/network/server/tchannelthrift/node/service.go index 6f368f4969..6f7f41e84e 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service.go +++ b/src/dbnode/network/server/tchannelthrift/node/service.go @@ -576,7 +576,7 @@ func (s *service) aggregateTiles( start, rangeStartErr := convert.ToTime(req.RangeStart, req.RangeType) end, rangeEndErr := convert.ToTime(req.RangeEnd, req.RangeType) step, stepErr := time.ParseDuration(req.Step) - opts, optsErr := storage.NewAggregateTilesOptions(start, end, step) + opts, optsErr := storage.NewAggregateTilesOptions(start, end, step, req.RemoveResets) if rangeStartErr != nil || rangeEndErr != nil || stepErr != nil || optsErr != nil { multiErr := xerrors.NewMultiError().Add(rangeStartErr).Add(rangeEndErr).Add(stepErr).Add(optsErr) return 0, tterrors.NewBadRequestError(multiErr.FinalError()) diff --git a/src/dbnode/network/server/tchannelthrift/node/service_test.go b/src/dbnode/network/server/tchannelthrift/node/service_test.go index 8cad7f01f4..f22898b007 100644 --- a/src/dbnode/network/server/tchannelthrift/node/service_test.go +++ b/src/dbnode/network/server/tchannelthrift/node/service_test.go @@ -3047,7 +3047,7 @@ func TestServiceAggregateTiles(t *testing.T) { ctx, ident.NewIDMatcher(sourceNsID), ident.NewIDMatcher(targetNsID), - storage.AggregateTilesOptions{Start: start, End: end, Step: stepDuration}, + storage.AggregateTilesOptions{Start: start, End: end, Step: stepDuration, HandleCounterResets: true}, ).Return(int64(4), nil) result, err := service.AggregateTiles(tctx, &rpc.AggregateTilesRequest{ diff --git a/src/dbnode/storage/database.go b/src/dbnode/storage/database.go index 2b667d1ca6..746025378c 100644 --- a/src/dbnode/storage/database.go +++ b/src/dbnode/storage/database.go @@ -1162,7 +1162,11 @@ func (m metadatas) String() (string, error) { return buf.String(), nil } -func NewAggregateTilesOptions(start, end time.Time, step time.Duration) (AggregateTilesOptions, error) { +func NewAggregateTilesOptions( + start, end time.Time, + step time.Duration, + handleCounterResets bool, +) (AggregateTilesOptions, error) { if !end.After(start) { return AggregateTilesOptions{}, fmt.Errorf("AggregateTilesOptions.End must be after Start, got %s - %s", start, end) } @@ -1171,5 +1175,5 @@ func NewAggregateTilesOptions(start, end time.Time, step time.Duration) (Aggrega return AggregateTilesOptions{}, fmt.Errorf("AggregateTilesOptions.Step must be positive, got %s", step) } - return AggregateTilesOptions{Start: start, End: end, Step: step}, nil + return AggregateTilesOptions{Start: start, End: end, Step: step, HandleCounterResets: handleCounterResets}, nil } diff --git a/src/dbnode/storage/database_test.go b/src/dbnode/storage/database_test.go index 8a5cdfec98..aed7befced 100644 --- a/src/dbnode/storage/database_test.go +++ b/src/dbnode/storage/database_test.go @@ -1302,9 +1302,12 @@ func TestDatabaseAggregateTiles(t *testing.T) { targetNsID = ident.StringID("target") ctx = context.NewContext() pm = d.opts.PersistManager() - opts = AggregateTilesOptions{Start: time.Now().Truncate(time.Hour)} + start = time.Now().Truncate(time.Hour) ) + opts, err := NewAggregateTilesOptions(start, start.Add(-time.Second), time.Minute, true) + require.NotNil(t, err) + sourceNs := dbAddNewMockNamespace(ctrl, d, sourceNsID.String()) targetNs := dbAddNewMockNamespace(ctrl, d, targetNsID.String()) targetNs.EXPECT().AggregateTiles(ctx, sourceNs, opts, pm).Return(int64(4), nil) @@ -1317,18 +1320,18 @@ func TestDatabaseAggregateTiles(t *testing.T) { func TestNewAggregateTilesOptions(t *testing.T) { start := time.Now().Truncate(time.Hour) - _, err := NewAggregateTilesOptions(start, start.Add(-time.Second), time.Minute) + _, err := NewAggregateTilesOptions(start, start.Add(-time.Second), time.Minute, false) assert.Error(t, err) - _, err = NewAggregateTilesOptions(start, start, time.Minute) + _, err = NewAggregateTilesOptions(start, start, time.Minute, false) assert.Error(t, err) - _, err = NewAggregateTilesOptions(start, start.Add(time.Second), -time.Minute) + _, err = NewAggregateTilesOptions(start, start.Add(time.Second), -time.Minute, false) assert.Error(t, err) - _, err = NewAggregateTilesOptions(start, start.Add(time.Second), 0) + _, err = NewAggregateTilesOptions(start, start.Add(time.Second), 0, false) assert.Error(t, err) - _, err = NewAggregateTilesOptions(start, start.Add(time.Second), time.Minute) + _, err = NewAggregateTilesOptions(start, start.Add(time.Second), time.Minute, false) assert.NoError(t, err) } diff --git a/src/dbnode/storage/types.go b/src/dbnode/storage/types.go index 05f3c0d92d..0b27782eca 100644 --- a/src/dbnode/storage/types.go +++ b/src/dbnode/storage/types.go @@ -1239,6 +1239,9 @@ type newFSMergeWithMemFn func( ) fs.MergeWith type AggregateTilesOptions struct { - Start, End time.Time - Step time.Duration + Start, End time.Time + Step time.Duration + // HandleCounterResets is temporarily used to force counter reset handling logics on the processed series. + // TODO: remove once we have metrics type stored in the metadata. + HandleCounterResets bool }