From 9a7b36ac0a4fcdf948d61cb8fd19b4078ebb18dd Mon Sep 17 00:00:00 2001 From: qicosmos Date: Fri, 31 May 2024 15:57:06 +0800 Subject: [PATCH 01/12] fix ssl option (#687) --- include/ylt/standalone/cinatra/coro_http_client.hpp | 7 ++++++- src/coro_http/examples/example.cpp | 11 +++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/include/ylt/standalone/cinatra/coro_http_client.hpp b/include/ylt/standalone/cinatra/coro_http_client.hpp index ce76a3572..5f90831b6 100644 --- a/include/ylt/standalone/cinatra/coro_http_client.hpp +++ b/include/ylt/standalone/cinatra/coro_http_client.hpp @@ -294,7 +294,12 @@ class coro_http_client : public std::enable_shared_from_this { bool no_schema = !has_schema(uri); std::string append_uri; if (no_schema) { - append_uri.append("http://").append(uri); +#ifdef CINATRA_ENABLE_SSL + if (is_ssl_schema_) + append_uri.append("https://").append(uri); + else +#endif + append_uri.append("http://").append(uri); } auto [ok, u] = handle_uri(data, no_schema ? append_uri : uri); diff --git a/src/coro_http/examples/example.cpp b/src/coro_http/examples/example.cpp index 38f8d7062..3c8142e62 100644 --- a/src/coro_http/examples/example.cpp +++ b/src/coro_http/examples/example.cpp @@ -424,6 +424,17 @@ async_simple::coro::Lazy basic_usage() { co_await client3.connect("https://www.baidu.com"); result = co_await client3.async_get("/"); assert(result.status == 200); + + coro_http_client client4{}; + client4.set_ssl_schema(true); + result = client4.get("www.baidu.com"); + assert(result.status == 200); + + coro_http_client client5{}; + client5.set_ssl_schema(true); + co_await client5.connect("www.baidu.com"); + result = co_await client5.async_get("/"); + assert(result.status == 200); #endif } From 9d2966424e9d7f96b01f43b0be4d88ab008ea05b Mon Sep 17 00:00:00 2001 From: saipubw Date: Tue, 4 Jun 2024 16:27:30 +0800 Subject: [PATCH 02/12] [struct_pack] support 256 field (#688) --- include/ylt/struct_pack/foreach_macro.h | 138 +- include/ylt/struct_pack/reflection.hpp | 7807 ++++++++++++++++- src/struct_pack/tests/test_many_members.cpp | 278 + test.cpp | 14 + website/docs/en/coro_rpc/coro_rpc_server.md | 2 +- .../en/struct_pack/struct_pack_type_system.md | 2 +- website/docs/zh/coro_rpc/coro_rpc_server.md | 2 +- .../zh/struct_pack/struct_pack_type_system.md | 2 +- 8 files changed, 7953 insertions(+), 292 deletions(-) create mode 100644 src/struct_pack/tests/test_many_members.cpp create mode 100644 test.cpp diff --git a/include/ylt/struct_pack/foreach_macro.h b/include/ylt/struct_pack/foreach_macro.h index 87ba6dc04..dcbed8a2c 100644 --- a/include/ylt/struct_pack/foreach_macro.h +++ b/include/ylt/struct_pack/foreach_macro.h @@ -15,23 +15,10 @@ */ #pragma once // clang-format off -#define STRUCT_PACK_ARG_COUNT(...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_INTERNAL_ARG_COUNT(0, ##__VA_ARGS__,\ - 64, 63, 62, 61, 60, \ - 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \ - 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \ - 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \ - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \ - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \ - 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)) +#define STRUCT_PACK_ARG_COUNT(...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_INTERNAL_ARG_COUNT(0, ##__VA_ARGS__,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)) #define STRUCT_PACK_INTERNAL_ARG_COUNT(\ - _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ - _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \ - _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, \ - _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, \ - _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, \ - _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, \ - _60, _61, _62, _63, _64, N, ...) N +_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69,_70,_71,_72,_73,_74,_75,_76,_77,_78,_79,_80,_81,_82,_83,_84,_85,_86,_87,_88,_89,_90,_91,_92,_93,_94,_95,_96,_97,_98,_99,_100,_101,_102,_103,_104,_105,_106,_107,_108,_109,_110,_111,_112,_113,_114,_115,_116,_117,_118,_119,_120,_121,_122,_123,_124, N, ...) N #define STRUCT_PACK_CONCAT_(l, r) l ## r #define STRUCT_PACK_CONCAT(l, r) STRUCT_PACK_CONCAT_(l, r) @@ -103,6 +90,66 @@ #define STRUCT_PACK_DOARG62(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG61(s,f,__VA_ARGS__)) s f(61,t) #define STRUCT_PACK_DOARG63(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG62(s,f,__VA_ARGS__)) s f(62,t) #define STRUCT_PACK_DOARG64(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG63(s,f,__VA_ARGS__)) s f(63,t) +#define STRUCT_PACK_DOARG65(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG64(s,f,__VA_ARGS__)) s f(64,t) +#define STRUCT_PACK_DOARG66(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG65(s,f,__VA_ARGS__)) s f(65,t) +#define STRUCT_PACK_DOARG67(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG66(s,f,__VA_ARGS__)) s f(66,t) +#define STRUCT_PACK_DOARG68(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG67(s,f,__VA_ARGS__)) s f(67,t) +#define STRUCT_PACK_DOARG69(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG68(s,f,__VA_ARGS__)) s f(68,t) +#define STRUCT_PACK_DOARG70(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG69(s,f,__VA_ARGS__)) s f(69,t) +#define STRUCT_PACK_DOARG71(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG70(s,f,__VA_ARGS__)) s f(70,t) +#define STRUCT_PACK_DOARG72(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG71(s,f,__VA_ARGS__)) s f(71,t) +#define STRUCT_PACK_DOARG73(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG72(s,f,__VA_ARGS__)) s f(72,t) +#define STRUCT_PACK_DOARG74(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG73(s,f,__VA_ARGS__)) s f(73,t) +#define STRUCT_PACK_DOARG75(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG74(s,f,__VA_ARGS__)) s f(74,t) +#define STRUCT_PACK_DOARG76(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG75(s,f,__VA_ARGS__)) s f(75,t) +#define STRUCT_PACK_DOARG77(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG76(s,f,__VA_ARGS__)) s f(76,t) +#define STRUCT_PACK_DOARG78(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG77(s,f,__VA_ARGS__)) s f(77,t) +#define STRUCT_PACK_DOARG79(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG78(s,f,__VA_ARGS__)) s f(78,t) +#define STRUCT_PACK_DOARG80(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG79(s,f,__VA_ARGS__)) s f(79,t) +#define STRUCT_PACK_DOARG81(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG80(s,f,__VA_ARGS__)) s f(80,t) +#define STRUCT_PACK_DOARG82(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG81(s,f,__VA_ARGS__)) s f(81,t) +#define STRUCT_PACK_DOARG83(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG82(s,f,__VA_ARGS__)) s f(82,t) +#define STRUCT_PACK_DOARG84(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG83(s,f,__VA_ARGS__)) s f(83,t) +#define STRUCT_PACK_DOARG85(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG84(s,f,__VA_ARGS__)) s f(84,t) +#define STRUCT_PACK_DOARG86(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG85(s,f,__VA_ARGS__)) s f(85,t) +#define STRUCT_PACK_DOARG87(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG86(s,f,__VA_ARGS__)) s f(86,t) +#define STRUCT_PACK_DOARG88(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG87(s,f,__VA_ARGS__)) s f(87,t) +#define STRUCT_PACK_DOARG89(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG88(s,f,__VA_ARGS__)) s f(88,t) +#define STRUCT_PACK_DOARG90(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG89(s,f,__VA_ARGS__)) s f(89,t) +#define STRUCT_PACK_DOARG91(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG90(s,f,__VA_ARGS__)) s f(90,t) +#define STRUCT_PACK_DOARG92(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG91(s,f,__VA_ARGS__)) s f(91,t) +#define STRUCT_PACK_DOARG93(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG92(s,f,__VA_ARGS__)) s f(92,t) +#define STRUCT_PACK_DOARG94(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG93(s,f,__VA_ARGS__)) s f(93,t) +#define STRUCT_PACK_DOARG95(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG94(s,f,__VA_ARGS__)) s f(94,t) +#define STRUCT_PACK_DOARG96(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG95(s,f,__VA_ARGS__)) s f(95,t) +#define STRUCT_PACK_DOARG97(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG96(s,f,__VA_ARGS__)) s f(96,t) +#define STRUCT_PACK_DOARG98(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG97(s,f,__VA_ARGS__)) s f(97,t) +#define STRUCT_PACK_DOARG99(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG98(s,f,__VA_ARGS__)) s f(98,t) +#define STRUCT_PACK_DOARG100(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG99(s,f,__VA_ARGS__)) s f(99,t) +#define STRUCT_PACK_DOARG101(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG100(s,f,__VA_ARGS__)) s f(100,t) +#define STRUCT_PACK_DOARG102(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG101(s,f,__VA_ARGS__)) s f(101,t) +#define STRUCT_PACK_DOARG103(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG102(s,f,__VA_ARGS__)) s f(102,t) +#define STRUCT_PACK_DOARG104(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG103(s,f,__VA_ARGS__)) s f(103,t) +#define STRUCT_PACK_DOARG105(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG104(s,f,__VA_ARGS__)) s f(104,t) +#define STRUCT_PACK_DOARG106(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG105(s,f,__VA_ARGS__)) s f(105,t) +#define STRUCT_PACK_DOARG107(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG106(s,f,__VA_ARGS__)) s f(106,t) +#define STRUCT_PACK_DOARG108(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG107(s,f,__VA_ARGS__)) s f(107,t) +#define STRUCT_PACK_DOARG109(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG108(s,f,__VA_ARGS__)) s f(108,t) +#define STRUCT_PACK_DOARG110(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG109(s,f,__VA_ARGS__)) s f(109,t) +#define STRUCT_PACK_DOARG111(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG110(s,f,__VA_ARGS__)) s f(110,t) +#define STRUCT_PACK_DOARG112(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG111(s,f,__VA_ARGS__)) s f(111,t) +#define STRUCT_PACK_DOARG113(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG112(s,f,__VA_ARGS__)) s f(112,t) +#define STRUCT_PACK_DOARG114(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG113(s,f,__VA_ARGS__)) s f(113,t) +#define STRUCT_PACK_DOARG115(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG114(s,f,__VA_ARGS__)) s f(114,t) +#define STRUCT_PACK_DOARG116(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG115(s,f,__VA_ARGS__)) s f(115,t) +#define STRUCT_PACK_DOARG117(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG116(s,f,__VA_ARGS__)) s f(116,t) +#define STRUCT_PACK_DOARG118(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG117(s,f,__VA_ARGS__)) s f(117,t) +#define STRUCT_PACK_DOARG119(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG118(s,f,__VA_ARGS__)) s f(118,t) +#define STRUCT_PACK_DOARG120(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG119(s,f,__VA_ARGS__)) s f(119,t) +#define STRUCT_PACK_DOARG121(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG120(s,f,__VA_ARGS__)) s f(120,t) +#define STRUCT_PACK_DOARG122(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG121(s,f,__VA_ARGS__)) s f(121,t) +#define STRUCT_PACK_DOARG123(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG122(s,f,__VA_ARGS__)) s f(122,t) +#define STRUCT_PACK_DOARG124(s,f,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG123(s,f,__VA_ARGS__)) s f(123,t) #define STRUCT_PACK_MAKE_ARGS0(Type) #define STRUCT_PACK_MAKE_ARGS1(Type) Type @@ -169,7 +216,66 @@ #define STRUCT_PACK_MAKE_ARGS62(Type) STRUCT_PACK_MAKE_ARGS61(Type), Type #define STRUCT_PACK_MAKE_ARGS63(Type) STRUCT_PACK_MAKE_ARGS62(Type), Type #define STRUCT_PACK_MAKE_ARGS64(Type) STRUCT_PACK_MAKE_ARGS63(Type), Type - +#define STRUCT_PACK_MAKE_ARGS65(Type) STRUCT_PACK_MAKE_ARGS64(Type), Type +#define STRUCT_PACK_MAKE_ARGS66(Type) STRUCT_PACK_MAKE_ARGS65(Type), Type +#define STRUCT_PACK_MAKE_ARGS67(Type) STRUCT_PACK_MAKE_ARGS66(Type), Type +#define STRUCT_PACK_MAKE_ARGS68(Type) STRUCT_PACK_MAKE_ARGS67(Type), Type +#define STRUCT_PACK_MAKE_ARGS69(Type) STRUCT_PACK_MAKE_ARGS68(Type), Type +#define STRUCT_PACK_MAKE_ARGS70(Type) STRUCT_PACK_MAKE_ARGS69(Type), Type +#define STRUCT_PACK_MAKE_ARGS71(Type) STRUCT_PACK_MAKE_ARGS70(Type), Type +#define STRUCT_PACK_MAKE_ARGS72(Type) STRUCT_PACK_MAKE_ARGS71(Type), Type +#define STRUCT_PACK_MAKE_ARGS73(Type) STRUCT_PACK_MAKE_ARGS72(Type), Type +#define STRUCT_PACK_MAKE_ARGS74(Type) STRUCT_PACK_MAKE_ARGS73(Type), Type +#define STRUCT_PACK_MAKE_ARGS75(Type) STRUCT_PACK_MAKE_ARGS74(Type), Type +#define STRUCT_PACK_MAKE_ARGS76(Type) STRUCT_PACK_MAKE_ARGS75(Type), Type +#define STRUCT_PACK_MAKE_ARGS77(Type) STRUCT_PACK_MAKE_ARGS76(Type), Type +#define STRUCT_PACK_MAKE_ARGS78(Type) STRUCT_PACK_MAKE_ARGS77(Type), Type +#define STRUCT_PACK_MAKE_ARGS79(Type) STRUCT_PACK_MAKE_ARGS78(Type), Type +#define STRUCT_PACK_MAKE_ARGS80(Type) STRUCT_PACK_MAKE_ARGS79(Type), Type +#define STRUCT_PACK_MAKE_ARGS81(Type) STRUCT_PACK_MAKE_ARGS80(Type), Type +#define STRUCT_PACK_MAKE_ARGS82(Type) STRUCT_PACK_MAKE_ARGS81(Type), Type +#define STRUCT_PACK_MAKE_ARGS83(Type) STRUCT_PACK_MAKE_ARGS82(Type), Type +#define STRUCT_PACK_MAKE_ARGS84(Type) STRUCT_PACK_MAKE_ARGS83(Type), Type +#define STRUCT_PACK_MAKE_ARGS85(Type) STRUCT_PACK_MAKE_ARGS84(Type), Type +#define STRUCT_PACK_MAKE_ARGS86(Type) STRUCT_PACK_MAKE_ARGS85(Type), Type +#define STRUCT_PACK_MAKE_ARGS87(Type) STRUCT_PACK_MAKE_ARGS86(Type), Type +#define STRUCT_PACK_MAKE_ARGS88(Type) STRUCT_PACK_MAKE_ARGS87(Type), Type +#define STRUCT_PACK_MAKE_ARGS89(Type) STRUCT_PACK_MAKE_ARGS88(Type), Type +#define STRUCT_PACK_MAKE_ARGS90(Type) STRUCT_PACK_MAKE_ARGS89(Type), Type +#define STRUCT_PACK_MAKE_ARGS91(Type) STRUCT_PACK_MAKE_ARGS90(Type), Type +#define STRUCT_PACK_MAKE_ARGS92(Type) STRUCT_PACK_MAKE_ARGS91(Type), Type +#define STRUCT_PACK_MAKE_ARGS93(Type) STRUCT_PACK_MAKE_ARGS92(Type), Type +#define STRUCT_PACK_MAKE_ARGS94(Type) STRUCT_PACK_MAKE_ARGS93(Type), Type +#define STRUCT_PACK_MAKE_ARGS95(Type) STRUCT_PACK_MAKE_ARGS94(Type), Type +#define STRUCT_PACK_MAKE_ARGS96(Type) STRUCT_PACK_MAKE_ARGS95(Type), Type +#define STRUCT_PACK_MAKE_ARGS97(Type) STRUCT_PACK_MAKE_ARGS96(Type), Type +#define STRUCT_PACK_MAKE_ARGS98(Type) STRUCT_PACK_MAKE_ARGS97(Type), Type +#define STRUCT_PACK_MAKE_ARGS99(Type) STRUCT_PACK_MAKE_ARGS98(Type), Type +#define STRUCT_PACK_MAKE_ARGS100(Type) STRUCT_PACK_MAKE_ARGS99(Type), Type +#define STRUCT_PACK_MAKE_ARGS101(Type) STRUCT_PACK_MAKE_ARGS100(Type), Type +#define STRUCT_PACK_MAKE_ARGS102(Type) STRUCT_PACK_MAKE_ARGS101(Type), Type +#define STRUCT_PACK_MAKE_ARGS103(Type) STRUCT_PACK_MAKE_ARGS102(Type), Type +#define STRUCT_PACK_MAKE_ARGS104(Type) STRUCT_PACK_MAKE_ARGS103(Type), Type +#define STRUCT_PACK_MAKE_ARGS105(Type) STRUCT_PACK_MAKE_ARGS104(Type), Type +#define STRUCT_PACK_MAKE_ARGS106(Type) STRUCT_PACK_MAKE_ARGS105(Type), Type +#define STRUCT_PACK_MAKE_ARGS107(Type) STRUCT_PACK_MAKE_ARGS106(Type), Type +#define STRUCT_PACK_MAKE_ARGS108(Type) STRUCT_PACK_MAKE_ARGS107(Type), Type +#define STRUCT_PACK_MAKE_ARGS109(Type) STRUCT_PACK_MAKE_ARGS108(Type), Type +#define STRUCT_PACK_MAKE_ARGS110(Type) STRUCT_PACK_MAKE_ARGS109(Type), Type +#define STRUCT_PACK_MAKE_ARGS111(Type) STRUCT_PACK_MAKE_ARGS110(Type), Type +#define STRUCT_PACK_MAKE_ARGS112(Type) STRUCT_PACK_MAKE_ARGS111(Type), Type +#define STRUCT_PACK_MAKE_ARGS113(Type) STRUCT_PACK_MAKE_ARGS112(Type), Type +#define STRUCT_PACK_MAKE_ARGS114(Type) STRUCT_PACK_MAKE_ARGS113(Type), Type +#define STRUCT_PACK_MAKE_ARGS115(Type) STRUCT_PACK_MAKE_ARGS114(Type), Type +#define STRUCT_PACK_MAKE_ARGS116(Type) STRUCT_PACK_MAKE_ARGS115(Type), Type +#define STRUCT_PACK_MAKE_ARGS117(Type) STRUCT_PACK_MAKE_ARGS116(Type), Type +#define STRUCT_PACK_MAKE_ARGS118(Type) STRUCT_PACK_MAKE_ARGS117(Type), Type +#define STRUCT_PACK_MAKE_ARGS119(Type) STRUCT_PACK_MAKE_ARGS118(Type), Type +#define STRUCT_PACK_MAKE_ARGS120(Type) STRUCT_PACK_MAKE_ARGS119(Type), Type +#define STRUCT_PACK_MAKE_ARGS121(Type) STRUCT_PACK_MAKE_ARGS120(Type), Type +#define STRUCT_PACK_MAKE_ARGS122(Type) STRUCT_PACK_MAKE_ARGS121(Type), Type +#define STRUCT_PACK_MAKE_ARGS123(Type) STRUCT_PACK_MAKE_ARGS122(Type), Type +#define STRUCT_PACK_MAKE_ARGS124(Type) STRUCT_PACK_MAKE_ARGS123(Type), Type #define STRUCT_PACK_MAKE_ARGS(Type,Count) \ STRUCT_PACK_CONCAT(STRUCT_PACK_MAKE_ARGS,Count)(Type) diff --git a/include/ylt/struct_pack/reflection.hpp b/include/ylt/struct_pack/reflection.hpp index e20346b6b..6aa0da1d1 100644 --- a/include/ylt/struct_pack/reflection.hpp +++ b/include/ylt/struct_pack/reflection.hpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +// clang-format off #pragma once #include #include @@ -189,7 +190,6 @@ constexpr bool can_shrink_to_fit = can_shrink_to_fit_impl::value; template struct compatible; -// clang-format off namespace detail { #if __cpp_concepts >= 201907L @@ -1011,7 +1011,7 @@ constexpr bool trivially_copyable_container = } } - constexpr static auto MaxVisitMembers = 64; + constexpr static auto MaxVisitMembers = 256; template constexpr decltype(auto) STRUCT_PACK_INLINE visit_members_by_user_defined_refl(Object &&object, @@ -1032,143 +1032,1723 @@ constexpr bool trivially_copyable_container = return visit_members_by_structure_binding(object,visitor); } } + template + constexpr decltype(auto) STRUCT_PACK_INLINE + visit_members_by_user_defined_refl(Object &&o, Visitor &&visitor) { + using type = remove_cvref_t; + constexpr auto Count = decltype(STRUCT_PACK_FIELD_COUNT(o))::value; - template - constexpr decltype(auto) STRUCT_PACK_INLINE visit_members_by_user_defined_refl(Object &&object, - Visitor &&visitor) { - using type = remove_cvref_t; - constexpr auto Count = decltype(STRUCT_PACK_FIELD_COUNT(object))::value; - static_assert(Count <= MaxVisitMembers, "exceed max visit members"); if constexpr (Count >= 0) { - if constexpr (Count==1) { return visitor(STRUCT_PACK_GET_0(object)); + if constexpr (Count == 1) { + return visitor(_SPG0(o)); + } + else if constexpr (Count == 2) { + return visitor(_SPG0(o), _SPG1(o)); + } + else if constexpr (Count == 3) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o)); + } + else if constexpr (Count == 4) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o)); + } + else if constexpr (Count == 5) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o)); + } + else if constexpr (Count == 6) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o)); + } + else if constexpr (Count == 7) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o)); + } + else if constexpr (Count == 8) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o)); + } + else if constexpr (Count == 9) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o)); + } + else if constexpr (Count == 10) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o)); + } + else if constexpr (Count == 11) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o)); + } + else if constexpr (Count == 12) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o)); + } + else if constexpr (Count == 13) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o)); + } + else if constexpr (Count == 14) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o)); + } + else if constexpr (Count == 15) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o)); + } + else if constexpr (Count == 16) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o)); + } + else if constexpr (Count == 17) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o)); + } + else if constexpr (Count == 18) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o)); + } + else if constexpr (Count == 19) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o)); + } + else if constexpr (Count == 20) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o)); + } + else if constexpr (Count == 21) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o)); + } + else if constexpr (Count == 22) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o)); + } + else if constexpr (Count == 23) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o)); + } + else if constexpr (Count == 24) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o)); + } + else if constexpr (Count == 25) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o)); + } + else if constexpr (Count == 26) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o)); + } + else if constexpr (Count == 27) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o)); + } + else if constexpr (Count == 28) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o)); + } + else if constexpr (Count == 29) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o)); + } + else if constexpr (Count == 30) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o)); + } + else if constexpr (Count == 31) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o)); + } + else if constexpr (Count == 32) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o)); + } + else if constexpr (Count == 33) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o)); + } + else if constexpr (Count == 34) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o)); + } + else if constexpr (Count == 35) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o)); + } + else if constexpr (Count == 36) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o)); + } + else if constexpr (Count == 37) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), + _SPG35(o), _SPG36(o)); + } + else if constexpr (Count == 38) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), + _SPG35(o), _SPG36(o), _SPG37(o)); + } + else if constexpr (Count == 39) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), + _SPG35(o), _SPG36(o), _SPG37(o), _SPG38(o)); + } + else if constexpr (Count == 40) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), + _SPG35(o), _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o)); + } + else if constexpr (Count == 41) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o)); + } + else if constexpr (Count == 42) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o)); + } + else if constexpr (Count == 43) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), + _SPG35(o), _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), + _SPG40(o), _SPG41(o), _SPG42(o)); + } + else if constexpr (Count == 44) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), + _SPG35(o), _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), + _SPG40(o), _SPG41(o), _SPG42(o), _SPG43(o)); + } + else if constexpr (Count == 45) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), + _SPG35(o), _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), + _SPG40(o), _SPG41(o), _SPG42(o), _SPG43(o), _SPG44(o)); + } + else if constexpr (Count == 46) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o)); + } + else if constexpr (Count == 47) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o)); + } + else if constexpr (Count == 48) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o)); + } + else if constexpr (Count == 49) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), + _SPG35(o), _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), + _SPG40(o), _SPG41(o), _SPG42(o), _SPG43(o), _SPG44(o), + _SPG45(o), _SPG46(o), _SPG47(o), _SPG48(o)); + } + else if constexpr (Count == 50) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), + _SPG35(o), _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), + _SPG40(o), _SPG41(o), _SPG42(o), _SPG43(o), _SPG44(o), + _SPG45(o), _SPG46(o), _SPG47(o), _SPG48(o), _SPG49(o)); + } + else if constexpr (Count == 51) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o)); + } + else if constexpr (Count == 52) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o)); + } + else if constexpr (Count == 53) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o)); + } + else if constexpr (Count == 54) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o)); + } + else if constexpr (Count == 55) { + return visitor(_SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), + _SPG5(o), _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), + _SPG10(o), _SPG11(o), _SPG12(o), _SPG13(o), _SPG14(o), + _SPG15(o), _SPG16(o), _SPG17(o), _SPG18(o), _SPG19(o), + _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), _SPG24(o), + _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), + _SPG35(o), _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), + _SPG40(o), _SPG41(o), _SPG42(o), _SPG43(o), _SPG44(o), + _SPG45(o), _SPG46(o), _SPG47(o), _SPG48(o), _SPG49(o), + _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), _SPG54(o)); + } + else if constexpr (Count == 56) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o)); + } + else if constexpr (Count == 57) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o)); + } + else if constexpr (Count == 58) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o)); + } + else if constexpr (Count == 59) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o)); } - else if constexpr (Count==2) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object)); + else if constexpr (Count == 60) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o)); } - else if constexpr (Count==3) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object)); + else if constexpr (Count == 61) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o)); } - else if constexpr (Count==4) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object)); + else if constexpr (Count == 62) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o)); } - else if constexpr (Count==5) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object)); + else if constexpr (Count == 63) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o)); } - else if constexpr (Count==6) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object)); + else if constexpr (Count == 64) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o)); } - else if constexpr (Count==7) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object)); + else if constexpr (Count == 65) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o)); } - else if constexpr (Count==8) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object)); + else if constexpr (Count == 66) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o)); } - else if constexpr (Count==9) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object)); + else if constexpr (Count == 67) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o)); } - else if constexpr (Count==10) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object)); + else if constexpr (Count == 68) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o)); } - else if constexpr (Count==11) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object)); + else if constexpr (Count == 69) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o)); } - else if constexpr (Count==12) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object)); + else if constexpr (Count == 70) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o)); } - else if constexpr (Count==13) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object)); + else if constexpr (Count == 71) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o)); } - else if constexpr (Count==14) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object)); + else if constexpr (Count == 72) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o)); } - else if constexpr (Count==15) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object)); + else if constexpr (Count == 73) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o)); } - else if constexpr (Count==16) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object)); + else if constexpr (Count == 74) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o)); } - else if constexpr (Count==17) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object)); + else if constexpr (Count == 75) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o)); } - else if constexpr (Count==18) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object)); + else if constexpr (Count == 76) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o)); } - else if constexpr (Count==19) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object)); + else if constexpr (Count == 77) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o)); } - else if constexpr (Count==20) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object)); + else if constexpr (Count == 78) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o)); } - else if constexpr (Count==21) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object)); + else if constexpr (Count == 79) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o)); } - else if constexpr (Count==22) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object)); + else if constexpr (Count == 80) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o)); } - else if constexpr (Count==23) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object)); + else if constexpr (Count == 81) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o)); } - else if constexpr (Count==24) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object)); + else if constexpr (Count == 82) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o)); } - else if constexpr (Count==25) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object)); + else if constexpr (Count == 83) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o)); } - else if constexpr (Count==26) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object)); + else if constexpr (Count == 84) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o)); } - else if constexpr (Count==27) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object)); + else if constexpr (Count == 85) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o)); } - else if constexpr (Count==28) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object)); + else if constexpr (Count == 86) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o)); } - else if constexpr (Count==29) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object)); + else if constexpr (Count == 87) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o)); } - else if constexpr (Count==30) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object)); + else if constexpr (Count == 88) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o)); } - else if constexpr (Count==31) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object)); + else if constexpr (Count == 89) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o)); } - else if constexpr (Count==32) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object)); + else if constexpr (Count == 90) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o)); } - else if constexpr (Count==33) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object)); + else if constexpr (Count == 91) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o)); } - else if constexpr (Count==34) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object)); + else if constexpr (Count == 92) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o)); } - else if constexpr (Count==35) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object)); + else if constexpr (Count == 93) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o)); } - else if constexpr (Count==36) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object)); + else if constexpr (Count == 94) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o)); } - else if constexpr (Count==37) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object)); + else if constexpr (Count == 95) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o)); } - else if constexpr (Count==38) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object)); + else if constexpr (Count == 96) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o)); } - else if constexpr (Count==39) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object)); + else if constexpr (Count == 97) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o)); } - else if constexpr (Count==40) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object)); + else if constexpr (Count == 98) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o)); } - else if constexpr (Count==41) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object)); + else if constexpr (Count == 99) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o)); } - else if constexpr (Count==42) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object)); + else if constexpr (Count == 100) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o)); } - else if constexpr (Count==43) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object)); + else if constexpr (Count == 101) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o)); } - else if constexpr (Count==44) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object)); + else if constexpr (Count == 102) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o)); } - else if constexpr (Count==45) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object)); + else if constexpr (Count == 103) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o)); } - else if constexpr (Count==46) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object)); + else if constexpr (Count == 104) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o)); } - else if constexpr (Count==47) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object)); + else if constexpr (Count == 105) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o)); } - else if constexpr (Count==48) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object)); + else if constexpr (Count == 106) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o)); } - else if constexpr (Count==49) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object)); + else if constexpr (Count == 107) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o)); } - else if constexpr (Count==50) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object),STRUCT_PACK_GET_49(object)); + else if constexpr (Count == 108) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o)); } - else if constexpr (Count==51) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object),STRUCT_PACK_GET_49(object),STRUCT_PACK_GET_50(object)); + else if constexpr (Count == 109) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o)); } - else if constexpr (Count==52) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object),STRUCT_PACK_GET_49(object),STRUCT_PACK_GET_50(object),STRUCT_PACK_GET_51(object)); + else if constexpr (Count == 110) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o), _SPG109(o)); } - else if constexpr (Count==53) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object),STRUCT_PACK_GET_49(object),STRUCT_PACK_GET_50(object),STRUCT_PACK_GET_51(object),STRUCT_PACK_GET_52(object)); + else if constexpr (Count == 111) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o), _SPG109(o), _SPG110(o)); } - else if constexpr (Count==54) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object),STRUCT_PACK_GET_49(object),STRUCT_PACK_GET_50(object),STRUCT_PACK_GET_51(object),STRUCT_PACK_GET_52(object),STRUCT_PACK_GET_53(object)); + else if constexpr (Count == 112) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o), _SPG109(o), _SPG110(o), _SPG111(o)); } - else if constexpr (Count==55) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object),STRUCT_PACK_GET_49(object),STRUCT_PACK_GET_50(object),STRUCT_PACK_GET_51(object),STRUCT_PACK_GET_52(object),STRUCT_PACK_GET_53(object),STRUCT_PACK_GET_54(object)); + else if constexpr (Count == 113) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o), _SPG109(o), _SPG110(o), _SPG111(o), + _SPG112(o)); } - else if constexpr (Count==56) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object),STRUCT_PACK_GET_49(object),STRUCT_PACK_GET_50(object),STRUCT_PACK_GET_51(object),STRUCT_PACK_GET_52(object),STRUCT_PACK_GET_53(object),STRUCT_PACK_GET_54(object),STRUCT_PACK_GET_55(object)); + else if constexpr (Count == 114) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o), _SPG109(o), _SPG110(o), _SPG111(o), + _SPG112(o), _SPG113(o)); } - else if constexpr (Count==57) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object),STRUCT_PACK_GET_49(object),STRUCT_PACK_GET_50(object),STRUCT_PACK_GET_51(object),STRUCT_PACK_GET_52(object),STRUCT_PACK_GET_53(object),STRUCT_PACK_GET_54(object),STRUCT_PACK_GET_55(object),STRUCT_PACK_GET_56(object)); + else if constexpr (Count == 115) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o), _SPG109(o), _SPG110(o), _SPG111(o), + _SPG112(o), _SPG113(o), _SPG114(o)); } - else if constexpr (Count==58) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object),STRUCT_PACK_GET_49(object),STRUCT_PACK_GET_50(object),STRUCT_PACK_GET_51(object),STRUCT_PACK_GET_52(object),STRUCT_PACK_GET_53(object),STRUCT_PACK_GET_54(object),STRUCT_PACK_GET_55(object),STRUCT_PACK_GET_56(object),STRUCT_PACK_GET_57(object)); + else if constexpr (Count == 116) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o), _SPG109(o), _SPG110(o), _SPG111(o), + _SPG112(o), _SPG113(o), _SPG114(o), _SPG115(o)); } - else if constexpr (Count==59) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object),STRUCT_PACK_GET_49(object),STRUCT_PACK_GET_50(object),STRUCT_PACK_GET_51(object),STRUCT_PACK_GET_52(object),STRUCT_PACK_GET_53(object),STRUCT_PACK_GET_54(object),STRUCT_PACK_GET_55(object),STRUCT_PACK_GET_56(object),STRUCT_PACK_GET_57(object),STRUCT_PACK_GET_58(object)); + else if constexpr (Count == 117) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o), _SPG109(o), _SPG110(o), _SPG111(o), + _SPG112(o), _SPG113(o), _SPG114(o), _SPG115(o), _SPG116(o)); } - else if constexpr (Count==60) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object),STRUCT_PACK_GET_49(object),STRUCT_PACK_GET_50(object),STRUCT_PACK_GET_51(object),STRUCT_PACK_GET_52(object),STRUCT_PACK_GET_53(object),STRUCT_PACK_GET_54(object),STRUCT_PACK_GET_55(object),STRUCT_PACK_GET_56(object),STRUCT_PACK_GET_57(object),STRUCT_PACK_GET_58(object),STRUCT_PACK_GET_59(object)); + else if constexpr (Count == 118) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o), _SPG109(o), _SPG110(o), _SPG111(o), + _SPG112(o), _SPG113(o), _SPG114(o), _SPG115(o), _SPG116(o), + _SPG117(o)); } - else if constexpr (Count==61) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object),STRUCT_PACK_GET_49(object),STRUCT_PACK_GET_50(object),STRUCT_PACK_GET_51(object),STRUCT_PACK_GET_52(object),STRUCT_PACK_GET_53(object),STRUCT_PACK_GET_54(object),STRUCT_PACK_GET_55(object),STRUCT_PACK_GET_56(object),STRUCT_PACK_GET_57(object),STRUCT_PACK_GET_58(object),STRUCT_PACK_GET_59(object),STRUCT_PACK_GET_60(object)); + else if constexpr (Count == 119) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o), _SPG109(o), _SPG110(o), _SPG111(o), + _SPG112(o), _SPG113(o), _SPG114(o), _SPG115(o), _SPG116(o), + _SPG117(o), _SPG118(o)); } - else if constexpr (Count==62) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object),STRUCT_PACK_GET_49(object),STRUCT_PACK_GET_50(object),STRUCT_PACK_GET_51(object),STRUCT_PACK_GET_52(object),STRUCT_PACK_GET_53(object),STRUCT_PACK_GET_54(object),STRUCT_PACK_GET_55(object),STRUCT_PACK_GET_56(object),STRUCT_PACK_GET_57(object),STRUCT_PACK_GET_58(object),STRUCT_PACK_GET_59(object),STRUCT_PACK_GET_60(object),STRUCT_PACK_GET_61(object)); + else if constexpr (Count == 120) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o), _SPG109(o), _SPG110(o), _SPG111(o), + _SPG112(o), _SPG113(o), _SPG114(o), _SPG115(o), _SPG116(o), + _SPG117(o), _SPG118(o), _SPG119(o)); } - else if constexpr (Count==63) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object),STRUCT_PACK_GET_49(object),STRUCT_PACK_GET_50(object),STRUCT_PACK_GET_51(object),STRUCT_PACK_GET_52(object),STRUCT_PACK_GET_53(object),STRUCT_PACK_GET_54(object),STRUCT_PACK_GET_55(object),STRUCT_PACK_GET_56(object),STRUCT_PACK_GET_57(object),STRUCT_PACK_GET_58(object),STRUCT_PACK_GET_59(object),STRUCT_PACK_GET_60(object),STRUCT_PACK_GET_61(object),STRUCT_PACK_GET_62(object)); + else if constexpr (Count == 121) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o), _SPG109(o), _SPG110(o), _SPG111(o), + _SPG112(o), _SPG113(o), _SPG114(o), _SPG115(o), _SPG116(o), + _SPG117(o), _SPG118(o), _SPG119(o), _SPG120(o)); + } + else if constexpr (Count == 122) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o), _SPG109(o), _SPG110(o), _SPG111(o), + _SPG112(o), _SPG113(o), _SPG114(o), _SPG115(o), _SPG116(o), + _SPG117(o), _SPG118(o), _SPG119(o), _SPG120(o), _SPG121(o)); + } + else if constexpr (Count == 123) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o), _SPG109(o), _SPG110(o), _SPG111(o), + _SPG112(o), _SPG113(o), _SPG114(o), _SPG115(o), _SPG116(o), + _SPG117(o), _SPG118(o), _SPG119(o), _SPG120(o), _SPG121(o), + _SPG122(o)); + } + else if constexpr (Count == 124) { + return visitor( + _SPG0(o), _SPG1(o), _SPG2(o), _SPG3(o), _SPG4(o), _SPG5(o), + _SPG6(o), _SPG7(o), _SPG8(o), _SPG9(o), _SPG10(o), _SPG11(o), + _SPG12(o), _SPG13(o), _SPG14(o), _SPG15(o), _SPG16(o), _SPG17(o), + _SPG18(o), _SPG19(o), _SPG20(o), _SPG21(o), _SPG22(o), _SPG23(o), + _SPG24(o), _SPG25(o), _SPG26(o), _SPG27(o), _SPG28(o), _SPG29(o), + _SPG30(o), _SPG31(o), _SPG32(o), _SPG33(o), _SPG34(o), _SPG35(o), + _SPG36(o), _SPG37(o), _SPG38(o), _SPG39(o), _SPG40(o), _SPG41(o), + _SPG42(o), _SPG43(o), _SPG44(o), _SPG45(o), _SPG46(o), _SPG47(o), + _SPG48(o), _SPG49(o), _SPG50(o), _SPG51(o), _SPG52(o), _SPG53(o), + _SPG54(o), _SPG55(o), _SPG56(o), _SPG57(o), _SPG58(o), _SPG59(o), + _SPG60(o), _SPG61(o), _SPG62(o), _SPG63(o), _SPG64(o), _SPG65(o), + _SPG66(o), _SPG67(o), _SPG68(o), _SPG69(o), _SPG70(o), _SPG71(o), + _SPG72(o), _SPG73(o), _SPG74(o), _SPG75(o), _SPG76(o), _SPG77(o), + _SPG78(o), _SPG79(o), _SPG80(o), _SPG81(o), _SPG82(o), _SPG83(o), + _SPG84(o), _SPG85(o), _SPG86(o), _SPG87(o), _SPG88(o), _SPG89(o), + _SPG90(o), _SPG91(o), _SPG92(o), _SPG93(o), _SPG94(o), _SPG95(o), + _SPG96(o), _SPG97(o), _SPG98(o), _SPG99(o), _SPG100(o), _SPG101(o), + _SPG102(o), _SPG103(o), _SPG104(o), _SPG105(o), _SPG106(o), + _SPG107(o), _SPG108(o), _SPG109(o), _SPG110(o), _SPG111(o), + _SPG112(o), _SPG113(o), _SPG114(o), _SPG115(o), _SPG116(o), + _SPG117(o), _SPG118(o), _SPG119(o), _SPG120(o), _SPG121(o), + _SPG122(o), _SPG123(o)); } - else if constexpr (Count==64) { return visitor(STRUCT_PACK_GET_0(object),STRUCT_PACK_GET_1(object),STRUCT_PACK_GET_2(object),STRUCT_PACK_GET_3(object),STRUCT_PACK_GET_4(object),STRUCT_PACK_GET_5(object),STRUCT_PACK_GET_6(object),STRUCT_PACK_GET_7(object),STRUCT_PACK_GET_8(object),STRUCT_PACK_GET_9(object),STRUCT_PACK_GET_10(object),STRUCT_PACK_GET_11(object),STRUCT_PACK_GET_12(object),STRUCT_PACK_GET_13(object),STRUCT_PACK_GET_14(object),STRUCT_PACK_GET_15(object),STRUCT_PACK_GET_16(object),STRUCT_PACK_GET_17(object),STRUCT_PACK_GET_18(object),STRUCT_PACK_GET_19(object),STRUCT_PACK_GET_20(object),STRUCT_PACK_GET_21(object),STRUCT_PACK_GET_22(object),STRUCT_PACK_GET_23(object),STRUCT_PACK_GET_24(object),STRUCT_PACK_GET_25(object),STRUCT_PACK_GET_26(object),STRUCT_PACK_GET_27(object),STRUCT_PACK_GET_28(object),STRUCT_PACK_GET_29(object),STRUCT_PACK_GET_30(object),STRUCT_PACK_GET_31(object),STRUCT_PACK_GET_32(object),STRUCT_PACK_GET_33(object),STRUCT_PACK_GET_34(object),STRUCT_PACK_GET_35(object),STRUCT_PACK_GET_36(object),STRUCT_PACK_GET_37(object),STRUCT_PACK_GET_38(object),STRUCT_PACK_GET_39(object),STRUCT_PACK_GET_40(object),STRUCT_PACK_GET_41(object),STRUCT_PACK_GET_42(object),STRUCT_PACK_GET_43(object),STRUCT_PACK_GET_44(object),STRUCT_PACK_GET_45(object),STRUCT_PACK_GET_46(object),STRUCT_PACK_GET_47(object),STRUCT_PACK_GET_48(object),STRUCT_PACK_GET_49(object),STRUCT_PACK_GET_50(object),STRUCT_PACK_GET_51(object),STRUCT_PACK_GET_52(object),STRUCT_PACK_GET_53(object),STRUCT_PACK_GET_54(object),STRUCT_PACK_GET_55(object),STRUCT_PACK_GET_56(object),STRUCT_PACK_GET_57(object),STRUCT_PACK_GET_58(object),STRUCT_PACK_GET_59(object),STRUCT_PACK_GET_60(object),STRUCT_PACK_GET_61(object),STRUCT_PACK_GET_62(object),STRUCT_PACK_GET_63(object)); - } } else { static_assert(!sizeof(type), "empty struct/class is not allowed!"); @@ -1725,195 +3305,5879 @@ constexpr bool trivially_copyable_container = a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, a62, a63, a64); } - } -// clang-format off -template -constexpr decltype(auto) STRUCT_PACK_INLINE template_switch(std::size_t index, - Args &&...args) { - switch (index) { - case 0: - return Func::template run<0>(std::forward(args)...); - case 1: - return Func::template run<1>(std::forward(args)...); - case 2: - return Func::template run<2>(std::forward(args)...); - case 3: - return Func::template run<3>(std::forward(args)...); - case 4: - return Func::template run<4>(std::forward(args)...); - case 5: - return Func::template run<5>(std::forward(args)...); - case 6: - return Func::template run<6>(std::forward(args)...); - case 7: - return Func::template run<7>(std::forward(args)...); - case 8: - return Func::template run<8>(std::forward(args)...); - case 9: - return Func::template run<9>(std::forward(args)...); - case 10: - return Func::template run<10>(std::forward(args)...); - case 11: - return Func::template run<11>(std::forward(args)...); - case 12: - return Func::template run<12>(std::forward(args)...); - case 13: - return Func::template run<13>(std::forward(args)...); - case 14: - return Func::template run<14>(std::forward(args)...); - case 15: - return Func::template run<15>(std::forward(args)...); - case 16: - return Func::template run<16>(std::forward(args)...); - case 17: - return Func::template run<17>(std::forward(args)...); - case 18: - return Func::template run<18>(std::forward(args)...); - case 19: - return Func::template run<19>(std::forward(args)...); - case 20: - return Func::template run<20>(std::forward(args)...); - case 21: - return Func::template run<21>(std::forward(args)...); - case 22: - return Func::template run<22>(std::forward(args)...); - case 23: - return Func::template run<23>(std::forward(args)...); - case 24: - return Func::template run<24>(std::forward(args)...); - case 25: - return Func::template run<25>(std::forward(args)...); - case 26: - return Func::template run<26>(std::forward(args)...); - case 27: - return Func::template run<27>(std::forward(args)...); - case 28: - return Func::template run<28>(std::forward(args)...); - case 29: - return Func::template run<29>(std::forward(args)...); - case 30: - return Func::template run<30>(std::forward(args)...); - case 31: - return Func::template run<31>(std::forward(args)...); - case 32: - return Func::template run<32>(std::forward(args)...); - case 33: - return Func::template run<33>(std::forward(args)...); - case 34: - return Func::template run<34>(std::forward(args)...); - case 35: - return Func::template run<35>(std::forward(args)...); - case 36: - return Func::template run<36>(std::forward(args)...); - case 37: - return Func::template run<37>(std::forward(args)...); - case 38: - return Func::template run<38>(std::forward(args)...); - case 39: - return Func::template run<39>(std::forward(args)...); - case 40: - return Func::template run<40>(std::forward(args)...); - case 41: - return Func::template run<41>(std::forward(args)...); - case 42: - return Func::template run<42>(std::forward(args)...); - case 43: - return Func::template run<43>(std::forward(args)...); - case 44: - return Func::template run<44>(std::forward(args)...); - case 45: - return Func::template run<45>(std::forward(args)...); - case 46: - return Func::template run<46>(std::forward(args)...); - case 47: - return Func::template run<47>(std::forward(args)...); - case 48: - return Func::template run<48>(std::forward(args)...); - case 49: - return Func::template run<49>(std::forward(args)...); - case 50: - return Func::template run<50>(std::forward(args)...); - case 51: - return Func::template run<51>(std::forward(args)...); - case 52: - return Func::template run<52>(std::forward(args)...); - case 53: - return Func::template run<53>(std::forward(args)...); - case 54: - return Func::template run<54>(std::forward(args)...); - case 55: - return Func::template run<55>(std::forward(args)...); - case 56: - return Func::template run<56>(std::forward(args)...); - case 57: - return Func::template run<57>(std::forward(args)...); - case 58: - return Func::template run<58>(std::forward(args)...); - case 59: - return Func::template run<59>(std::forward(args)...); - case 60: - return Func::template run<60>(std::forward(args)...); - case 61: - return Func::template run<61>(std::forward(args)...); - case 62: - return Func::template run<62>(std::forward(args)...); - case 63: - return Func::template run<63>(std::forward(args)...); - case 64: - return Func::template run<64>(std::forward(args)...); - case 65: - return Func::template run<65>(std::forward(args)...); - case 66: - return Func::template run<66>(std::forward(args)...); - case 67: - return Func::template run<67>(std::forward(args)...); - case 68: - return Func::template run<68>(std::forward(args)...); - case 69: - return Func::template run<69>(std::forward(args)...); - case 70: - return Func::template run<70>(std::forward(args)...); - case 71: - return Func::template run<71>(std::forward(args)...); - case 72: - return Func::template run<72>(std::forward(args)...); - case 73: - return Func::template run<73>(std::forward(args)...); - case 74: - return Func::template run<74>(std::forward(args)...); - case 75: - return Func::template run<75>(std::forward(args)...); - case 76: - return Func::template run<76>(std::forward(args)...); - case 77: - return Func::template run<77>(std::forward(args)...); - case 78: - return Func::template run<78>(std::forward(args)...); - case 79: - return Func::template run<79>(std::forward(args)...); - case 80: - return Func::template run<80>(std::forward(args)...); - case 81: - return Func::template run<81>(std::forward(args)...); - case 82: - return Func::template run<82>(std::forward(args)...); - case 83: - return Func::template run<83>(std::forward(args)...); - case 84: - return Func::template run<84>(std::forward(args)...); - case 85: - return Func::template run<85>(std::forward(args)...); - case 86: - return Func::template run<86>(std::forward(args)...); - case 87: - return Func::template run<87>(std::forward(args)...); - case 88: - return Func::template run<88>(std::forward(args)...); - case 89: - return Func::template run<89>(std::forward(args)...); - case 90: - return Func::template run<90>(std::forward(args)...); - case 91: + else if constexpr (Count == 65) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65); + } + else if constexpr (Count == 66) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66] = + object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66); + } + else if constexpr (Count == 67) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67] = + object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67); + } + else if constexpr (Count == 68) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68); + } + else if constexpr (Count == 69) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69); + } + else if constexpr (Count == 70) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70); + } + else if constexpr (Count == 71) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71); + } + else if constexpr (Count == 72) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72); + } + else if constexpr (Count == 73) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73); + } + else if constexpr (Count == 74) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74); + } + else if constexpr (Count == 75) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75); + } + else if constexpr (Count == 76) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76); + } + else if constexpr (Count == 77) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77); + } + else if constexpr (Count == 78) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78); + } + else if constexpr (Count == 79) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79] = + object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79); + } + else if constexpr (Count == 80) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80] = + object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80); + } + else if constexpr (Count == 81) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81); + } + else if constexpr (Count == 82) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82); + } + else if constexpr (Count == 83) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83); + } + else if constexpr (Count == 84) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84); + } + else if constexpr (Count == 85) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85); + } + else if constexpr (Count == 86) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86); + } + else if constexpr (Count == 87) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87); + } + else if constexpr (Count == 88) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88); + } + else if constexpr (Count == 89) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89); + } + else if constexpr (Count == 90) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90); + } + else if constexpr (Count == 91) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91); + } + else if constexpr (Count == 92) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92] = + object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92); + } + else if constexpr (Count == 93) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93] = + object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93); + } + else if constexpr (Count == 94) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94); + } + else if constexpr (Count == 95) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95); + } + else if constexpr (Count == 96) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96); + } + else if constexpr (Count == 97) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97); + } + else if constexpr (Count == 98) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98); + } + else if constexpr (Count == 99) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99); + } + else if constexpr (Count == 100) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100); + } + else if constexpr (Count == 101) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101); + } + else if constexpr (Count == 102) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102); + } + else if constexpr (Count == 103) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103); + } + else if constexpr (Count == 104) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104] = + object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104); + } + else if constexpr (Count == 105) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, + a105] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105); + } + else if constexpr (Count == 106) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106); + } + else if constexpr (Count == 107) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107); + } + else if constexpr (Count == 108) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108); + } + else if constexpr (Count == 109) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109); + } + else if constexpr (Count == 110) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110); + } + else if constexpr (Count == 111) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111); + } + else if constexpr (Count == 112) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, + a108, a109, a110, a111, a112); + } + else if constexpr (Count == 113) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, + a108, a109, a110, a111, a112, a113); + } + else if constexpr (Count == 114) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, + a108, a109, a110, a111, a112, a113, a114); + } + else if constexpr (Count == 115) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115] = + object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, + a108, a109, a110, a111, a112, a113, a114, a115); + } + else if constexpr (Count == 116) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, + a116] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, + a108, a109, a110, a111, a112, a113, a114, a115, a116); + } + else if constexpr (Count == 117) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117); + } + else if constexpr (Count == 118) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118); + } + else if constexpr (Count == 119) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119); + } + else if constexpr (Count == 120) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120); + } + else if constexpr (Count == 121) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121); + } + else if constexpr (Count == 122) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122); + } + else if constexpr (Count == 123) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, + a108, a109, a110, a111, a112, a113, a114, a115, a116, a117, + a118, a119, a120, a121, a122, a123); + } + else if constexpr (Count == 124) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, + a108, a109, a110, a111, a112, a113, a114, a115, a116, a117, + a118, a119, a120, a121, a122, a123, a124); + } + else if constexpr (Count == 125) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, + a108, a109, a110, a111, a112, a113, a114, a115, a116, a117, + a118, a119, a120, a121, a122, a123, a124, a125); + } + else if constexpr (Count == 126) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126] = + object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, + a108, a109, a110, a111, a112, a113, a114, a115, a116, a117, + a118, a119, a120, a121, a122, a123, a124, a125, a126); + } + else if constexpr (Count == 127) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, + a127] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127); + } + else { + return visit_members_by_structure_binding_expanded(object, visitor); + } + } + + template + constexpr decltype(auto) STRUCT_PACK_INLINE + visit_members_by_structure_binding_expanded(Object &&object, + Visitor &&visitor) { + using type = remove_cvref_t; + constexpr auto Count = struct_pack::members_count; + if constexpr (Count == 0 && std::is_class_v && + !std::is_same_v) { + static_assert(!sizeof(type), + "1. If the struct is empty, which is not allowed in " + "struct_pack type system.\n" + "2. If the strut is not empty, it means struct_pack can't " + "calculate your struct members' count. You can use macro " + "STRUCT_PACK_REFL(Typename, field1, field2...)."); + } + static_assert(Count <= MaxVisitMembers, "exceed max visit members"); + if constexpr (Count == 128) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128); + } + else if constexpr (Count == 129) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129); + } + else if constexpr (Count == 130) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130); + } + else if constexpr (Count == 131) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131); + } + else if constexpr (Count == 132) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132); + } + else if constexpr (Count == 133) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133); + } + else if constexpr (Count == 134) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, + a108, a109, a110, a111, a112, a113, a114, a115, a116, a117, + a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134); + } + else if constexpr (Count == 135) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, + a108, a109, a110, a111, a112, a113, a114, a115, a116, a117, + a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135); + } + else if constexpr (Count == 136) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, + a108, a109, a110, a111, a112, a113, a114, a115, a116, a117, + a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136); + } + else if constexpr (Count == 137) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137] = + object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137); + } + else if constexpr (Count == 138) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, + a138] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138); + } + else if constexpr (Count == 139) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139); + } + else if constexpr (Count == 140) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140); + } + else if constexpr (Count == 141) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141); + } + else if constexpr (Count == 142) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142); + } + else if constexpr (Count == 143) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143); + } + else if constexpr (Count == 144) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144); + } + else if constexpr (Count == 145) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, + a108, a109, a110, a111, a112, a113, a114, a115, a116, a117, + a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, + a138, a139, a140, a141, a142, a143, a144, a145); + } + else if constexpr (Count == 146) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, + a108, a109, a110, a111, a112, a113, a114, a115, a116, a117, + a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, + a138, a139, a140, a141, a142, a143, a144, a145, a146); + } + else if constexpr (Count == 147) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147); + } + else if constexpr (Count == 148) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148] = + object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148); + } + else if constexpr (Count == 149) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, + a149] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149); + } + else if constexpr (Count == 150) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150); + } + else if constexpr (Count == 151) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151); + } + else if constexpr (Count == 152) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152); + } + else if constexpr (Count == 153) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153); + } + else if constexpr (Count == 154) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154); + } + else if constexpr (Count == 155) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155); + } + else if constexpr (Count == 156) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156] = object; + return visitor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, + a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, + a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, + a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, + a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, + a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, + a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, + a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, + a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, + a108, a109, a110, a111, a112, a113, a114, a115, a116, a117, + a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, + a138, a139, a140, a141, a142, a143, a144, a145, a146, a147, + a148, a149, a150, a151, a152, a153, a154, a155, a156); + } + else if constexpr (Count == 157) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157); + } + else if constexpr (Count == 158) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158); + } + else if constexpr (Count == 159) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159] = + object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159); + } + else if constexpr (Count == 160) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, + a160] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160); + } + else if constexpr (Count == 161) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161); + } + else if constexpr (Count == 162) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162); + } + else if constexpr (Count == 163) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163); + } + else if constexpr (Count == 164) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164); + } + else if constexpr (Count == 165) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165); + } + else if constexpr (Count == 166) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166); + } + else if constexpr (Count == 167) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167); + } + else if constexpr (Count == 168) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168); + } + else if constexpr (Count == 169) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169); + } + else if constexpr (Count == 170) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170] = + object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170); + } + else if constexpr (Count == 171) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, + a171] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171); + } + else if constexpr (Count == 172) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172); + } + else if constexpr (Count == 173) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173); + } + else if constexpr (Count == 174) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174); + } + else if constexpr (Count == 175) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175); + } + else if constexpr (Count == 176) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176); + } + else if constexpr (Count == 177) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177); + } + else if constexpr (Count == 178) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178); + } + else if constexpr (Count == 179) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179); + } + else if constexpr (Count == 180) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180); + } + else if constexpr (Count == 181) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181] = + object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181); + } + else if constexpr (Count == 182) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, + a182] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182); + } + else if constexpr (Count == 183) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183); + } + else if constexpr (Count == 184) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184); + } + else if constexpr (Count == 185) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185); + } + else if constexpr (Count == 186) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186); + } + else if constexpr (Count == 187) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187); + } + else if constexpr (Count == 188) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188); + } + else if constexpr (Count == 189) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189); + } + else if constexpr (Count == 190) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190); + } + else if constexpr (Count == 191) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191); + } + else if constexpr (Count == 192) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192] = + object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192); + } + else if constexpr (Count == 193) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, + a193] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193); + } + else if constexpr (Count == 194) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194); + } + else if constexpr (Count == 195) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195); + } + else if constexpr (Count == 196) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196); + } + else if constexpr (Count == 197) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197); + } + else if constexpr (Count == 198) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198); + } + else if constexpr (Count == 199) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199); + } + else if constexpr (Count == 200) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200); + } + else if constexpr (Count == 201) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201); + } + else if constexpr (Count == 202) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202); + } + else if constexpr (Count == 203) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203] = + object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203); + } + else if constexpr (Count == 204) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, + a204] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204); + } + else if constexpr (Count == 205) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205); + } + else if constexpr (Count == 206) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206); + } + else if constexpr (Count == 207) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207); + } + else if constexpr (Count == 208) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208); + } + else if constexpr (Count == 209) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209); + } + else if constexpr (Count == 210) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210); + } + else if constexpr (Count == 211) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211); + } + else if constexpr (Count == 212) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212); + } + else if constexpr (Count == 213) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213); + } + else if constexpr (Count == 214) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214] = + object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214); + } + else if constexpr (Count == 215) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, + a215] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215); + } + else if constexpr (Count == 216) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216); + } + else if constexpr (Count == 217) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217); + } + else if constexpr (Count == 218) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218); + } + else if constexpr (Count == 219) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219); + } + else if constexpr (Count == 220) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220); + } + else if constexpr (Count == 221) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221); + } + else if constexpr (Count == 222) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222); + } + else if constexpr (Count == 223) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223); + } + else if constexpr (Count == 224) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224); + } + else if constexpr (Count == 225) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225] = + object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225); + } + else if constexpr (Count == 226) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, + a226] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226); + } + else if constexpr (Count == 227) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227); + } + else if constexpr (Count == 228) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228); + } + else if constexpr (Count == 229) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229); + } + else if constexpr (Count == 230) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230); + } + else if constexpr (Count == 231) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231); + } + else if constexpr (Count == 232) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232); + } + else if constexpr (Count == 233) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233); + } + else if constexpr (Count == 234) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234); + } + else if constexpr (Count == 235) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235); + } + else if constexpr (Count == 236) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236] = + object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236); + } + else if constexpr (Count == 237) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, + a237] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237); + } + else if constexpr (Count == 238) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238); + } + else if constexpr (Count == 239) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239); + } + else if constexpr (Count == 240) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240); + } + else if constexpr (Count == 241) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240, a241] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240, a241); + } + else if constexpr (Count == 242) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240, a241, a242] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240, a241, a242); + } + else if constexpr (Count == 243) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240, a241, a242, a243] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240, a241, a242, a243); + } + else if constexpr (Count == 244) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240, a241, a242, a243, a244] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240, a241, a242, a243, + a244); + } + else if constexpr (Count == 245) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240, a241, a242, a243, a244, a245] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240, a241, a242, a243, + a244, a245); + } + else if constexpr (Count == 246) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240, a241, a242, a243, a244, a245, a246] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240, a241, a242, a243, + a244, a245, a246); + } + else if constexpr (Count == 247) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240, a241, a242, a243, a244, a245, a246, a247] = + object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240, a241, a242, a243, + a244, a245, a246, a247); + } + else if constexpr (Count == 248) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240, a241, a242, a243, a244, a245, a246, a247, + a248] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240, a241, a242, a243, + a244, a245, a246, a247, a248); + } + else if constexpr (Count == 249) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240, a241, a242, a243, a244, a245, a246, a247, a248, + a249] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240, a241, a242, a243, + a244, a245, a246, a247, a248, a249); + } + else if constexpr (Count == 250) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240, a241, a242, a243, a244, a245, a246, a247, a248, + a249, a250] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240, a241, a242, a243, + a244, a245, a246, a247, a248, a249, a250); + } + else if constexpr (Count == 251) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240, a241, a242, a243, a244, a245, a246, a247, a248, + a249, a250, a251] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240, a241, a242, a243, + a244, a245, a246, a247, a248, a249, a250, a251); + } + else if constexpr (Count == 252) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240, a241, a242, a243, a244, a245, a246, a247, a248, + a249, a250, a251, a252] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240, a241, a242, a243, + a244, a245, a246, a247, a248, a249, a250, a251, a252); + } + else if constexpr (Count == 253) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240, a241, a242, a243, a244, a245, a246, a247, a248, + a249, a250, a251, a252, a253] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240, a241, a242, a243, + a244, a245, a246, a247, a248, a249, a250, a251, a252, a253); + } + else if constexpr (Count == 254) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240, a241, a242, a243, a244, a245, a246, a247, a248, + a249, a250, a251, a252, a253, a254] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240, a241, a242, a243, + a244, a245, a246, a247, a248, a249, a250, a251, a252, a253, a254); + } + else if constexpr (Count == 255) { + auto &&[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, + a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, + a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, + a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, + a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, + a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, + a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, + a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, + a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127, + a128, a129, a130, a131, a132, a133, a134, a135, a136, a137, a138, + a139, a140, a141, a142, a143, a144, a145, a146, a147, a148, a149, + a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, a160, + a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, + a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, + a183, a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, + a194, a195, a196, a197, a198, a199, a200, a201, a202, a203, a204, + a205, a206, a207, a208, a209, a210, a211, a212, a213, a214, a215, + a216, a217, a218, a219, a220, a221, a222, a223, a224, a225, a226, + a227, a228, a229, a230, a231, a232, a233, a234, a235, a236, a237, + a238, a239, a240, a241, a242, a243, a244, a245, a246, a247, a248, + a249, a250, a251, a252, a253, a254, a255] = object; + return visitor( + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, + a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, + a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, + a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, + a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, + a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, + a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, + a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, + a123, a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, + a134, a135, a136, a137, a138, a139, a140, a141, a142, a143, a144, + a145, a146, a147, a148, a149, a150, a151, a152, a153, a154, a155, + a156, a157, a158, a159, a160, a161, a162, a163, a164, a165, a166, + a167, a168, a169, a170, a171, a172, a173, a174, a175, a176, a177, + a178, a179, a180, a181, a182, a183, a184, a185, a186, a187, a188, + a189, a190, a191, a192, a193, a194, a195, a196, a197, a198, a199, + a200, a201, a202, a203, a204, a205, a206, a207, a208, a209, a210, + a211, a212, a213, a214, a215, a216, a217, a218, a219, a220, a221, + a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, a232, + a233, a234, a235, a236, a237, a238, a239, a240, a241, a242, a243, + a244, a245, a246, a247, a248, a249, a250, a251, a252, a253, a254, + a255); + } + } +template +constexpr decltype(auto) STRUCT_PACK_INLINE template_switch(std::size_t index, + Args &&...args) { + switch (index) { + case 0: + return Func::template run<0>(std::forward(args)...); + case 1: + return Func::template run<1>(std::forward(args)...); + case 2: + return Func::template run<2>(std::forward(args)...); + case 3: + return Func::template run<3>(std::forward(args)...); + case 4: + return Func::template run<4>(std::forward(args)...); + case 5: + return Func::template run<5>(std::forward(args)...); + case 6: + return Func::template run<6>(std::forward(args)...); + case 7: + return Func::template run<7>(std::forward(args)...); + case 8: + return Func::template run<8>(std::forward(args)...); + case 9: + return Func::template run<9>(std::forward(args)...); + case 10: + return Func::template run<10>(std::forward(args)...); + case 11: + return Func::template run<11>(std::forward(args)...); + case 12: + return Func::template run<12>(std::forward(args)...); + case 13: + return Func::template run<13>(std::forward(args)...); + case 14: + return Func::template run<14>(std::forward(args)...); + case 15: + return Func::template run<15>(std::forward(args)...); + case 16: + return Func::template run<16>(std::forward(args)...); + case 17: + return Func::template run<17>(std::forward(args)...); + case 18: + return Func::template run<18>(std::forward(args)...); + case 19: + return Func::template run<19>(std::forward(args)...); + case 20: + return Func::template run<20>(std::forward(args)...); + case 21: + return Func::template run<21>(std::forward(args)...); + case 22: + return Func::template run<22>(std::forward(args)...); + case 23: + return Func::template run<23>(std::forward(args)...); + case 24: + return Func::template run<24>(std::forward(args)...); + case 25: + return Func::template run<25>(std::forward(args)...); + case 26: + return Func::template run<26>(std::forward(args)...); + case 27: + return Func::template run<27>(std::forward(args)...); + case 28: + return Func::template run<28>(std::forward(args)...); + case 29: + return Func::template run<29>(std::forward(args)...); + case 30: + return Func::template run<30>(std::forward(args)...); + case 31: + return Func::template run<31>(std::forward(args)...); + case 32: + return Func::template run<32>(std::forward(args)...); + case 33: + return Func::template run<33>(std::forward(args)...); + case 34: + return Func::template run<34>(std::forward(args)...); + case 35: + return Func::template run<35>(std::forward(args)...); + case 36: + return Func::template run<36>(std::forward(args)...); + case 37: + return Func::template run<37>(std::forward(args)...); + case 38: + return Func::template run<38>(std::forward(args)...); + case 39: + return Func::template run<39>(std::forward(args)...); + case 40: + return Func::template run<40>(std::forward(args)...); + case 41: + return Func::template run<41>(std::forward(args)...); + case 42: + return Func::template run<42>(std::forward(args)...); + case 43: + return Func::template run<43>(std::forward(args)...); + case 44: + return Func::template run<44>(std::forward(args)...); + case 45: + return Func::template run<45>(std::forward(args)...); + case 46: + return Func::template run<46>(std::forward(args)...); + case 47: + return Func::template run<47>(std::forward(args)...); + case 48: + return Func::template run<48>(std::forward(args)...); + case 49: + return Func::template run<49>(std::forward(args)...); + case 50: + return Func::template run<50>(std::forward(args)...); + case 51: + return Func::template run<51>(std::forward(args)...); + case 52: + return Func::template run<52>(std::forward(args)...); + case 53: + return Func::template run<53>(std::forward(args)...); + case 54: + return Func::template run<54>(std::forward(args)...); + case 55: + return Func::template run<55>(std::forward(args)...); + case 56: + return Func::template run<56>(std::forward(args)...); + case 57: + return Func::template run<57>(std::forward(args)...); + case 58: + return Func::template run<58>(std::forward(args)...); + case 59: + return Func::template run<59>(std::forward(args)...); + case 60: + return Func::template run<60>(std::forward(args)...); + case 61: + return Func::template run<61>(std::forward(args)...); + case 62: + return Func::template run<62>(std::forward(args)...); + case 63: + return Func::template run<63>(std::forward(args)...); + case 64: + return Func::template run<64>(std::forward(args)...); + case 65: + return Func::template run<65>(std::forward(args)...); + case 66: + return Func::template run<66>(std::forward(args)...); + case 67: + return Func::template run<67>(std::forward(args)...); + case 68: + return Func::template run<68>(std::forward(args)...); + case 69: + return Func::template run<69>(std::forward(args)...); + case 70: + return Func::template run<70>(std::forward(args)...); + case 71: + return Func::template run<71>(std::forward(args)...); + case 72: + return Func::template run<72>(std::forward(args)...); + case 73: + return Func::template run<73>(std::forward(args)...); + case 74: + return Func::template run<74>(std::forward(args)...); + case 75: + return Func::template run<75>(std::forward(args)...); + case 76: + return Func::template run<76>(std::forward(args)...); + case 77: + return Func::template run<77>(std::forward(args)...); + case 78: + return Func::template run<78>(std::forward(args)...); + case 79: + return Func::template run<79>(std::forward(args)...); + case 80: + return Func::template run<80>(std::forward(args)...); + case 81: + return Func::template run<81>(std::forward(args)...); + case 82: + return Func::template run<82>(std::forward(args)...); + case 83: + return Func::template run<83>(std::forward(args)...); + case 84: + return Func::template run<84>(std::forward(args)...); + case 85: + return Func::template run<85>(std::forward(args)...); + case 86: + return Func::template run<86>(std::forward(args)...); + case 87: + return Func::template run<87>(std::forward(args)...); + case 88: + return Func::template run<88>(std::forward(args)...); + case 89: + return Func::template run<89>(std::forward(args)...); + case 90: + return Func::template run<90>(std::forward(args)...); + case 91: return Func::template run<91>(std::forward(args)...); case 92: return Func::template run<92>(std::forward(args)...); @@ -2271,23 +9535,22 @@ constexpr bool checkable_reader_t = reader_t &&checkable_reader_t_impl::va #endif } // namespace struct_pack -// clang-format off #define STRUCT_PACK_RETURN_ELEMENT(Idx, X) \ if constexpr (Idx == I) {\ return c.X;\ -}\ +} -#define STRUCT_PACK_GET_INDEX(Idx, Type) \ -inline auto& STRUCT_PACK_GET_##Idx(Type& c) {\ - return STRUCT_PACK_GET()-1-Idx>(c);\ -}\ +#define STRUCT_PACK_GET_INDEX(Idx, Type) \ + inline auto &_SPG##Idx(Type &c) { \ + return STRUCT_PACK_GET() - 1 - Idx>(c); \ + } -#define STRUCT_PACK_GET_INDEX_CONST(Idx, Type) \ -inline const auto& STRUCT_PACK_GET_##Idx(const Type& c) {\ - return STRUCT_PACK_GET()-1-Idx>(c);\ -}\ +#define STRUCT_PACK_GET_INDEX_CONST(Idx, Type) \ + inline const auto &_SPG##Idx(const Type &c) { \ + return STRUCT_PACK_GET() - 1 - Idx>(c); \ + } #define STRUCT_PACK_REFL(Type,...) \ inline Type& STRUCT_PACK_REFL_FLAG(Type& t) {return t;} \ diff --git a/src/struct_pack/tests/test_many_members.cpp b/src/struct_pack/tests/test_many_members.cpp new file mode 100644 index 000000000..44a4e7807 --- /dev/null +++ b/src/struct_pack/tests/test_many_members.cpp @@ -0,0 +1,278 @@ +#include + +#include "doctest.h" +#include "ylt/struct_pack.hpp" +#include "ylt/struct_pack/type_calculate.hpp" +struct many_members { + int a1; + std::string b1; + int a2; + std::string b2; + int a3; + std::string b3; + int a4; + std::string b4; + int a5; + std::string b5; + int a6; + std::string b6; + int a7; + std::string b7; + int a8; + std::string b8; + int a9; + std::string b9; + int a10; + std::string b10; + int a11; + std::string b11; + int a12; + std::string b12; + int a13; + std::string b13; + int a14; + std::string b14; + int a15; + std::string b15; + int a16; + std::string b16; + int a17; + std::string b17; + int a18; + std::string b18; + int a19; + std::string b19; + int a20; + std::string b20; + int a21; + std::string b21; + int a22; + std::string b22; + int a23; + std::string b23; + int a24; + std::string b24; + int a25; + std::string b25; + int a26; + std::string b26; + int a27; + std::string b27; + int a28; + std::string b28; + int a29; + std::string b29; + int a30; + std::string b30; + int a31; + std::string b31; + int a32; + std::string b32; + int a33; + std::string b33; + int a34; + std::string b34; + int a35; + std::string b35; + int a36; + std::string b36; + int a37; + std::string b37; + int a38; + std::string b38; + int a39; + std::string b39; + int a40; + std::string b40; + int a41; + std::string b41; + int a42; + std::string b42; + int a43; + std::string b43; + int a44; + std::string b44; + int a45; + std::string b45; + int a46; + std::string b46; + int a47; + std::string b47; + int a48; + std::string b48; + int a49; + std::string b49; + int a50; + std::string b50; + int a51; + std::string b51; + int a52; + std::string b52; + int a53; + std::string b53; + int a54; + std::string b54; + int a55; + std::string b55; + int a56; + std::string b56; + int a57; + std::string b57; + int a58; + std::string b58; + int a59; + std::string b59; + int a60; + std::string b60; + int a61; + std::string b61; + int a62; + std::string b62; + int a63; + std::string b63; + int a64; + std::string b64; + int a65; + std::string b65; + int a66; + std::string b66; + int a67; + std::string b67; + int a68; + std::string b68; + int a69; + std::string b69; + int a70; + std::string b70; + int a71; + std::string b71; + int a72; + std::string b72; + int a73; + std::string b73; + int a74; + std::string b74; + int a75; + std::string b75; + int a76; + std::string b76; + int a77; + std::string b77; + int a78; + std::string b78; + int a79; + std::string b79; + int a80; + std::string b80; + int a81; + std::string b81; + int a82; + std::string b82; + int a83; + std::string b83; + int a84; + std::string b84; + int a85; + std::string b85; + int a86; + std::string b86; + int a87; + std::string b87; + int a88; + std::string b88; + int a89; + std::string b89; + int a90; + std::string b90; + int a91; + std::string b91; + int a92; + std::string b92; + int a93; + std::string b93; + int a94; + std::string b94; + int a95; + std::string b95; + int a96; + std::string b96; + int a97; + std::string b97; + int a98; + std::string b98; + int a99; + std::string b99; + int a100; + std::string b100; + int a101; + std::string b101; + int a102; + std::string b102; + int a103; + std::string b103; + int a104; + std::string b104; + int a105; + std::string b105; + int a106; + std::string b106; + int a107; + std::string b107; + int a108; + std::string b108; + int a109; + std::string b109; + int a110; + std::string b110; + int a111; + std::string b111; + int a112; + std::string b112; + int a113; + std::string b113; + int a114; + std::string b114; + int a115; + std::string b115; + int a116; + std::string b116; + int a117; + std::string b117; + int a118; + std::string b118; + int a119; + std::string b119; + int a120; + std::string b120; + int a121; + std::string b121; + int a122; + std::string b122; + int a123; + std::string b123; + int a124; + std::string b124; + int a125; + std::string b125; + int a126; + std::string b126; + int a127; + std::string b127; + int a128; +}; +struct many_members2 : public many_members {}; +STRUCT_PACK_REFL(many_members2, a1, b1, a2, b2, a3, b3, a4, b4, a5, b5, a6, b6, + a7, b7, a8, b8, a9, b9, a10, b10, a11, b11, a12, b12, a13, b13, + a14, b14, a15, b15, a16, b16, a17, b17, a18, b18, a19, b19, + a20, b20, a21, b21, a22, b22, a23, b23, a24, b24, a25, b25, + a26, b26, a27, b27, a28, b28, a29, b29, a30, b30, a31, b31, + a32, b32, a33, b33, a34, b34, a35, b35, a36, b36, a37, b37, + a38, b38, a39, b39, a40, b40, a41, b41, a42, b42, a43, b43, + a44, b44, a45, b45, a46, b46, a47, b47, a48, b48, a49, b49, + a50, b50, a51, b51, a52, b52, a53, b53, a54, b54, a55, b55, + a56, b56, a57, b57, a58, b58, a59, b59, a60, b60, a61, b61, + a62, b62); +TEST_CASE("test many members") { + CHECK(struct_pack::get_type_literal().size() == 384); + CHECK(struct_pack::get_type_literal().size() == 188); +} \ No newline at end of file diff --git a/test.cpp b/test.cpp new file mode 100644 index 000000000..a41527120 --- /dev/null +++ b/test.cpp @@ -0,0 +1,14 @@ +#include +#include +using namespace std; +string i1 = "else if constexpr (Count == "; +string j = " ){ return visitor("; +string l = ");}"; +int main() { + std::string list = "_SPG0(o)"; + for (int i = 2; i <= 256; ++i) { + list += ",_SPG" + to_string(i - 1) + "(o)"; + cout << i1 + to_string(i) + j + list + l << endl; + } + return 0; +} diff --git a/website/docs/en/coro_rpc/coro_rpc_server.md b/website/docs/en/coro_rpc/coro_rpc_server.md index 2eb8a3742..10abb82da 100644 --- a/website/docs/en/coro_rpc/coro_rpc_server.md +++ b/website/docs/en/coro_rpc/coro_rpc_server.md @@ -274,7 +274,7 @@ This means if your RPC functions will block the current thread (e.g., thread sle ## Parameter and Return Value Types -coro_rpc allows users to register rpc functions with multiple parameters (up to 64), and the types of arguments and return values can be user-defined aggregate structures. They also support various data structures provided by the C++ standard library and many third-party libraries. For details, see: [struct_pack type system](https://alibaba.github.io/yalantinglibs/en/struct_pack/struct_pack_type_system.html) +coro_rpc allows users to register rpc functions with multiple parameters (up to 255), and the types of arguments and return values can be user-defined aggregate structures. They also support various data structures provided by the C++ standard library and many third-party libraries. For details, see: [struct_pack type system](https://alibaba.github.io/yalantinglibs/en/struct_pack/struct_pack_type_system.html) If your rpc argument or return value type is not supported by the struct_pack type system, we also allow users to register their own structures or custom serialization algorithms. For more details, see: [Custom feature](https://alibaba.github.io/yalantinglibs/en/struct_pack/struct_pack_intro.html#custom-type) diff --git a/website/docs/en/struct_pack/struct_pack_type_system.md b/website/docs/en/struct_pack/struct_pack_type_system.md index 3bcd91d92..f46091ace 100644 --- a/website/docs/en/struct_pack/struct_pack_type_system.md +++ b/website/docs/en/struct_pack/struct_pack_type_system.md @@ -216,7 +216,7 @@ The class needs to provide: `size()`,`flip()`,`set()`,`reset()`,`count()`,and th ## Struct -`struct_pack` supports `struct` type. Up to **64** fields are supported and nested fields are supported too. All members +`struct_pack` supports `struct` type. Up to **255** fields are supported and nested fields are supported too. All members should be of valid `struct_pack` type. struct type could be `struct/class/std::tuple/tuplet::tuple/std::pair` diff --git a/website/docs/zh/coro_rpc/coro_rpc_server.md b/website/docs/zh/coro_rpc/coro_rpc_server.md index 0d3b8be46..2ee1144a6 100644 --- a/website/docs/zh/coro_rpc/coro_rpc_server.md +++ b/website/docs/zh/coro_rpc/coro_rpc_server.md @@ -272,7 +272,7 @@ rpc错误码是一个16位的无符号整数。其中,0-255是保留给rpc框 ## 参数与返回值类型 -coro_rpc允许用户注册的rpc函数具有多个参数(最多64个),参数和返回值的类型可以是用户自定义的聚合结构体,也支持了各种c++标准库提供的数据结构和许多第三方库提供的数据结构。详见:[struct_pack的类型系统](https://alibaba.github.io/yalantinglibs/zh/struct_pack/struct_pack_type_system.html) +coro_rpc允许用户注册的rpc函数具有多个参数(最多255个),参数和返回值的类型可以是用户自定义的聚合结构体,也支持了各种c++标准库提供的数据结构和许多第三方库提供的数据结构。详见:[struct_pack的类型系统](https://alibaba.github.io/yalantinglibs/zh/struct_pack/struct_pack_type_system.html) 如果你的rpc参数或返回值类型不属于struct_pack的类型系统支持的类型,我们也允许用户注册自己的结构体或者自定义序列化算法,详见:[自定义功能支持](https://alibaba.github.io/yalantinglibs/zh/struct_pack/struct_pack_intro.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%BA%8F%E5%88%97%E5%8C%96) diff --git a/website/docs/zh/struct_pack/struct_pack_type_system.md b/website/docs/zh/struct_pack/struct_pack_type_system.md index 6d3188c44..d37a1f788 100644 --- a/website/docs/zh/struct_pack/struct_pack_type_system.md +++ b/website/docs/zh/struct_pack/struct_pack_type_system.md @@ -219,7 +219,7 @@ concept unique_ptr = requires(Type ptr) { ## 结构体 -struct_pack支持结构体类型。结构体内可以包含最多64个字段,并允许结构体嵌套。结构体中的任何成员都必须是struct_pack的合法类型。 +struct_pack支持结构体类型。结构体内可以包含最多255个字段,并允许结构体嵌套。结构体中的任何成员都必须是struct_pack的合法类型。 struct_pack的结构体类型可以为:struct/class/std::pair/tuplet::tuple/std::tuple From c0006099abb320599b8727adefec43358f7a875b Mon Sep 17 00:00:00 2001 From: qicosmos Date: Fri, 7 Jun 2024 23:15:51 +0800 Subject: [PATCH 03/12] [new feature]Add metrics (#674) --- .github/workflows/windows.yml | 66 +-- include/ylt/coro_http/coro_http_server.hpp | 1 - include/ylt/coro_io/io_context_pool.hpp | 17 +- include/ylt/metric/counter.hpp | 258 +++++++++ include/ylt/metric/detail/ckms_quantiles.hpp | 175 ++++++ .../metric/detail/time_window_quantiles.hpp | 52 ++ include/ylt/metric/gauge.hpp | 52 ++ include/ylt/metric/histogram.hpp | 83 +++ include/ylt/metric/metric.hpp | 316 +++++++++++ include/ylt/metric/summary.hpp | 139 +++++ .../cinatra/coro_http_connection.hpp | 75 ++- .../standalone/cinatra/coro_http_server.hpp | 37 +- .../ylt/standalone/cinatra/metric_conf.hpp | 128 +++++ src/metric/tests/CMakeLists.txt | 5 + src/metric/tests/test_metric.cpp | 280 ++++++++++ website/.vitepress/config/zh_data.ts | 4 + website/.vitepress/config/zh_locale.ts | 1 + .../docs/zh/guide/what_is_yalantinglibs.md | 8 +- website/docs/zh/index.md | 4 +- .../docs/zh/metric/metrict_introduction.md | 511 ++++++++++++++++++ 20 files changed, 2169 insertions(+), 43 deletions(-) create mode 100644 include/ylt/metric/counter.hpp create mode 100644 include/ylt/metric/detail/ckms_quantiles.hpp create mode 100644 include/ylt/metric/detail/time_window_quantiles.hpp create mode 100644 include/ylt/metric/gauge.hpp create mode 100644 include/ylt/metric/histogram.hpp create mode 100644 include/ylt/metric/metric.hpp create mode 100644 include/ylt/metric/summary.hpp create mode 100644 include/ylt/standalone/cinatra/metric_conf.hpp create mode 100644 src/metric/tests/CMakeLists.txt create mode 100644 src/metric/tests/test_metric.cpp create mode 100644 website/docs/zh/metric/metrict_introduction.md diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index fe1c645a9..d79e6f74b 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -9,41 +9,41 @@ on: workflow_dispatch: jobs: - windows_msvc: - runs-on: windows-latest + # windows_msvc: + # runs-on: windows-latest - strategy: - matrix: - mode: [ Release ] #[ Release, Debug ] #Debug not support ccache - #https://github.com/ccache/ccache/wiki/MS-Visual-Studio - #https://github.com/ccache/ccache/issues/1040 - arch: [ amd64, x86 ] #[ amd64,x86 ] - ssl: [ OFF ] #[ ON, OFF ] + # strategy: + # matrix: + # mode: [ Release ] #[ Release, Debug ] #Debug not support ccache + # #https://github.com/ccache/ccache/wiki/MS-Visual-Studio + # #https://github.com/ccache/ccache/issues/1040 + # arch: [ amd64, x86 ] #[ amd64,x86 ] + # ssl: [ OFF ] #[ ON, OFF ] - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Enable Developer Command Prompt - uses: ilammy/msvc-dev-cmd@v1.12.0 - with: - arch: ${{ matrix.arch }} - - name: Install ninja-build tool - uses: seanmiddleditch/gha-setup-ninja@master - with: - version: 1.11.1 - - name: latest ccache - run: choco install ccache - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.job }}-${{ matrix.mode}}-ssl( ${{ matrix.ssl}} )-arch-${{ matrix.arch}} - - name: Configure CMake - run: cmake -B ${{github.workspace}}\build -G Ninja -DCMAKE_BUILD_TYPE=${{ matrix.mode }} -DYLT_ENABLE_SSL=${{matrix.ssl}} -DUSE_CCACHE=ON - - name: Build - run: cmake --build ${{github.workspace}}\build - - name: Test - working-directory: ${{github.workspace}}\build - run: ctest -C ${{matrix.mode}} -j 1 -V + # steps: + # - name: Checkout + # uses: actions/checkout@v3 + # - name: Enable Developer Command Prompt + # uses: ilammy/msvc-dev-cmd@v1.12.0 + # with: + # arch: ${{ matrix.arch }} + # - name: Install ninja-build tool + # uses: seanmiddleditch/gha-setup-ninja@master + # with: + # version: 1.11.1 + # - name: latest ccache + # run: choco install ccache + # - name: ccache + # uses: hendrikmuhs/ccache-action@v1.2 + # with: + # key: ${{ github.job }}-${{ matrix.mode}}-ssl( ${{ matrix.ssl}} )-arch-${{ matrix.arch}} + # - name: Configure CMake + # run: cmake -B ${{github.workspace}}\build -G Ninja -DCMAKE_BUILD_TYPE=${{ matrix.mode }} -DYLT_ENABLE_SSL=${{matrix.ssl}} -DUSE_CCACHE=ON + # - name: Build + # run: cmake --build ${{github.workspace}}\build + # - name: Test + # working-directory: ${{github.workspace}}\build + # run: ctest -C ${{matrix.mode}} -j 1 -V windows_msvc_2019: runs-on: windows-2019 diff --git a/include/ylt/coro_http/coro_http_server.hpp b/include/ylt/coro_http/coro_http_server.hpp index 46269f8dd..a4bb1ecf4 100644 --- a/include/ylt/coro_http/coro_http_server.hpp +++ b/include/ylt/coro_http/coro_http_server.hpp @@ -14,7 +14,6 @@ * limitations under the License. */ #pragma once -#include "cinatra/uri.hpp" #ifdef YLT_ENABLE_SSL #define CINATRA_ENABLE_SSL #endif diff --git a/include/ylt/coro_io/io_context_pool.hpp b/include/ylt/coro_io/io_context_pool.hpp index b45c63ff9..847fa9cfd 100644 --- a/include/ylt/coro_io/io_context_pool.hpp +++ b/include/ylt/coro_io/io_context_pool.hpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -117,6 +118,8 @@ class io_context_pool { pool_size = 1; // set default value as 1 } + total_thread_num_ += pool_size; + for (std::size_t i = 0; i < pool_size; ++i) { io_context_ptr io_context(new asio::io_context(1)); work_ptr work(new asio::io_context::work(*io_context)); @@ -150,8 +153,11 @@ class io_context_pool { cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(i, &cpuset); - pthread_setaffinity_np(threads.back()->native_handle(), - sizeof(cpu_set_t), &cpuset); + int rc = pthread_setaffinity_np(threads.back()->native_handle(), + sizeof(cpu_set_t), &cpuset); + if (rc != 0) { + std::cerr << "Error calling pthread_setaffinity_np: " << rc << "\n"; + } } #endif } @@ -201,6 +207,8 @@ class io_context_pool { template friend io_context_pool &g_io_context_pool(); + static size_t get_total_thread_num() { return total_thread_num_; } + private: using io_context_ptr = std::shared_ptr; using work_ptr = std::shared_ptr; @@ -213,8 +221,13 @@ class io_context_pool { std::atomic has_run_or_stop_ = false; std::once_flag flag_; bool cpu_affinity_ = false; + inline static std::atomic total_thread_num_ = 0; }; +inline size_t get_total_thread_num() { + return io_context_pool::get_total_thread_num(); +} + class multithread_context_pool { public: multithread_context_pool(size_t thd_num = std::thread::hardware_concurrency()) diff --git a/include/ylt/metric/counter.hpp b/include/ylt/metric/counter.hpp new file mode 100644 index 000000000..a252106d1 --- /dev/null +++ b/include/ylt/metric/counter.hpp @@ -0,0 +1,258 @@ +#pragma once +#include +#include + +#include "metric.hpp" + +namespace ylt { +enum class op_type_t { INC, DEC, SET }; +struct counter_sample { + op_type_t op_type; + std::vector labels_value; + double value; +}; + +class counter_t : public metric_t { + public: + // default, no labels, only contains an atomic value. + counter_t(std::string name, std::string help) + : metric_t(MetricType::Counter, std::move(name), std::move(help)) { + use_atomic_ = true; + } + + // static labels value, contains a map with atomic value. + counter_t(std::string name, std::string help, + std::map labels) + : metric_t(MetricType::Counter, std::move(name), std::move(help)) { + for (auto &[k, v] : labels) { + labels_name_.push_back(k); + labels_value_.push_back(v); + } + + atomic_value_map_.emplace(labels_value_, 0); + use_atomic_ = true; + } + + // dynamic labels value + counter_t(std::string name, std::string help, + std::vector labels_name) + : metric_t(MetricType::Counter, std::move(name), std::move(help), + std::move(labels_name)) {} + + virtual ~counter_t() {} + + double value() { return default_lable_value_; } + + double value(const std::vector &labels_value) { + if (use_atomic_) { + double val = atomic_value_map_[labels_value]; + return val; + } + else { + std::lock_guard lock(mtx_); + return value_map_[labels_value]; + } + } + + std::map, double, + std::less>> + value_map() { + std::map, double, + std::less>> + map; + if (use_atomic_) { + map = {atomic_value_map_.begin(), atomic_value_map_.end()}; + } + else { + std::lock_guard lock(mtx_); + map = value_map_; + } + return map; + } + + void serialize(std::string &str) override { + if (labels_name_.empty()) { + if (default_lable_value_ == 0) { + return; + } + serialize_head(str); + serialize_default_label(str); + return; + } + + serialize_head(str); + std::string s; + if (use_atomic_) { + serialize_map(atomic_value_map_, s); + } + else { + serialize_map(value_map_, s); + } + + if (s.empty()) { + str.clear(); + } + else { + str.append(s); + } + } + + void inc(double val = 1) { + if (val < 0) { + throw std::invalid_argument("the value is less than zero"); + } + +#ifdef __APPLE__ + mac_os_atomic_fetch_add(&default_lable_value_, val); +#else + default_lable_value_ += val; +#endif + } + + void inc(const std::vector &labels_value, double value = 1) { + if (value == 0) { + return; + } + + validate(labels_value, value); + if (use_atomic_) { + if (labels_value != labels_value_) { + throw std::invalid_argument( + "the given labels_value is not match with origin labels_value"); + } + set_value(atomic_value_map_[labels_value], value, op_type_t::INC); + } + else { + std::lock_guard lock(mtx_); + set_value(value_map_[labels_value], value, op_type_t::INC); + } + } + + void update(double value) { default_lable_value_ = value; } + + void update(const std::vector &labels_value, double value) { + if (labels_value.empty() || labels_name_.size() != labels_value.size()) { + throw std::invalid_argument( + "the number of labels_value name and labels_value is not match"); + } + if (use_atomic_) { + if (labels_value != labels_value_) { + throw std::invalid_argument( + "the given labels_value is not match with origin labels_value"); + } + set_value(atomic_value_map_[labels_value], value, op_type_t::SET); + } + else { + std::lock_guard lock(mtx_); + set_value(value_map_[labels_value], value, op_type_t::SET); + } + } + + std::map, std::atomic, + std::less>> + &atomic_value_map() { + return atomic_value_map_; + } + + protected: + void serialize_default_label(std::string &str) { + str.append(name_); + if (labels_name_.empty()) { + str.append(" "); + } + + if (type_ == MetricType::Counter) { + str.append(std::to_string((int64_t)default_lable_value_)); + } + else { + str.append(std::to_string(default_lable_value_)); + } + + str.append("\n"); + } + + template + void serialize_map(T &value_map, std::string &str) { + for (auto &[labels_value, value] : value_map) { + if (value == 0) { + continue; + } + str.append(name_); + str.append("{"); + build_string(str, labels_name_, labels_value); + str.append("} "); + + if (type_ == MetricType::Counter) { + str.append(std::to_string((int64_t)value)); + } + else { + str.append(std::to_string(value)); + } + + str.append("\n"); + } + } + + void build_string(std::string &str, const std::vector &v1, + const std::vector &v2) { + for (size_t i = 0; i < v1.size(); i++) { + str.append(v1[i]).append("=\"").append(v2[i]).append("\"").append(","); + } + str.pop_back(); + } + + void validate(const std::vector &labels_value, double value) { + if (value < 0) { + throw std::invalid_argument("the value is less than zero"); + } + if (labels_value.empty() || labels_name_.size() != labels_value.size()) { + throw std::invalid_argument( + "the number of labels_value name and labels_value is not match"); + } + } + + template + void set_value(T &label_val, double value, op_type_t type) { + switch (type) { + case op_type_t::INC: { +#ifdef __APPLE__ + if constexpr (is_atomic) { + mac_os_atomic_fetch_add(&label_val, value); + } + else { + label_val += value; + } +#else + label_val += value; +#endif + } break; + case op_type_t::DEC: +#ifdef __APPLE__ + if constexpr (is_atomic) { + mac_os_atomic_fetch_sub(&label_val, value); + } + else { + label_val -= value; + } + +#else + label_val -= value; +#endif + break; + case op_type_t::SET: + label_val = value; + break; + } + } + + std::map, std::atomic, + std::less>> + atomic_value_map_; + std::atomic default_lable_value_ = 0; + + std::mutex mtx_; + std::map, double, + std::less>> + value_map_; +}; +} // namespace ylt \ No newline at end of file diff --git a/include/ylt/metric/detail/ckms_quantiles.hpp b/include/ylt/metric/detail/ckms_quantiles.hpp new file mode 100644 index 000000000..cdaf1db92 --- /dev/null +++ b/include/ylt/metric/detail/ckms_quantiles.hpp @@ -0,0 +1,175 @@ +#pragma once +#include +#include +#include + +// https://github.com/jupp0r/prometheus-cpp/blob/master/core/include/prometheus/detail/ckms_quantiles.h + +namespace ylt { +class CKMSQuantiles { + public: + struct Quantile { + Quantile(double quantile, double error) + : quantile(quantile), + error(error), + u(2.0 * error / (1.0 - quantile)), + v(2.0 * error / quantile) {} + + double quantile; + double error; + double u; + double v; + }; + + private: + struct Item { + double value; + int g; + int delta; + + Item(double value, int lower_delta, int delta) + : value(value), g(lower_delta), delta(delta) {} + }; + + public: + explicit CKMSQuantiles(const std::vector& quantiles) + : quantiles_(quantiles), count_(0), buffer_{}, buffer_count_(0) {} + + void insert(double value) { + buffer_[buffer_count_] = value; + ++buffer_count_; + + if (buffer_count_ == buffer_.size()) { + insertBatch(); + compress(); + } + } + + double get(double q) { + insertBatch(); + compress(); + + if (sample_.empty()) { + return std::numeric_limits::quiet_NaN(); + } + + int rankMin = 0; + const auto desired = static_cast(q * count_); + const auto bound = desired + (allowableError(desired) / 2); + + auto it = sample_.begin(); + decltype(it) prev; + auto cur = it++; + + while (it != sample_.end()) { + prev = cur; + cur = it++; + + rankMin += prev->g; + + if (rankMin + cur->g + cur->delta > bound) { + return prev->value; + } + } + + return sample_.back().value; + } + void reset() { + count_ = 0; + sample_.clear(); + buffer_count_ = 0; + } + + private: + double allowableError(int rank) { + auto size = sample_.size(); + double minError = size + 1; + + for (const auto& q : quantiles_.get()) { + double error; + if (rank <= q.quantile * size) { + error = q.u * (size - rank); + } + else { + error = q.v * rank; + } + if (error < minError) { + minError = error; + } + } + return minError; + } + + bool insertBatch() { + if (buffer_count_ == 0) { + return false; + } + + std::sort(buffer_.begin(), buffer_.begin() + buffer_count_); + + std::size_t start = 0; + if (sample_.empty()) { + sample_.emplace_back(buffer_[0], 1, 0); + ++start; + ++count_; + } + + std::size_t idx = 0; + std::size_t item = idx++; + + for (std::size_t i = start; i < buffer_count_; ++i) { + double v = buffer_[i]; + while (idx < sample_.size() && sample_[item].value < v) { + item = idx++; + } + + if (sample_[item].value > v) { + --idx; + } + + int delta; + if (idx - 1 == 0 || idx + 1 == sample_.size()) { + delta = 0; + } + else { + delta = static_cast(std::floor(allowableError(idx + 1))) + 1; + } + + sample_.emplace(sample_.begin() + idx, v, 1, delta); + count_++; + item = idx++; + } + + buffer_count_ = 0; + return true; + } + void compress() { + if (sample_.size() < 2) { + return; + } + + std::size_t idx = 0; + std::size_t prev; + std::size_t next = idx++; + + while (idx < sample_.size()) { + prev = next; + next = idx++; + + if (sample_[prev].g + sample_[next].g + sample_[next].delta <= + allowableError(idx - 1)) { + sample_[next].g += sample_[prev].g; + sample_.erase(sample_.begin() + prev); + } + } + } + + private: + const std::reference_wrapper> quantiles_; + + std::size_t count_; + std::vector sample_; + std::array buffer_; + std::size_t buffer_count_; +}; +} // namespace ylt \ No newline at end of file diff --git a/include/ylt/metric/detail/time_window_quantiles.hpp b/include/ylt/metric/detail/time_window_quantiles.hpp new file mode 100644 index 000000000..fd7df105f --- /dev/null +++ b/include/ylt/metric/detail/time_window_quantiles.hpp @@ -0,0 +1,52 @@ +#pragma once +#include "ckms_quantiles.hpp" +// https://github.com/jupp0r/prometheus-cpp/blob/master/core/include/prometheus/detail/time_window_quantiles.h + +namespace ylt { +class TimeWindowQuantiles { + using Clock = std::chrono::steady_clock; + + public: + TimeWindowQuantiles(const std::vector& quantiles, + Clock::duration max_age_seconds, int age_buckets) + : quantiles_(quantiles), + ckms_quantiles_(age_buckets, CKMSQuantiles(quantiles_)), + current_bucket_(0), + last_rotation_(Clock::now()), + rotation_interval_(max_age_seconds / age_buckets) {} + + double get(double q) const { + CKMSQuantiles& current_bucket = rotate(); + return current_bucket.get(q); + } + void insert(double value) { + rotate(); + for (auto& bucket : ckms_quantiles_) { + bucket.insert(value); + } + } + + private: + CKMSQuantiles& rotate() const { + auto delta = Clock::now() - last_rotation_; + while (delta > rotation_interval_) { + ckms_quantiles_[current_bucket_].reset(); + + if (++current_bucket_ >= ckms_quantiles_.size()) { + current_bucket_ = 0; + } + + delta -= rotation_interval_; + last_rotation_ += rotation_interval_; + } + return ckms_quantiles_[current_bucket_]; + } + + const std::vector& quantiles_; + mutable std::vector ckms_quantiles_; + mutable std::size_t current_bucket_; + + mutable Clock::time_point last_rotation_; + const Clock::duration rotation_interval_; +}; +} // namespace ylt \ No newline at end of file diff --git a/include/ylt/metric/gauge.hpp b/include/ylt/metric/gauge.hpp new file mode 100644 index 000000000..19c4b65c2 --- /dev/null +++ b/include/ylt/metric/gauge.hpp @@ -0,0 +1,52 @@ +#pragma once +#include + +#include "counter.hpp" + +namespace ylt { +class gauge_t : public counter_t { + public: + gauge_t(std::string name, std::string help) + : counter_t(std::move(name), std::move(help)) { + set_metric_type(MetricType::Gauge); + } + gauge_t(std::string name, std::string help, + std::vector labels_name) + : counter_t(std::move(name), std::move(help), std::move(labels_name)) { + set_metric_type(MetricType::Gauge); + } + + gauge_t(std::string name, std::string help, + std::map labels) + : counter_t(std::move(name), std::move(help), std::move(labels)) { + set_metric_type(MetricType::Gauge); + } + + void dec(double value = 1) { +#ifdef __APPLE__ + mac_os_atomic_fetch_sub(&default_lable_value_, value); +#else + default_lable_value_ -= value; +#endif + } + + void dec(const std::vector& labels_value, double value = 1) { + if (value == 0) { + return; + } + + validate(labels_value, value); + if (use_atomic_) { + if (labels_value != labels_value_) { + throw std::invalid_argument( + "the given labels_value is not match with origin labels_value"); + } + set_value(atomic_value_map_[labels_value], value, op_type_t::DEC); + } + else { + std::lock_guard lock(mtx_); + set_value(value_map_[labels_value], value, op_type_t::DEC); + } + } +}; +} // namespace ylt \ No newline at end of file diff --git a/include/ylt/metric/histogram.hpp b/include/ylt/metric/histogram.hpp new file mode 100644 index 000000000..dfd2ca131 --- /dev/null +++ b/include/ylt/metric/histogram.hpp @@ -0,0 +1,83 @@ + +#pragma once +#include +#include +#include +#include + +#include "counter.hpp" +#include "metric.hpp" + +namespace ylt { +class histogram_t : public metric_t { + public: + histogram_t(std::string name, std::string help, std::vector buckets) + : bucket_boundaries_(buckets), + metric_t(MetricType::Histogram, std::move(name), std::move(help)), + sum_(std::make_shared("", "")) { + if (!is_strict_sorted(begin(bucket_boundaries_), end(bucket_boundaries_))) { + throw std::invalid_argument("Bucket Boundaries must be strictly sorted"); + } + + for (size_t i = 0; i < buckets.size() + 1; i++) { + bucket_counts_.push_back(std::make_shared("", "")); + } + use_atomic_ = true; + } + + void observe(double value) { + const auto bucket_index = static_cast( + std::distance(bucket_boundaries_.begin(), + std::lower_bound(bucket_boundaries_.begin(), + bucket_boundaries_.end(), value))); + sum_->inc(value); + bucket_counts_[bucket_index]->inc(); + } + + auto get_bucket_counts() { return bucket_counts_; } + + void serialize(std::string& str) override { + serialize_head(str); + double count = 0; + auto bucket_counts = get_bucket_counts(); + for (size_t i = 0; i < bucket_counts.size(); i++) { + auto counter = bucket_counts[i]; + str.append(name_).append("_bucket{"); + if (i == bucket_boundaries_.size()) { + str.append("le=\"").append("+Inf").append("\"} "); + } + else { + str.append("le=\"") + .append(std::to_string(bucket_boundaries_[i])) + .append("\"} "); + } + + count += counter->value(); + str.append(std::to_string(count)); + str.append("\n"); + } + + str.append(name_) + .append("_sum ") + .append(std::to_string(sum_->value())) + .append("\n"); + + str.append(name_) + .append("_count ") + .append(std::to_string(count)) + .append("\n"); + } + + private: + template + bool is_strict_sorted(ForwardIterator first, ForwardIterator last) { + return std::adjacent_find(first, last, + std::greater_equal::value_type>()) == last; + } + + std::vector bucket_boundaries_; + std::vector> bucket_counts_; // readonly + std::shared_ptr sum_; +}; +} // namespace ylt \ No newline at end of file diff --git a/include/ylt/metric/metric.hpp b/include/ylt/metric/metric.hpp new file mode 100644 index 000000000..58d0afc5b --- /dev/null +++ b/include/ylt/metric/metric.hpp @@ -0,0 +1,316 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include + +#include "async_simple/coro/Lazy.h" +#include "cinatra/cinatra_log_wrapper.hpp" + +namespace ylt { +enum class MetricType { + Counter, + Gauge, + Histogram, + Summary, + Nil, +}; + +class metric_t { + public: + metric_t() = default; + metric_t(MetricType type, std::string name, std::string help, + std::vector labels_name = {}) + : type_(type), + name_(std::move(name)), + help_(std::move(help)), + labels_name_(std::move(labels_name)) {} + virtual ~metric_t() {} + + std::string_view name() { return name_; } + + std::string_view help() { return help_; } + + MetricType metric_type() { return type_; } + + std::string_view metric_name() { + switch (type_) { + case MetricType::Counter: + return "counter"; + case MetricType::Gauge: + return "gauge"; + case MetricType::Histogram: + return "histogram"; + case MetricType::Summary: + return "summary"; + case MetricType::Nil: + default: + return "unknown"; + } + } + + const std::vector& labels_name() { return labels_name_; } + + virtual void serialize(std::string& str) {} + + // only for summary + virtual async_simple::coro::Lazy serialize_async(std::string& out) { + co_return; + } + + bool is_atomic() const { return use_atomic_; } + + template + T* as() { + return dynamic_cast(this); + } + + protected: + void set_metric_type(MetricType type) { type_ = type; } + void serialize_head(std::string& str) { + str.append("# HELP ").append(name_).append(" ").append(help_).append("\n"); + str.append("# TYPE ") + .append(name_) + .append(" ") + .append(metric_name()) + .append("\n"); + } + +#ifdef __APPLE__ + double mac_os_atomic_fetch_add(std::atomic* obj, double arg) { + double v; + do { + v = obj->load(); + } while (!std::atomic_compare_exchange_weak(obj, &v, v + arg)); + return v; + } + + double mac_os_atomic_fetch_sub(std::atomic* obj, double arg) { + double v; + do { + v = obj->load(); + } while (!std::atomic_compare_exchange_weak(obj, &v, v - arg)); + return v; + } +#endif + + MetricType type_ = MetricType::Nil; + std::string name_; + std::string help_; + std::vector labels_name_; // read only + std::vector labels_value_; // read only + bool use_atomic_ = false; +}; + +template +struct metric_manager_t { + struct null_mutex_t { + void lock() {} + void unlock() {} + }; + + // create and register metric + template + static std::shared_ptr create_metric_static(const std::string& name, + const std::string& help, + Args&&... args) { + auto m = std::make_shared(name, help, std::forward(args)...); + bool r = register_metric_static(m); + if (!r) { + return nullptr; + } + return m; + } + + template + static std::shared_ptr create_metric_dynamic(const std::string& name, + const std::string& help, + Args&&... args) { + auto m = std::make_shared(name, help, std::forward(args)...); + bool r = register_metric_static(m); + if (!r) { + return nullptr; + } + return m; + } + + static bool register_metric_dynamic(std::shared_ptr metric) { + return register_metric_impl(metric); + } + + static bool register_metric_static(std::shared_ptr metric) { + return register_metric_impl(metric); + } + + template + static bool register_metric_dynamic(Metrics... metrics) { + bool r = true; + ((void)(r && (r = register_metric_impl(metrics), true)), ...); + return r; + } + + template + static bool register_metric_static(Metrics... metrics) { + bool r = true; + ((void)(r && (r = register_metric_impl(metrics), true)), ...); + return r; + } + + static auto metric_map_static() { return metric_map_impl(); } + static auto metric_map_dynamic() { return metric_map_impl(); } + + static size_t metric_count_static() { return metric_count_impl(); } + + static size_t metric_count_dynamic() { return metric_count_impl(); } + + static std::vector metric_keys_static() { + return metric_keys_impl(); + } + + static std::vector metric_keys_dynamic() { + return metric_keys_impl(); + } + + template + static T* get_metric_static(const std::string& name) { + auto m = get_metric_impl(name); + if (m == nullptr) { + return nullptr; + } + return m->template as(); + } + + template + static T* get_metric_dynamic(const std::string& name) { + auto m = get_metric_impl(name); + if (m == nullptr) { + return nullptr; + } + return m->template as(); + } + + static async_simple::coro::Lazy serialize_static() { + return serialize_impl(); + } + + static async_simple::coro::Lazy serialize_dynamic() { + return serialize_impl(); + } + + private: + template + static void check_lock() { + if (need_lock_ != need_lock) { + std::string str = "need lock "; + std::string s = need_lock_ ? "true" : "false"; + std::string r = need_lock ? "true" : "false"; + str.append(s).append(" but set as ").append(r); + throw std::invalid_argument(str); + } + } + + template + static auto get_lock() { + check_lock(); + if constexpr (need_lock) { + return std::scoped_lock(mtx_); + } + else { + return std::scoped_lock(null_mtx_); + } + } + + template + static bool register_metric_impl(std::shared_ptr metric) { + // the first time regiter_metric will set metric_manager_t lock or not lock. + // visit metric_manager_t with different lock strategy will cause throw + // exception. + std::call_once(flag_, [] { + need_lock_ = need_lock; + }); + + std::string name(metric->name()); + auto lock = get_lock(); + bool r = metric_map_.emplace(name, std::move(metric)).second; + if (!r) { + CINATRA_LOG_ERROR << "duplicate registered metric name: " << name; + } + return r; + } + + template + static auto metric_map_impl() { + auto lock = get_lock(); + return metric_map_; + } + + template + static size_t metric_count_impl() { + auto lock = get_lock(); + return metric_map_.size(); + } + + template + static std::vector metric_keys_impl() { + std::vector keys; + { + auto lock = get_lock(); + for (auto& pair : metric_map_) { + keys.push_back(pair.first); + } + } + + return keys; + } + + template + static std::shared_ptr get_metric_impl(const std::string& name) { + auto lock = get_lock(); + auto it = metric_map_.find(name); + if (it == metric_map_.end()) { + return nullptr; + } + return it->second; + } + + template + static auto collect() { + std::vector> metrics; + { + auto lock = get_lock(); + for (auto& pair : metric_map_) { + metrics.push_back(pair.second); + } + } + return metrics; + } + + template + static async_simple::coro::Lazy serialize_impl() { + std::string str; + auto metrics = collect(); + for (auto& m : metrics) { + if (m->metric_type() == MetricType::Summary) { + co_await m->serialize_async(str); + } + else { + m->serialize(str); + } + } + co_return str; + } + + static inline std::mutex mtx_; + static inline std::map> metric_map_; + + static inline null_mutex_t null_mtx_; + static inline std::atomic_bool need_lock_ = true; + static inline std::once_flag flag_; +}; + +using default_metric_manager = metric_manager_t<0>; +} // namespace ylt \ No newline at end of file diff --git a/include/ylt/metric/summary.hpp b/include/ylt/metric/summary.hpp new file mode 100644 index 000000000..415d6b322 --- /dev/null +++ b/include/ylt/metric/summary.hpp @@ -0,0 +1,139 @@ +#pragma once +#include + +#include "detail/time_window_quantiles.hpp" +#include "metric.hpp" +#include "ylt/coro_io/coro_io.hpp" +#include "ylt/util/concurrentqueue.h" + +namespace ylt { +class summary_t : public metric_t { + public: + using Quantiles = std::vector; + summary_t(std::string name, std::string help, Quantiles quantiles, + std::chrono::milliseconds max_age = std::chrono::seconds{60}, + int age_buckets = 5) + : quantiles_{std::move(quantiles)}, + metric_t(MetricType::Summary, std::move(name), std::move(help)) { + work_ = std::make_shared(ctx_); + thd_ = std::thread([this] { + ctx_.run(); + }); + excutor_ = + std::make_unique>(ctx_.get_executor()); + block_ = std::make_shared(); + block_->quantile_values_ = + std::make_shared(quantiles_, max_age, age_buckets); + start_timer(block_).via(excutor_.get()).start([](auto &&) { + }); + } + + ~summary_t() { + block_->stop_ = true; + work_ = nullptr; + thd_.join(); + } + + struct block_t { + std::atomic stop_ = false; + moodycamel::ConcurrentQueue sample_queue_; + std::shared_ptr quantile_values_; + std::uint64_t count_; + double sum_; + }; + + void observe(double value) { block_->sample_queue_.enqueue(value); } + + async_simple::coro::Lazy> get_rates(double &sum, + uint64_t &count) { + std::vector vec; + if (quantiles_.empty()) { + co_return std::vector{}; + } + + co_await coro_io::post([this, &vec, &sum, &count] { + sum = block_->sum_; + count = block_->count_; + for (const auto &quantile : quantiles_) { + vec.push_back(block_->quantile_values_->get(quantile.quantile)); + } + }); + + co_return vec; + } + + async_simple::coro::Lazy get_sum() { + auto ret = co_await coro_io::post([this] { + return block_->sum_; + }); + co_return ret.value(); + } + + async_simple::coro::Lazy get_count() { + auto ret = co_await coro_io::post([this] { + return block_->count_; + }); + co_return ret.value(); + } + + size_t size_approx() { return block_->sample_queue_.size_approx(); } + + async_simple::coro::Lazy serialize_async(std::string &str) override { + if (quantiles_.empty()) { + co_return; + } + + serialize_head(str); + + double sum = 0; + uint64_t count = 0; + auto rates = co_await get_rates(sum, count); + + for (size_t i = 0; i < quantiles_.size(); i++) { + str.append(name_); + str.append("{quantile=\""); + str.append(std::to_string(quantiles_[i].quantile)).append("\"} "); + str.append(std::to_string(rates[i])).append("\n"); + } + + str.append(name_).append("_sum ").append(std::to_string(sum)).append("\n"); + str.append(name_) + .append("_count ") + .append(std::to_string((uint64_t)count)) + .append("\n"); + } + + private: + async_simple::coro::Lazy start_timer(std::shared_ptr block) { + double sample; + size_t count = 1000000; + while (!block->stop_) { + size_t index = 0; + while (block->sample_queue_.try_dequeue(sample)) { + block->quantile_values_->insert(sample); + block->count_ += 1; + block->sum_ += sample; + index++; + if (index == count) { + break; + } + } + + co_await async_simple::coro::Yield{}; + + if (block->sample_queue_.size_approx() == 0) { + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + } + } + + co_return; + } + + Quantiles quantiles_; // readonly + std::shared_ptr block_; + std::unique_ptr> excutor_ = nullptr; + std::shared_ptr work_; + asio::io_context ctx_; + std::thread thd_; +}; +} // namespace ylt \ No newline at end of file diff --git a/include/ylt/standalone/cinatra/coro_http_connection.hpp b/include/ylt/standalone/cinatra/coro_http_connection.hpp index 356fc4562..d28c449ae 100644 --- a/include/ylt/standalone/cinatra/coro_http_connection.hpp +++ b/include/ylt/standalone/cinatra/coro_http_connection.hpp @@ -21,9 +21,14 @@ #include "sha1.hpp" #include "string_resize.hpp" #include "websocket.hpp" +#include "ylt/metric/counter.hpp" +#include "ylt/metric/gauge.hpp" +#include "ylt/metric/histogram.hpp" +#include "ylt/metric/metric.hpp" #ifdef CINATRA_ENABLE_GZIP #include "gzip.hpp" #endif +#include "metric_conf.hpp" #include "ylt/coro_io/coro_file.hpp" #include "ylt/coro_io/coro_io.hpp" @@ -47,9 +52,14 @@ class coro_http_connection request_(parser_, this), response_(this) { buffers_.reserve(3); + + cinatra_metric_conf::server_total_fd_inc(); } - ~coro_http_connection() { close(); } + ~coro_http_connection() { + cinatra_metric_conf::server_total_fd_dec(); + close(); + } #ifdef CINATRA_ENABLE_SSL bool init_ssl(const std::string &cert_file, const std::string &key_file, @@ -94,6 +104,8 @@ class coro_http_connection #ifdef CINATRA_ENABLE_SSL bool has_shake = false; #endif + std::chrono::system_clock::time_point start{}; + std::chrono::system_clock::time_point mid{}; while (true) { #ifdef CINATRA_ENABLE_SSL if (use_ssl_ && !has_shake) { @@ -113,13 +125,21 @@ class coro_http_connection if (ec != asio::error::eof) { CINATRA_LOG_WARNING << "read http header error: " << ec.message(); } + + cinatra_metric_conf::server_failed_req_inc(); close(); break; } + if (cinatra_metric_conf::enable_metric) { + start = std::chrono::system_clock::now(); + cinatra_metric_conf::server_total_req_inc(); + } + const char *data_ptr = asio::buffer_cast(head_buf_.data()); int head_len = parser_.parse_request(data_ptr, size, 0); if (head_len <= 0) { + cinatra_metric_conf::server_failed_req_inc(); CINATRA_LOG_ERROR << "parse http header error"; close(); break; @@ -133,6 +153,9 @@ class coro_http_connection if (type != content_type::chunked && type != content_type::multipart) { size_t body_len = parser_.body_len(); if (body_len == 0) { + if (cinatra_metric_conf::enable_metric) { + cinatra_metric_conf::server_total_recv_bytes_inc(head_len); + } if (parser_.method() == "GET"sv) { if (request_.is_upgrade()) { #ifdef CINATRA_ENABLE_GZIP @@ -152,6 +175,16 @@ class coro_http_connection } response_.set_delay(true); } + else { + if (cinatra_metric_conf::enable_metric) { + mid = std::chrono::system_clock::now(); + double count = + std::chrono::duration_cast(mid - + start) + .count(); + cinatra_metric_conf::server_read_latency_observe(count); + } + } } } else if (body_len <= head_buf_.size()) { @@ -161,6 +194,7 @@ class coro_http_connection memcpy(body_.data(), data_ptr, body_len); head_buf_.consume(head_buf_.size()); } + cinatra_metric_conf::server_total_recv_bytes_inc(head_len + body_len); } else { size_t part_size = head_buf_.size(); @@ -175,9 +209,22 @@ class coro_http_connection size_to_read); if (ec) { CINATRA_LOG_ERROR << "async_read error: " << ec.message(); + cinatra_metric_conf::server_failed_req_inc(); close(); break; } + else { + if (cinatra_metric_conf::enable_metric) { + cinatra_metric_conf::server_total_recv_bytes_inc(head_len + + body_len); + mid = std::chrono::system_clock::now(); + double count = + std::chrono::duration_cast(mid - + start) + .count(); + cinatra_metric_conf::server_read_latency_observe(count); + } + } } } @@ -362,6 +409,14 @@ class coro_http_connection } } + if (cinatra_metric_conf::enable_metric) { + mid = std::chrono::system_clock::now(); + double count = + std::chrono::duration_cast(mid - start) + .count(); + cinatra_metric_conf::server_req_latency_observe(count); + } + response_.clear(); request_.clear(); buffers_.clear(); @@ -375,18 +430,32 @@ class coro_http_connection } async_simple::coro::Lazy reply(bool need_to_bufffer = true) { + if (response_.status() >= status_type::bad_request) { + if (cinatra_metric_conf::enable_metric) + cinatra_metric_conf::server_failed_req_inc(); + } std::error_code ec; size_t size; if (multi_buf_) { if (need_to_bufffer) { response_.to_buffers(buffers_, chunk_size_str_); } + int64_t send_size = 0; + for (auto &buf : buffers_) { + send_size += buf.size(); + } + if (cinatra_metric_conf::enable_metric) { + cinatra_metric_conf::server_total_send_bytes_inc(send_size); + } std::tie(ec, size) = co_await async_write(buffers_); } else { if (need_to_bufffer) { response_.build_resp_str(resp_str_); } + if (cinatra_metric_conf::enable_metric) { + cinatra_metric_conf::server_total_send_bytes_inc(resp_str_.size()); + } std::tie(ec, size) = co_await async_write(asio::buffer(resp_str_)); } @@ -794,7 +863,7 @@ class coro_http_connection return last_rwtime_; } - auto &get_executor() { return *executor_; } + auto get_executor() { return executor_; } void close(bool need_cb = true) { if (has_closed_) { @@ -884,7 +953,7 @@ class coro_http_connection private: friend class multipart_reader_t; - async_simple::Executor *executor_; + coro_io::ExecutorWrapper<> *executor_; asio::ip::tcp::socket socket_; coro_http_router &router_; asio::streambuf head_buf_; diff --git a/include/ylt/standalone/cinatra/coro_http_server.hpp b/include/ylt/standalone/cinatra/coro_http_server.hpp index 7c2aea83b..29031eae1 100644 --- a/include/ylt/standalone/cinatra/coro_http_server.hpp +++ b/include/ylt/standalone/cinatra/coro_http_server.hpp @@ -11,6 +11,7 @@ #include "ylt/coro_io/coro_file.hpp" #include "ylt/coro_io/coro_io.hpp" #include "ylt/coro_io/io_context_pool.hpp" +#include "ylt/metric/metric.hpp" namespace cinatra { enum class file_resp_format_type { @@ -181,6 +182,16 @@ class coro_http_server { } } + void use_metrics(std::string url_path = "/metrics") { + init_metrics(); + set_http_handler( + url_path, [](coro_http_request &req, coro_http_response &res) { + std::string str = async_simple::coro::syncAwait( + ylt::default_metric_manager::serialize_static()); + res.set_status_and_content(status_type::ok, std::move(str)); + }); + } + template void set_http_proxy_handler(std::string url_path, std::vector hosts, @@ -684,7 +695,7 @@ class coro_http_server { connections_.emplace(conn_id, conn); } - start_one(conn).via(&conn->get_executor()).detach(); + start_one(conn).via(conn->get_executor()).detach(); } } @@ -868,6 +879,7 @@ class coro_http_server { easylog::logger<>::instance(); // init easylog singleton to make sure // server destruct before easylog. #endif + if (size_t pos = address.find(':'); pos != std::string::npos) { auto port_sv = std::string_view(address).substr(pos + 1); @@ -886,6 +898,29 @@ class coro_http_server { address_ = std::move(address); } + private: + void init_metrics() { + using namespace ylt; + + cinatra_metric_conf::enable_metric = true; + default_metric_manager::create_metric_static( + cinatra_metric_conf::server_total_req, ""); + default_metric_manager::create_metric_static( + cinatra_metric_conf::server_failed_req, ""); + default_metric_manager::create_metric_static( + cinatra_metric_conf::server_total_recv_bytes, ""); + default_metric_manager::create_metric_static( + cinatra_metric_conf::server_total_send_bytes, ""); + default_metric_manager::create_metric_static( + cinatra_metric_conf::server_total_fd, ""); + default_metric_manager::create_metric_static( + cinatra_metric_conf::server_req_latency, "", + std::vector{30, 40, 50, 60, 70, 80, 90, 100, 150}); + default_metric_manager::create_metric_static( + cinatra_metric_conf::server_read_latency, "", + std::vector{3, 5, 7, 9, 13, 18, 23, 35, 50}); + } + private: std::unique_ptr pool_; asio::io_context *out_ctx_ = nullptr; diff --git a/include/ylt/standalone/cinatra/metric_conf.hpp b/include/ylt/standalone/cinatra/metric_conf.hpp new file mode 100644 index 000000000..549c93cd0 --- /dev/null +++ b/include/ylt/standalone/cinatra/metric_conf.hpp @@ -0,0 +1,128 @@ +#pragma once +#include +#include + +#include "ylt/metric/counter.hpp" +#include "ylt/metric/gauge.hpp" +#include "ylt/metric/histogram.hpp" +#include "ylt/metric/metric.hpp" +#include "ylt/metric/summary.hpp" + +namespace cinatra { +struct cinatra_metric_conf { + inline static std::string server_total_req = "server_total_req"; + inline static std::string server_failed_req = "server_failed_req"; + inline static std::string server_total_fd = "server_total_fd"; + inline static std::string server_total_recv_bytes = "server_total_recv_bytes"; + inline static std::string server_total_send_bytes = "server_total_send_bytes"; + inline static std::string server_req_latency = "server_req_latency"; + inline static std::string server_read_latency = "server_read_latency"; + inline static std::string server_total_thread_num = "server_total_thread_num"; + inline static bool enable_metric = false; + + inline static void server_total_req_inc() { + if (!enable_metric) { + return; + } + + static auto m = + ylt::default_metric_manager::get_metric_static( + server_total_req); + if (m == nullptr) { + return; + } + m->inc(); + } + + inline static void server_failed_req_inc() { + if (!enable_metric) { + return; + } + static auto m = + ylt::default_metric_manager::get_metric_static( + server_failed_req); + if (m == nullptr) { + return; + } + m->inc(); + } + + inline static void server_total_fd_inc() { + if (!enable_metric) { + return; + } + static auto m = + ylt::default_metric_manager::get_metric_static( + server_total_fd); + if (m == nullptr) { + return; + } + m->inc(); + } + + inline static void server_total_fd_dec() { + if (!enable_metric) { + return; + } + static auto m = + ylt::default_metric_manager::get_metric_static( + server_total_fd); + if (m == nullptr) { + return; + } + m->dec(); + } + + inline static void server_total_recv_bytes_inc(double val) { + if (!enable_metric) { + return; + } + static auto m = + ylt::default_metric_manager::get_metric_static( + server_total_recv_bytes); + if (m == nullptr) { + return; + } + m->inc(val); + } + + inline static void server_total_send_bytes_inc(double val) { + if (!enable_metric) { + return; + } + static auto m = + ylt::default_metric_manager::get_metric_static( + server_total_send_bytes); + if (m == nullptr) { + return; + } + m->inc(val); + } + + inline static void server_req_latency_observe(double val) { + if (!enable_metric) { + return; + } + static auto m = + ylt::default_metric_manager::get_metric_static( + server_req_latency); + if (m == nullptr) { + return; + } + m->observe(val); + } + + inline static void server_read_latency_observe(double val) { + if (!enable_metric) { + return; + } + static auto m = + ylt::default_metric_manager::get_metric_static( + server_read_latency); + if (m == nullptr) { + return; + } + m->observe(val); + } +}; +} // namespace cinatra diff --git a/src/metric/tests/CMakeLists.txt b/src/metric/tests/CMakeLists.txt new file mode 100644 index 000000000..ccb2b9b66 --- /dev/null +++ b/src/metric/tests/CMakeLists.txt @@ -0,0 +1,5 @@ +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output/tests) +add_executable(metric_test + test_metric.cpp + ) +add_test(NAME metric_test COMMAND metric_test) diff --git a/src/metric/tests/test_metric.cpp b/src/metric/tests/test_metric.cpp new file mode 100644 index 000000000..ed5d38220 --- /dev/null +++ b/src/metric/tests/test_metric.cpp @@ -0,0 +1,280 @@ +#include "ylt/metric/gauge.hpp" +#define DOCTEST_CONFIG_IMPLEMENT +#include + +#include "doctest.h" +#include "ylt/metric/counter.hpp" +#include "ylt/metric/histogram.hpp" +#include "ylt/metric/summary.hpp" +using namespace ylt; + +TEST_CASE("test no lable") { + { + gauge_t g{"test_gauge", "help"}; + g.inc(); + g.inc(); + + std::string str; + g.serialize(str); + CHECK(str.find("test_gauge 2") != std::string::npos); + + g.dec(); + CHECK(g.value() == 1); + CHECK_THROWS_AS(g.dec({}, 1), std::invalid_argument); + CHECK_THROWS_AS(g.inc({}, 1), std::invalid_argument); + CHECK_THROWS_AS(g.update({}, 1), std::invalid_argument); + + counter_t c{"test_counter", "help"}; + c.inc(); + c.inc(); + std::string str1; + c.serialize(str1); + CHECK(str1.find("test_counter 2") != std::string::npos); + } + { + counter_t c("get_count", "get counter"); + CHECK(c.metric_type() == MetricType::Counter); + CHECK(c.labels_name().empty()); + c.inc(); + CHECK(c.value() == 1); + c.inc(); + CHECK(c.value() == 2); + c.inc(0); + + CHECK(c.value() == 2); + + CHECK_THROWS_AS(c.inc(-2), std::invalid_argument); + CHECK_THROWS_AS(c.inc({}, 1), std::invalid_argument); + CHECK_THROWS_AS(c.update({}, 1), std::invalid_argument); + + c.update(10); + CHECK(c.value() == 10); + + c.update(0); + CHECK(c.value() == 0); + } +} + +TEST_CASE("test with atomic") { + counter_t c( + "get_count", "get counter", + std::map{{"method", "GET"}, {"url", "/"}}); + std::vector labels_value{"GET", "/"}; + c.inc(labels_value); + c.inc(labels_value, 2); + CHECK(c.value(labels_value) == 3); + CHECK_THROWS_AS(c.inc({"GET", "/test"}), std::invalid_argument); + CHECK_THROWS_AS(c.inc({"POST", "/"}), std::invalid_argument); + c.update(labels_value, 10); + CHECK(c.value(labels_value) == 10); + + gauge_t g( + "get_qps", "get qps", + std::map{{"method", "GET"}, {"url", "/"}}); + g.inc(labels_value); + g.inc(labels_value, 2); + CHECK(g.value(labels_value) == 3); + CHECK_THROWS_AS(g.inc({"GET", "/test"}), std::invalid_argument); + CHECK_THROWS_AS(g.inc({"POST", "/"}), std::invalid_argument); + g.dec(labels_value); + g.dec(labels_value, 1); + CHECK(g.value(labels_value) == 1); + + std::string str; + c.serialize(str); + std::cout << str; + std::string str1; + g.serialize(str1); + std::cout << str1; + CHECK(str.find("} 10") != std::string::npos); + CHECK(str1.find("} 1") != std::string::npos); +} + +TEST_CASE("test counter with dynamic labels value") { + { + auto c = std::make_shared( + "get_count", "get counter", std::vector{"method", "code"}); + CHECK(c->name() == "get_count"); + auto g = std::make_shared( + "get_count", "get counter", std::vector{"method", "code"}); + CHECK(g->name() == "get_count"); + CHECK(g->metric_name() == "gauge"); + } + + { + counter_t c("get_count", "get counter", + std::vector{"method", "code"}); + CHECK(c.labels_name() == std::vector{"method", "code"}); + c.inc({"GET", "200"}, 1); + auto values = c.value_map(); + CHECK(values[{"GET", "200"}] == 1); + c.inc({"GET", "200"}, 2); + values = c.value_map(); + CHECK(values[{"GET", "200"}] == 3); + + std::string str; + c.serialize(str); + std::cout << str; + CHECK(str.find("# TYPE get_count counter") != std::string::npos); + CHECK(str.find("get_count{method=\"GET\",code=\"200\"} 3") != + std::string::npos); + + CHECK_THROWS_AS(c.inc({"GET", "200", "/"}, 2), std::invalid_argument); + + c.update({"GET", "200"}, 20); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + values = c.value_map(); + CHECK(values[{"GET", "200"}] == 20); + } +} + +TEST_CASE("test gauge") { + { + gauge_t g("get_count", "get counter"); + CHECK(g.metric_type() == MetricType::Gauge); + CHECK(g.labels_name().empty()); + g.inc(); + CHECK(g.value() == 1); + g.inc(); + CHECK(g.value() == 2); + g.inc(0); + + g.dec(); + CHECK(g.value() == 1); + g.dec(); + CHECK(g.value() == 0); + } + + { + gauge_t g("get_count", "get counter", {"method", "code", "url"}); + CHECK(g.labels_name() == std::vector{"method", "code", "url"}); + // method, status code, url + g.inc({"GET", "200", "/"}, 1); + auto values = g.value_map(); + CHECK(values[{"GET", "200", "/"}] == 1); + g.inc({"GET", "200", "/"}, 2); + values = g.value_map(); + CHECK(values[{"GET", "200", "/"}] == 3); + + std::string str; + g.serialize(str); + std::cout << str; + CHECK(str.find("# TYPE get_count gauge") != std::string::npos); + CHECK(str.find("get_count{method=\"GET\",code=\"200\",url=\"/\"} 3") != + std::string::npos); + + CHECK_THROWS_AS(g.dec({"GET", "200"}, 1), std::invalid_argument); + + g.dec({"GET", "200", "/"}, 1); + values = g.value_map(); + CHECK(values[{"GET", "200", "/"}] == 2); + g.dec({"GET", "200", "/"}, 2); + values = g.value_map(); + CHECK(values[{"GET", "200", "/"}] == 0); + } +} + +TEST_CASE("test histogram") { + histogram_t h("test", "help", {5.0, 10.0, 20.0, 50.0, 100.0}); + h.observe(23); + auto counts = h.get_bucket_counts(); + CHECK(counts[3]->value() == 1); + h.observe(42); + CHECK(counts[3]->value() == 2); + h.observe(60); + CHECK(counts[4]->value() == 1); + h.observe(120); + CHECK(counts[5]->value() == 1); + h.observe(1); + CHECK(counts[0]->value() == 1); + std::string str; + h.serialize(str); + std::cout << str; + CHECK(str.find("test_count") != std::string::npos); + CHECK(str.find("test_sum") != std::string::npos); + CHECK(str.find("test_bucket{le=\"5") != std::string::npos); + CHECK(str.find("test_bucket{le=\"+Inf\"}") != std::string::npos); +} + +TEST_CASE("test summary") { + summary_t summary{"test_summary", + "summary help", + {{0.5, 0.05}, {0.9, 0.01}, {0.95, 0.005}, {0.99, 0.001}}}; + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution<> distr(1, 100); + for (int i = 0; i < 50; i++) { + summary.observe(distr(gen)); + } + + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + std::string str; + async_simple::coro::syncAwait(summary.serialize_async(str)); + std::cout << str; + CHECK(async_simple::coro::syncAwait(summary.get_count()) == 50); + CHECK(async_simple::coro::syncAwait(summary.get_sum()) > 0); + CHECK(str.find("test_summary") != std::string::npos); + CHECK(str.find("test_summary_count") != std::string::npos); + CHECK(str.find("test_summary_sum") != std::string::npos); + CHECK(str.find("test_summary{quantile=\"") != std::string::npos); +} + +TEST_CASE("test register metric") { + auto c = std::make_shared(std::string("get_count"), + std::string("get counter")); + default_metric_manager::register_metric_static(c); + CHECK_FALSE(default_metric_manager::register_metric_static(c)); + + auto g = std::make_shared(std::string("get_guage_count"), + std::string("get counter")); + default_metric_manager::register_metric_static(g); + + auto map1 = default_metric_manager::metric_map_static(); + for (auto& [k, v] : map1) { + bool r = k == "get_count" || k == "get_guage_count"; + break; + } + + CHECK(default_metric_manager::metric_count_static() >= 2); + CHECK(default_metric_manager::metric_keys_static().size() >= 2); + + c->inc(); + g->inc(); + + auto map = default_metric_manager::metric_map_static(); + CHECK(map["get_count"]->as()->value() == 1); + CHECK(map["get_guage_count"]->as()->value() == 1); + + auto s = + async_simple::coro::syncAwait(default_metric_manager::serialize_static()); + std::cout << s << "\n"; + CHECK(s.find("get_count 1") != std::string::npos); + CHECK(s.find("get_guage_count 1") != std::string::npos); + + auto m = default_metric_manager::get_metric_static("get_count"); + CHECK(m->as()->value() == 1); + + auto m1 = + default_metric_manager::get_metric_static("get_guage_count"); + CHECK(m1->as()->value() == 1); + + { + // because the first regiter_metric is set no lock, so visit + // default_metric_manager with lock will throw. + auto c1 = std::make_shared(std::string(""), std::string("")); + CHECK_THROWS_AS(default_metric_manager::register_metric_dynamic(c1), + std::invalid_argument); + CHECK_THROWS_AS(default_metric_manager::metric_count_dynamic(), + std::invalid_argument); + CHECK_THROWS_AS(default_metric_manager::metric_keys_dynamic(), + std::invalid_argument); + CHECK_THROWS_AS(default_metric_manager::metric_map_dynamic(), + std::invalid_argument); + CHECK_THROWS_AS(default_metric_manager::get_metric_dynamic(""), + std::invalid_argument); + } +} + +DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4007) +int main(int argc, char** argv) { return doctest::Context(argc, argv).run(); } +DOCTEST_MSVC_SUPPRESS_WARNING_POP \ No newline at end of file diff --git a/website/.vitepress/config/zh_data.ts b/website/.vitepress/config/zh_data.ts index 72c6b13cb..83bb98940 100644 --- a/website/.vitepress/config/zh_data.ts +++ b/website/.vitepress/config/zh_data.ts @@ -35,6 +35,10 @@ export const struct_xxx_Links = [ { text: 'struct_xml struct_json struct_yaml 简介', link: '/zh/struct_xxx/struct_xxx_introduction' }, ]; +export const metric_Links = [ + { text: 'metric简介', link: '/zh/metric/metric_introduction' }, +]; + export const aboutLinks = [ { text: 'purecpp', link: '/zh/about/community' }, //TODO 未来支持英语 { text: 'contribute', link: '/zh/about/contribute' }, diff --git a/website/.vitepress/config/zh_locale.ts b/website/.vitepress/config/zh_locale.ts index 407e2f85b..a057950a2 100644 --- a/website/.vitepress/config/zh_locale.ts +++ b/website/.vitepress/config/zh_locale.ts @@ -15,6 +15,7 @@ export const zh_themeConfig = { text: 'easylog', items: data.easylog_Links }, { text: 'coro_http', items: data.coro_http_Links }, { text: 'struct_xxx', items: data.struct_xxx_Links }, + { text: 'metric', items: data.metric_Links }, ] }; diff --git a/website/docs/zh/guide/what_is_yalantinglibs.md b/website/docs/zh/guide/what_is_yalantinglibs.md index fd484bf13..90d2b2dbd 100644 --- a/website/docs/zh/guide/what_is_yalantinglibs.md +++ b/website/docs/zh/guide/what_is_yalantinglibs.md @@ -1,6 +1,6 @@

yaLanTingLibs

-
C++20基础工具库集合,包括struct_pack, struct_json, struct_xml, struct_pb, easylog, coro_rpc, coro_http 和 async_simple
+
C++20基础工具库集合,包括struct_pack, struct_json, struct_xml, struct_pb, easylog, coro_rpc, coro_http, metric 和 async_simple

license @@ -10,7 +10,7 @@ [English Version](../../en/guide/what_is_yalantinglibs.md) -yaLanTingLibs 是一个现代C++基础工具库的集合, 现在它包括 struct_pack, struct_json, struct_xml, struct_yaml, struct_pb, easylog, coro_rpc, coro_io, coro_http 和 async_simple, 目前我们正在开发并添加更多的新功能。 +yaLanTingLibs 是一个现代C++基础工具库的集合, 现在它包括 struct_pack, struct_json, struct_xml, struct_yaml, struct_pb, easylog, coro_rpc, coro_io, coro_http, metric 和 async_simple, 目前我们正在开发并添加更多的新功能。 yaLanTingLibs 的目标: 为C++开发者提供高性能,极度易用的现代C++基础工具库, 帮助用户构建高性能的现代C++应用。 @@ -430,6 +430,10 @@ yalantinglibs工程自身支持如下配置项,如果你使用cmake find_packa 无依赖。 +### metric + +无依赖。 + ## 独立子仓库 coro_http 由独立子仓库实现: [cinatra](https://github.com/qicosmos/cinatra) diff --git a/website/docs/zh/index.md b/website/docs/zh/index.md index 08db7b745..bf815f29b 100644 --- a/website/docs/zh/index.md +++ b/website/docs/zh/index.md @@ -27,5 +27,7 @@ features: - title: easylog details: C++17 实现的高性能易用的日志库, 支持cout 流式、sprintf 和 fmt::format/std::format 输出. - title: struct_xml struct_json struct_yaml - details: C++17 实现的高性能易用的序列化库, 支持xml, json和yaml 的序列化/反序列化. + details: C++17 实现的高性能易用的序列化库, 支持xml, json和yaml 的序列化/反序列化. + - title: metric + details: metric 介绍 --- diff --git a/website/docs/zh/metric/metrict_introduction.md b/website/docs/zh/metric/metrict_introduction.md new file mode 100644 index 000000000..d61b627b2 --- /dev/null +++ b/website/docs/zh/metric/metrict_introduction.md @@ -0,0 +1,511 @@ +# metric 介绍 +metric 用于统计应用程序的各种指标,这些指标被用于系统见识和警报,常见的指标类型有四种:Counter、Gauge、Histogram和Summary,这些指标遵循[Prometheus](https://hulining.gitbook.io/prometheus/introduction)的数据格式。 + +## Counter 计数器类型 +Counter是一个累计类型的数据指标,它代表单调递增的计数器,其值只能在重新启动时增加或重置为 0。例如,您可以使用计数器来表示已响应的请求数,已完成或出错的任务数。 + +不要使用计数器来显示可以减小的值。例如,请不要使用计数器表示当前正在运行的进程数;使用 gauge 代替。 + +## Gauge 数据轨迹类型 +Gauge 是可以任意上下波动数值的指标类型。 + +Gauge 通常用于测量值,例如温度或当前的内存使用量,还可用于可能上下波动的"计数",例如请求并发数。 + +如: +``` +# HELP node_cpu Seconds the cpus spent in each mode. +# TYPE node_cpu counter +node_cpu{cpu="cpu0",mode="idle"} 362812.7890625 +# HELP node_load1 1m load average. +# TYPE node_load1 gauge +node_load1 3.0703125 +``` + +## Histogram 直方图类型 +Histogram 对观测值(通常是请求持续时间或响应大小之类的数据)进行采样,并将其计数在可配置的数值区间中。它也提供了所有数据的总和。 + +基本数据指标名称为的直方图类型数据指标,在数据采集期间会显示多个时间序列: + +数值区间的累计计数器,显示为_bucket{le="<数值区间的上边界>"} + +所有观测值的总和,显示为_sum + +统计到的事件计数,显示为_count(与上述_bucket{le="+Inf"}相同) + +如: +``` +# A histogram, which has a pretty complex representation in the text format: +# HELP http_request_duration_seconds A histogram of the request duration. +# TYPE http_request_duration_seconds histogram +http_request_duration_seconds_bucket{le="0.05"} 24054 +http_request_duration_seconds_bucket{le="0.1"} 33444 +http_request_duration_seconds_bucket{le="0.2"} 100392 +http_request_duration_seconds_bucket{le="+Inf"} 144320 +http_request_duration_seconds_sum 53423 +http_request_duration_seconds_count 144320 +``` + +## Summary 汇总类型 +类似于 histogram,summary 会采样观察结果(通常是请求持续时间和响应大小之类的数据)。它不仅提供了观测值的总数和所有观测值的总和,还可以计算滑动时间窗口内的可配置分位数。 + +基本数据指标名称为的 summary 类型数据指标,在数据采集期间会显示多个时间序列: + +流观察到的事件的 φ-quantiles(0≤φ≤1),显示为{quantile="<φ>"} + +所有观测值的总和,显示为_sum + +观察到的事件计数,显示为_count + +如: +``` +# HELP prometheus_tsdb_wal_fsync_duration_seconds Duration of WAL fsync. +# TYPE prometheus_tsdb_wal_fsync_duration_seconds summary +prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.5"} 0.012352463 +prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.9"} 0.014458005 +prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.99"} 0.017316173 +prometheus_tsdb_wal_fsync_duration_seconds_sum 2.888716127000002 +prometheus_tsdb_wal_fsync_duration_seconds_count 216 +``` + +# 概述 +metric 包括4种指标类型: +- couter:只会增加的指标; +- gauge:可以增加或减少的指标,它派生于counter; +- histogram:直方图,初始化的时候需要设置桶(bucket); +- summary:分位数指标,初始化的时候需要设置桶和误差; + +# label + +label:标签,可选,指标可以没有标签。标签是指一个键值对,标签的键需要在创建指标的时候设置,是静态不可变的。 + +标签的值可以在创建指标的时候设置,这样的label则被称为静态的label。 + +标签的值在运行期动态创建,则label被称为动态的label。 + +动态label的例子: + +```cpp +{"method", "url"} +``` +这个label只有键没有值,所以这个label是动态的label。后续动态生成label对应的值时,这样做: +```cpp +{"GET", "/"} +{"POST", "/test"} +``` +使用的时候填动态的方法名和url就行了: +```cpp +some_counter.inc({std::string(req.method()), req.url()}, 1); +``` +如果传入的标签值数量和创建时的label 键的数量不匹配时则会抛异常。 + +静态label的例子: +```cpp +{{"method", "GET"}, {"url", "/"}} +``` +这个label的键值都确定了,是静态的,后面使用的时候需要显式调用静态的标签值使用: +```cpp +some_counter.inc({"GET", "/"}, 1); +``` + +无标签:创建指标的时候不设置标签,内部只有一个计数。 + +# counter和gauge的使用 + +## 创建没有标签的指标 +```cpp + gauge_t g{"test_gauge", "help"}; + g.inc(); + g.inc(1); + + std::string str; + g.serialize(str); + CHECK(str.find("test_gauge 2") != std::string::npos); + + g.dec(1); + CHECK(g.value() == 1); + g.update(1); + + CHECK_THROWS_AS(g.dec({"test"}, 1), std::invalid_argument); + CHECK_THROWS_AS(g.inc({"test"}, 1), std::invalid_argument); + CHECK_THROWS_AS(g.update({"test"}, 1), std::invalid_argument); + + counter_t c{"test_counter", "help"}; + c.inc(); + c.inc(1); + std::string str1; + c.serialize(str1); + CHECK(str1.find("test_counter 2") != std::string::npos); +``` +## counter/gauge指标的api + +构造函数: +```cpp +// 无标签,调用inc时不带标签,如c.inc() +// name: 指标对象的名称,注册到指标管理器时会使用这个名称 +// help: 指标对象的帮助信息 +counter_t(std::string name, std::string help); + +// labels: 静态标签,构造时需要将标签键值都填完整,如:{{"method", "GET"}, {"url", "/"}} +// 调用inc时必须带静态标签的值,如:c.inc({"GET", "/"}, 1); +counter_t(std::string name, std::string help, + std::map labels); + +// labels_name: 动态标签的键名称,因为标签的值是动态的,而键的名称是固定的,所以这里只需要填键名称,如: {"method", "url"} +// 调用时inc时必须带动态标签的值,如:c.inc({method, url}, 1); +counter_t(std::string name, std::string help, + std::vector labels_name); +``` + +基本函数: +```cpp +// 获取无标签指标的计数, +double value(); + +// 根据标签获取指标的计数,参数为动态或者静态标签的值 +double value(const std::vector &labels_value); + +// 无标签指标增加计数,counter的计数只能增加不能减少,如果填入的时负数时会抛异常;如果需要减少计数的指标则应该使用gauge; +void inc(double val = 1); + +// 根据标签增加计数,如果创建的指标是静态标签值且和传入的标签值不匹配时会抛异常;如果标签的值的数量和构造指标时传入的标签数量不相等时会抛异常。 +void inc(const std::vector &labels_value, double value = 1); + +// 序列化,将指标序列化成prometheus 格式的字符串 +void serialize(std::string &str); + +// 返回带标签的指标内部的计数map,map的key是标签的值,值是对应计数,如:{{{"GET", "/"}, 100}, {{"POST", "/test"}, 20}} +std::map, double, + std::less>> + value_map(); +``` + +注意:如果使用动态标签的时候要注意这个动态的标签值是不是无限多的,如果是无限多的话,那么内部的map也会无限增长,应该避免这种情况,动态的标签也应该是有限的才对。 + +gauge 派生于counter,相比counter多了一个减少计数的api +```cpp +// 无标签指标减少计数 +void dec(double value = 1); + +// 根据标签减少计数,如果创建的指标是静态标签值且和传入的标签值不匹配时会抛异常;如果标签的值的数量和构造指标时传入的标签数量不相等时会抛异常。 +void dec(const std::vector& labels_value, double value = 1); +``` + +# 基类公共函数 +所有指标都派生于metric_t 基类,提供了一些公共方法,如获取指标的名称,指标的类型,标签的键名称等等。 + +```cpp +class metric_t { + public: + // 获取指标对象的名称 + std::string_view name(); + + // 获取指标对象的help 信息 + std::string_view help(); + + // 指标类型 + enum class MetricType { + Counter, + Gauge, + Histogram, + Summary, + Nil, + }; + + // 获取指标类型 + MetricType metric_type(); + + // 获取指标类型的名称,比如counter, gauge, histogram和summary + std::string_view metric_name(); + + // 获取标签的键,如{"method", "url"} + const std::vector& labels_name(); + + // 序列化,调用派生类实现序列化 + virtual void serialize(std::string& str); + + // 给summary专用的api,序列化,调用派生类实现序列化 + virtual async_simple::coro::Lazy serialize_async(std::string& out); + + // 将基类指针向下转换到派生类指针,如: + // std::shared_ptr c = std::make_shared("test", "test"); + // counter_t* t = c->as(); + // t->value(); + template + T* as(); +}; +``` + +# 指标管理器 +如果希望集中管理多个指标时,则需要将指标注册到指标管理器,后面则可以多态调用管理器中的多个指标将各自的计数输出出来。 + +**推荐在一开始就创建所有的指标并注册到管理器**,后面就可以无锁方式根据指标对象的名称来获取指标对象了。 + +```cpp +auto c = std::make_shared("qps_count", "qps help"); +auto g = std::make_shared("fd_count", "fd count help"); +default_metric_manager::register_metric_static(c); +default_metric_manager::register_metric_static(g); + +c->inc(); +g->inc(); + +auto m = default_metric_manager::get_metric_static("qps_count"); +CHECK(m->as()->value() == 1); + +auto m1 = default_metric_manager::get_metric_static("fd_count"); +CHECK(m1->as()->value() == 1); +``` + +如果希望动态注册的到管理器则应该调用register_metric_dynamic接口,后面根据名称获取指标对象时则调用get_metric_dynamic接口,dynamic接口内部会加锁。 +```cpp +auto c = std::make_shared("qps_count", "qps help"); +auto g = std::make_shared("fd_count", "fd count help"); +default_metric_manager::register_metric_dynamic(c); +default_metric_manager::register_metric_dynamic(g); + +c->inc(); +g->inc(); + +auto m = default_metric_manager::get_metric_dynamic("qps_count"); +CHECK(m->as()->value() == 1); + +auto m1 = default_metric_manager::get_metric_dynamic("fd_count"); +CHECK(m1->as()->value() == 1); +``` +注意:一旦注册时使用了static或者dynamic,那么后面调用default_metric_manager时则应该使用相同后缀的接口,比如注册时使用了get_metric_static,那么后面调用根据名称获取指标对象的方法必须是get_metric_static,否则会抛异常。同样,如果注册使用register_metric_dynamic,则后面应该get_metric_dynamic,否则会抛异常。 + +指标管理器的api +```cpp +template +struct metric_manager_t { + // 创建并注册指标,返回注册的指标对象 + template + static std::shared_ptr create_metric_static(const std::string& name, + const std::string& help, + Args&&... args); + template + static std::shared_ptr create_metric_dynamic(const std::string& name, + const std::string& help, + Args&&... args) + // 注册metric + static bool register_metric_static(std::shared_ptr metric); + static bool register_metric_dynamic(std::shared_ptr metric); + + // 获取注册的所有指标对象 + static std::map> metric_map_static(); + static std::map> metric_map_dynamic(); + + // 获取注册的指标对象的总数 + static size_t metric_count_static(); + static size_t metric_count_dynamic(); + + // 获取注册的指标对象的名称 + static std::vector metric_keys_static(); + static std::vector metric_keys_dynamic(); + + // 根据名称获取指标对象,T为具体指标的类型,如 get_metric_static(); + // 如果找不到则返回nullptr + template + static T* get_metric_static(const std::string& name); + template + static T* get_metric_static(const std::string& name); + + static std::shared_ptr get_metric_static(const std::string& name); + static std::shared_ptr get_metric_dynamic(const std::string& name); + + // 序列化 + static async_simple::coro::Lazy serialize_static(); + static async_simple::coro::Lazy serialize_dynamic(); +}; +using default_metric_manager = metric_manager_t<0>; +``` +metric_manager_t默认为default_metric_manager,如果希望有多个metric manager,用户可以自定义新的metric manager,如: + +```cpp +constexpr size_t metric_id = 100; +using my_metric_manager = metric_manager_t; +``` + +# histogram + +## api +```cpp +// +// name: 对象名称,help:帮助信息 +// buckets:桶,如 {1, 3, 7, 11, 23},后面设置的值会自动落到某个桶中并增加该桶的计数; +// 内部还有一个+Inf 默认的桶,当输入的数据不在前面设置这些桶中,则会落到+Inf 默认桶中。 +// 实际上桶的总数为 buckets.size() + 1 +// 每个bucket 实际上对应了一个counter指标 +histogram_t(std::string name, std::string help, std::vector buckets); + +// 往histogram_t 中插入数据,内部会自动增加对应桶的计数 +void observe(double value); + +// 获取所有桶对应的counter指标对象 +std::vector> get_bucket_counts(); + +// 序列化 +void serialize(std::string& str); +``` +## 例子 +```cpp + histogram_t h("test", "help", {5.0, 10.0, 20.0, 50.0, 100.0}); + h.observe(23); + auto counts = h.get_bucket_counts(); + CHECK(counts[3]->value() == 1); + h.observe(42); + CHECK(counts[3]->value() == 2); + h.observe(60); + CHECK(counts[4]->value() == 1); + h.observe(120); + CHECK(counts[5]->value() == 1); + h.observe(1); + CHECK(counts[0]->value() == 1); + std::string str; + h.serialize(str); + std::cout << str; + CHECK(str.find("test_count") != std::string::npos); + CHECK(str.find("test_sum") != std::string::npos); + CHECK(str.find("test_bucket{le=\"5") != std::string::npos); + CHECK(str.find("test_bucket{le=\"+Inf\"}") != std::string::npos); +``` + +创建Histogram时需要指定桶(bucket),采样点统计数据会落到不同的桶中,并且还需要统计采样点数据的累计总和(sum)以及次数的总和(count)。注意bucket 列表必须是有序的,否则构造时会抛异常。 + +Histogram统计的特点是:数据是累积的,比如由10, 100,两个桶,第一个桶的数据是所有值 <= 10的样本数据存在桶中,第二个桶是所有 <=100 的样本数据存在桶中,其它数据则存放在`+Inf`的桶中。 + +```cpp + auto h = std::make_shared( + std::string("test"), std::string("help"), std::vector{10.0, 100.0}); + metric_t::regiter_metric(h); + + h->observe(5); + h->observe(80); + h->observe(120); + + std::string str; + h.serialize(str); + std::cout<> get_rates(); + +// 获取总和 +async_simple::coro::Lazy get_sum(); + +// 获取插入数据的个数 +async_simple::coro::Lazy get_count(); + +// 序列化 +async_simple::coro::Lazy serialize_async(std::string &str); +``` + +## 例子 +```cpp + summary_t summary{"test_summary", + "summary help", + {{0.5, 0.05}, {0.9, 0.01}, {0.95, 0.005}, {0.99, 0.001}}}; + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution<> distr(1, 100); + for (int i = 0; i < 50; i++) { + summary.observe(distr(gen)); + } + + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + std::string str; + async_simple::coro::syncAwait(summary.serialize_async(str)); + std::cout << str; + CHECK(async_simple::coro::syncAwait(summary.get_count()) == 50); + CHECK(async_simple::coro::syncAwait(summary.get_sum()) > 0); + CHECK(str.find("test_summary") != std::string::npos); + CHECK(str.find("test_summary_count") != std::string::npos); + CHECK(str.find("test_summary_sum") != std::string::npos); + CHECK(str.find("test_summary{quantile=\"") != std::string::npos); +``` +summary 百分位的计算相比其它指标是最耗时的,应该避免在关键路径上使用它以免对性能造成影响。 + +创建Summary时需要指定分位数和误差,分位数在0到1之间,左右都为闭区间,比如p50就是一个中位数,p99指中位数为0.99的分位数。 +```cpp + summary_t summary{"test_summary", + "summary help", + {{0.5, 0.05}, {0.9, 0.01}, {0.95, 0.005}, {0.99, 0.001}}}; + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution<> distr(1, 100); + for (int i = 0; i < 50; i++) { + summary.observe(distr(gen)); + } + + std::string str; + summary.serialize(str); + std::cout << str; +``` +输出: +``` +# HELP test_summary summary help +# TYPE test_summary summary +test_summary{quantile="0.500000"} 45.000000 +test_summary{quantile="0.900000"} 83.000000 +test_summary{quantile="0.950000"} 88.000000 +test_summary{quantile="0.990000"} 93.000000 +test_summary_sum 2497.000000 +test_summary_count 50 +``` + +## 配置prometheus 前端 +安装[prometheus](https://github.com/prometheus/prometheus)之后,打开其配置文件:prometheus.yml + +修改要连接的服务端地址: +``` +- targets: ["127.0.0.1:9001"] +``` +然后启动prometheus,prometheus会定时访问`http://127.0.0.1:9001/metrics` 拉取所有指标数据。 + +在本地浏览器输入:127.0.0.1:9090, 打开prometheus前端,在前端页面的搜索框中输入指标的名称request_count之后就能看到table和graph 结果了。 + +# cinatra http server中启用内置的metric指标 + +http server 内置的指标: +```cpp +server_total_req: server总的请求数; +server_failed_req:server总的失败请求数; +server_total_fd:server使用的总的句柄数; +server_total_recv_bytes:server总共收到的字节数; +server_total_send_bytes:server总共发送的字节数; +server_req_latency:http 请求的延迟,从收到请求到发送响应的时间间隔 +server_read_latency:http 读请求的延迟,读到完整的http数据的时间间隔 +``` + +```cpp +coro_http_server server(1, 9001); +server.use_metrics("/metrics");//这个url默认就是/metrics,可以不填 +``` +在浏览器中输入`http://127.0.0.1:9001/metrics` 即可看到所有的指标。 + +查看当前server的client pool中有多少client,调用`pool.free_client_count()` + +查看当前server内部线程池中有多少线程,调用`coro_io::get_total_thread_num()` \ No newline at end of file From c1dcf9f8d78058f70ebab0684e0e2e7d7bc7a6b4 Mon Sep 17 00:00:00 2001 From: qicosmos Date: Fri, 7 Jun 2024 23:20:01 +0800 Subject: [PATCH 04/12] update version to 0.3.0 --- include/ylt/version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/ylt/version.hpp b/include/ylt/version.hpp index 3e494fbcf..579bd3356 100644 --- a/include/ylt/version.hpp +++ b/include/ylt/version.hpp @@ -20,4 +20,4 @@ // YLT_VERSION % 100 is the sub-minor version // YLT_VERSION / 100 % 1000 is the minor version // YLT_VERSION / 100000 is the major version -#define YLT_VERSION 302 // 0.3.2 \ No newline at end of file +#define YLT_VERSION 303 // 0.3.3 \ No newline at end of file From ea0d790355af6f660c317e3439b23acfb9110065 Mon Sep 17 00:00:00 2001 From: qicosmos Date: Fri, 7 Jun 2024 23:20:01 +0800 Subject: [PATCH 05/12] update version to 0.3.3 --- include/ylt/version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/ylt/version.hpp b/include/ylt/version.hpp index 3e494fbcf..579bd3356 100644 --- a/include/ylt/version.hpp +++ b/include/ylt/version.hpp @@ -20,4 +20,4 @@ // YLT_VERSION % 100 is the sub-minor version // YLT_VERSION / 100 % 1000 is the minor version // YLT_VERSION / 100000 is the major version -#define YLT_VERSION 302 // 0.3.2 \ No newline at end of file +#define YLT_VERSION 303 // 0.3.3 \ No newline at end of file From 03245efb48cfcd3eef4bd6a9218c89b9434ced15 Mon Sep 17 00:00:00 2001 From: qicosmos Date: Fri, 7 Jun 2024 23:28:54 +0800 Subject: [PATCH 06/12] doc --- website/docs/zh/metric/metrict_introduction.md | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/website/docs/zh/metric/metrict_introduction.md b/website/docs/zh/metric/metrict_introduction.md index d61b627b2..8d1ce4581 100644 --- a/website/docs/zh/metric/metrict_introduction.md +++ b/website/docs/zh/metric/metrict_introduction.md @@ -12,7 +12,8 @@ Gauge 是可以任意上下波动数值的指标类型。 Gauge 通常用于测量值,例如温度或当前的内存使用量,还可用于可能上下波动的"计数",例如请求并发数。 如: -``` + +```cpp # HELP node_cpu Seconds the cpus spent in each mode. # TYPE node_cpu counter node_cpu{cpu="cpu0",mode="idle"} 362812.7890625 @@ -33,7 +34,8 @@ Histogram 对观测值(通常是请求持续时间或响应大小之类的数据 统计到的事件计数,显示为_count(与上述_bucket{le="+Inf"}相同) 如: -``` + +```cpp # A histogram, which has a pretty complex representation in the text format: # HELP http_request_duration_seconds A histogram of the request duration. # TYPE http_request_duration_seconds histogram @@ -57,7 +59,8 @@ http_request_duration_seconds_count 144320 观察到的事件计数,显示为_count 如: -``` + +```cpp # HELP prometheus_tsdb_wal_fsync_duration_seconds Duration of WAL fsync. # TYPE prometheus_tsdb_wal_fsync_duration_seconds summary prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.5"} 0.012352463 @@ -93,16 +96,19 @@ label:标签,可选,指标可以没有标签。标签是指一个键值对 {"POST", "/test"} ``` 使用的时候填动态的方法名和url就行了: + ```cpp some_counter.inc({std::string(req.method()), req.url()}, 1); ``` 如果传入的标签值数量和创建时的label 键的数量不匹配时则会抛异常。 静态label的例子: + ```cpp {{"method", "GET"}, {"url", "/"}} ``` 这个label的键值都确定了,是静态的,后面使用的时候需要显式调用静态的标签值使用: + ```cpp some_counter.inc({"GET", "/"}, 1); ``` @@ -112,6 +118,7 @@ some_counter.inc({"GET", "/"}, 1); # counter和gauge的使用 ## 创建没有标签的指标 + ```cpp gauge_t g{"test_gauge", "help"}; g.inc(); @@ -139,6 +146,7 @@ some_counter.inc({"GET", "/"}, 1); ## counter/gauge指标的api 构造函数: + ```cpp // 无标签,调用inc时不带标签,如c.inc() // name: 指标对象的名称,注册到指标管理器时会使用这个名称 @@ -157,6 +165,7 @@ counter_t(std::string name, std::string help, ``` 基本函数: + ```cpp // 获取无标签指标的计数, double value(); @@ -182,6 +191,7 @@ std::map, double, 注意:如果使用动态标签的时候要注意这个动态的标签值是不是无限多的,如果是无限多的话,那么内部的map也会无限增长,应该避免这种情况,动态的标签也应该是有限的才对。 gauge 派生于counter,相比counter多了一个减少计数的api + ```cpp // 无标签指标减少计数 void dec(double value = 1); @@ -257,6 +267,7 @@ CHECK(m1->as()->value() == 1); ``` 如果希望动态注册的到管理器则应该调用register_metric_dynamic接口,后面根据名称获取指标对象时则调用get_metric_dynamic接口,dynamic接口内部会加锁。 + ```cpp auto c = std::make_shared("qps_count", "qps help"); auto g = std::make_shared("fd_count", "fd count help"); From a66d642f02ee9fe4576fc6e6f8d6cc0449f763d8 Mon Sep 17 00:00:00 2001 From: Brian <48396880+Corgile@users.noreply.github.com> Date: Sun, 9 Jun 2024 18:00:23 +0800 Subject: [PATCH 07/12] Update easylog.hpp (#690) --- include/ylt/easylog.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/ylt/easylog.hpp b/include/ylt/easylog.hpp index adb3d39ac..68ec4f25f 100644 --- a/include/ylt/easylog.hpp +++ b/include/ylt/easylog.hpp @@ -288,7 +288,7 @@ inline void add_appender(std::function fn) { #endif #ifndef MELOG_TRACE -#define MELOG_TRACE(id) ELOG(INFO, id) +#define MELOG_TRACE(id) ELOG(TRACE, id) #endif #ifndef MELOG_DEBUG #define MELOG_DEBUG(id) ELOG(DEBUG, id) @@ -326,4 +326,4 @@ inline void add_appender(std::function fn) { #endif #ifndef ELOGF #define ELOGF ELOG_FATAL -#endif \ No newline at end of file +#endif From ef012e63275b0bbbb29c4cdc6dcba636de98d178 Mon Sep 17 00:00:00 2001 From: qicosmos Date: Wed, 12 Jun 2024 18:48:50 +0800 Subject: [PATCH 08/12] fix url queries (#691) --- include/ylt/metric/metric.hpp | 2 +- .../ylt/standalone/cinatra/http_parser.hpp | 43 ++++++-------- src/coro_http/examples/example.cpp | 56 +++++++++++++++++++ 3 files changed, 74 insertions(+), 27 deletions(-) diff --git a/include/ylt/metric/metric.hpp b/include/ylt/metric/metric.hpp index 58d0afc5b..f93896b6c 100644 --- a/include/ylt/metric/metric.hpp +++ b/include/ylt/metric/metric.hpp @@ -131,7 +131,7 @@ struct metric_manager_t { const std::string& help, Args&&... args) { auto m = std::make_shared(name, help, std::forward(args)...); - bool r = register_metric_static(m); + bool r = register_metric_dynamic(m); if (!r) { return nullptr; } diff --git a/include/ylt/standalone/cinatra/http_parser.hpp b/include/ylt/standalone/cinatra/http_parser.hpp index 04322cee5..543198d49 100644 --- a/include/ylt/standalone/cinatra/http_parser.hpp +++ b/include/ylt/standalone/cinatra/http_parser.hpp @@ -7,6 +7,7 @@ #include #include +#include "cinatra/utils.hpp" #include "cinatra_log_wrapper.hpp" #include "define.h" #include "picohttpparser.h" @@ -225,36 +226,26 @@ class http_parser { void parse_query(std::string_view str) { std::string_view key; std::string_view val; - size_t pos = 0; - size_t length = str.length(); - for (size_t i = 0; i < length; i++) { - char c = str[i]; - if (c == '=') { - key = {&str[pos], i - pos}; - key = trim(key); - pos = i + 1; - } - else if (c == '&') { - val = {&str[pos], i - pos}; - val = trim(val); - queries_.emplace(key, val); - pos = i + 1; + auto vec = split_sv(str, "&"); + for (auto s : vec) { + if (s.empty()) { + continue; + } + size_t pos = s.find('='); + if (s.find('=') != std::string_view::npos) { + key = s.substr(0, pos); + if (key.empty()) { + continue; + } + val = s.substr(pos + 1, s.length() - pos); + } + else { + key = s; + val = ""; } - } - - if (pos == 0) { - return; - } - - if ((length - pos) > 0) { - val = {&str[pos], length - pos}; - val = trim(val); queries_.emplace(key, val); } - else if ((length - pos) == 0) { - queries_.emplace(key, ""); - } } std::string_view trim(std::string_view v) { diff --git a/src/coro_http/examples/example.cpp b/src/coro_http/examples/example.cpp index 3c8142e62..e76967395 100644 --- a/src/coro_http/examples/example.cpp +++ b/src/coro_http/examples/example.cpp @@ -289,6 +289,43 @@ struct person_t { } }; +void url_queries() { + { + http_parser parser{}; + parser.parse_query("="); + parser.parse_query("&a"); + parser.parse_query("&b="); + parser.parse_query("&c=&d"); + parser.parse_query("&e=&f=1"); + parser.parse_query("&g=1&h=1"); + auto map = parser.queries(); + assert(map["a"].empty()); + assert(map["b"].empty()); + assert(map["c"].empty()); + assert(map["d"].empty()); + assert(map["e"].empty()); + assert(map["f"] == "1"); + assert(map["g"] == "1" && map["h"] == "1"); + } + { + http_parser parser{}; + parser.parse_query("test"); + parser.parse_query("test1="); + parser.parse_query("test2=&"); + parser.parse_query("test3&"); + parser.parse_query("test4&a"); + parser.parse_query("test5&b=2"); + parser.parse_query("test6=1&c=2"); + parser.parse_query("test7=1&d"); + parser.parse_query("test8=1&e="); + parser.parse_query("test9=1&f"); + parser.parse_query("test10=1&g=10&h&i=3&j"); + auto map = parser.queries(); + assert(map["test"].empty()); + assert(map.size() == 21); + } +} + async_simple::coro::Lazy basic_usage() { coro_http_server server(1, 9001); server.set_http_handler( @@ -296,6 +333,21 @@ async_simple::coro::Lazy basic_usage() { resp.set_status_and_content(status_type::ok, "ok"); }); + server.set_http_handler( + "/queries", [](coro_http_request &req, coro_http_response &resp) { + auto map = req.get_queries(); + assert(map["test"] == ""); + resp.set_status_and_content(status_type::ok, "ok"); + }); + + server.set_http_handler( + "/queries2", [](coro_http_request &req, coro_http_response &resp) { + auto map = req.get_queries(); + assert(map["test"] == ""); + assert(map["a"] == "42"); + resp.set_status_and_content(status_type::ok, "ok"); + }); + server.set_http_handler( "/coro", [](coro_http_request &req, @@ -382,6 +434,9 @@ async_simple::coro::Lazy basic_usage() { std::cout << key << ": " << val << "\n"; } + co_await client.async_get("/queries?test"); + co_await client.async_get("/queries2?test&a=42"); + result = co_await client.async_get("/coro"); assert(result.status == 200); @@ -594,6 +649,7 @@ void coro_channel() { } int main() { + url_queries(); async_simple::coro::syncAwait(basic_usage()); async_simple::coro::syncAwait(use_aspects()); async_simple::coro::syncAwait(static_file_server()); From 4f4b010bcce6359f51842f21a519fa28aeefb50a Mon Sep 17 00:00:00 2001 From: qicosmos Date: Fri, 14 Jun 2024 16:55:12 +0800 Subject: [PATCH 09/12] [metric][feat]improve metrics (#692) --- include/ylt/metric.hpp | 22 + include/ylt/metric/counter.hpp | 70 ++- include/ylt/metric/detail/ckms_quantiles.hpp | 4 +- .../metric/detail/time_window_quantiles.hpp | 4 +- include/ylt/metric/gauge.hpp | 4 +- include/ylt/metric/histogram.hpp | 210 ++++++- include/ylt/metric/metric.hpp | 290 +++++++++- include/ylt/metric/summary.hpp | 357 +++++++++++- .../standalone/cinatra/coro_http_server.hpp | 21 +- .../ylt/standalone/cinatra/metric_conf.hpp | 40 +- src/metric/tests/test_metric.cpp | 514 +++++++++++++++++- .../docs/zh/metric/metrict_introduction.md | 79 ++- 12 files changed, 1500 insertions(+), 115 deletions(-) create mode 100644 include/ylt/metric.hpp diff --git a/include/ylt/metric.hpp b/include/ylt/metric.hpp new file mode 100644 index 000000000..89279894d --- /dev/null +++ b/include/ylt/metric.hpp @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2024, Alibaba Group Holding Limited; + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once +#define CINATRA_ENABLE_METRIC_JSON +#include "metric/gauge.hpp" +#include "metric/histogram.hpp" +#include "metric/metric.hpp" +#include "metric/summary.hpp" +#include "ylt/struct_json/json_writer.h" diff --git a/include/ylt/metric/counter.hpp b/include/ylt/metric/counter.hpp index a252106d1..3c339b078 100644 --- a/include/ylt/metric/counter.hpp +++ b/include/ylt/metric/counter.hpp @@ -4,13 +4,23 @@ #include "metric.hpp" -namespace ylt { +namespace ylt::metric { enum class op_type_t { INC, DEC, SET }; -struct counter_sample { - op_type_t op_type; - std::vector labels_value; - double value; + +#ifdef CINATRA_ENABLE_METRIC_JSON +struct json_counter_metric_t { + std::unordered_multimap labels; + int64_t value; +}; +REFLECTION(json_counter_metric_t, labels, value); +struct json_counter_t { + std::string name; + std::string help; + std::string type; + std::vector metrics; }; +REFLECTION(json_counter_t, name, help, type, metrics); +#endif class counter_t : public metric_t { public: @@ -23,12 +33,8 @@ class counter_t : public metric_t { // static labels value, contains a map with atomic value. counter_t(std::string name, std::string help, std::map labels) - : metric_t(MetricType::Counter, std::move(name), std::move(help)) { - for (auto &[k, v] : labels) { - labels_name_.push_back(k); - labels_value_.push_back(v); - } - + : metric_t(MetricType::Counter, std::move(name), std::move(help), + std::move(labels)) { atomic_value_map_.emplace(labels_value_, 0); use_atomic_ = true; } @@ -56,7 +62,7 @@ class counter_t : public metric_t { std::map, double, std::less>> - value_map() { + value_map() override { std::map, double, std::less>> map; @@ -97,6 +103,44 @@ class counter_t : public metric_t { } } +#ifdef CINATRA_ENABLE_METRIC_JSON + void serialize_to_json(std::string &str) override { + std::string s; + if (labels_name_.empty()) { + if (default_lable_value_ == 0) { + return; + } + json_counter_t counter{name_, help_, std::string(metric_name())}; + int64_t value = default_lable_value_; + counter.metrics.push_back({{}, value}); + iguana::to_json(counter, str); + return; + } + + json_counter_t counter{name_, help_, std::string(metric_name())}; + if (use_atomic_) { + to_json(counter, atomic_value_map_, str); + } + else { + to_json(counter, value_map_, str); + } + } + + template + void to_json(json_counter_t &counter, T &map, std::string &str) { + for (auto &[k, v] : map) { + json_counter_metric_t metric; + size_t index = 0; + for (auto &label_value : k) { + metric.labels.emplace(labels_name_[index++], label_value); + } + metric.value = (int64_t)v; + counter.metrics.push_back(std::move(metric)); + } + iguana::to_json(counter, str); + } +#endif + void inc(double val = 1) { if (val < 0) { throw std::invalid_argument("the value is less than zero"); @@ -255,4 +299,4 @@ class counter_t : public metric_t { std::less>> value_map_; }; -} // namespace ylt \ No newline at end of file +} // namespace ylt::metric \ No newline at end of file diff --git a/include/ylt/metric/detail/ckms_quantiles.hpp b/include/ylt/metric/detail/ckms_quantiles.hpp index cdaf1db92..fd42a8c24 100644 --- a/include/ylt/metric/detail/ckms_quantiles.hpp +++ b/include/ylt/metric/detail/ckms_quantiles.hpp @@ -5,7 +5,7 @@ // https://github.com/jupp0r/prometheus-cpp/blob/master/core/include/prometheus/detail/ckms_quantiles.h -namespace ylt { +namespace ylt::metric { class CKMSQuantiles { public: struct Quantile { @@ -172,4 +172,4 @@ class CKMSQuantiles { std::array buffer_; std::size_t buffer_count_; }; -} // namespace ylt \ No newline at end of file +} // namespace ylt::metric \ No newline at end of file diff --git a/include/ylt/metric/detail/time_window_quantiles.hpp b/include/ylt/metric/detail/time_window_quantiles.hpp index fd7df105f..6b81179f0 100644 --- a/include/ylt/metric/detail/time_window_quantiles.hpp +++ b/include/ylt/metric/detail/time_window_quantiles.hpp @@ -2,7 +2,7 @@ #include "ckms_quantiles.hpp" // https://github.com/jupp0r/prometheus-cpp/blob/master/core/include/prometheus/detail/time_window_quantiles.h -namespace ylt { +namespace ylt::metric { class TimeWindowQuantiles { using Clock = std::chrono::steady_clock; @@ -49,4 +49,4 @@ class TimeWindowQuantiles { mutable Clock::time_point last_rotation_; const Clock::duration rotation_interval_; }; -} // namespace ylt \ No newline at end of file +} // namespace ylt::metric \ No newline at end of file diff --git a/include/ylt/metric/gauge.hpp b/include/ylt/metric/gauge.hpp index 19c4b65c2..18693f1af 100644 --- a/include/ylt/metric/gauge.hpp +++ b/include/ylt/metric/gauge.hpp @@ -3,7 +3,7 @@ #include "counter.hpp" -namespace ylt { +namespace ylt::metric { class gauge_t : public counter_t { public: gauge_t(std::string name, std::string help) @@ -49,4 +49,4 @@ class gauge_t : public counter_t { } } }; -} // namespace ylt \ No newline at end of file +} // namespace ylt::metric \ No newline at end of file diff --git a/include/ylt/metric/histogram.hpp b/include/ylt/metric/histogram.hpp index dfd2ca131..d85225a5b 100644 --- a/include/ylt/metric/histogram.hpp +++ b/include/ylt/metric/histogram.hpp @@ -8,7 +8,24 @@ #include "counter.hpp" #include "metric.hpp" -namespace ylt { +namespace ylt::metric { +#ifdef CINATRA_ENABLE_METRIC_JSON +struct json_histogram_metric_t { + std::map labels; + std::map quantiles; + int64_t count; + double sum; +}; +REFLECTION(json_histogram_metric_t, labels, quantiles, count, sum); +struct json_histogram_t { + std::string name; + std::string help; + std::string type; + std::vector metrics; +}; +REFLECTION(json_histogram_t, name, help, type, metrics); +#endif + class histogram_t : public metric_t { public: histogram_t(std::string name, std::string help, std::vector buckets) @@ -25,7 +42,41 @@ class histogram_t : public metric_t { use_atomic_ = true; } + histogram_t(std::string name, std::string help, std::vector buckets, + std::vector labels_name) + : bucket_boundaries_(buckets), + metric_t(MetricType::Histogram, name, help, labels_name), + sum_(std::make_shared(name, help, labels_name)) { + if (!is_strict_sorted(begin(bucket_boundaries_), end(bucket_boundaries_))) { + throw std::invalid_argument("Bucket Boundaries must be strictly sorted"); + } + + for (size_t i = 0; i < buckets.size() + 1; i++) { + bucket_counts_.push_back( + std::make_shared(name, help, labels_name)); + } + } + + histogram_t(std::string name, std::string help, std::vector buckets, + std::map labels) + : bucket_boundaries_(buckets), + metric_t(MetricType::Histogram, name, help, labels), + sum_(std::make_shared(name, help, labels)) { + if (!is_strict_sorted(begin(bucket_boundaries_), end(bucket_boundaries_))) { + throw std::invalid_argument("Bucket Boundaries must be strictly sorted"); + } + + for (size_t i = 0; i < buckets.size() + 1; i++) { + bucket_counts_.push_back(std::make_shared(name, help, labels)); + } + use_atomic_ = true; + } + void observe(double value) { + if (!use_atomic_ || !labels_name_.empty()) { + throw std::invalid_argument("not a default label metric"); + } + const auto bucket_index = static_cast( std::distance(bucket_boundaries_.begin(), std::lower_bound(bucket_boundaries_.begin(), @@ -34,9 +85,33 @@ class histogram_t : public metric_t { bucket_counts_[bucket_index]->inc(); } + void observe(const std::vector &labels_value, double value) { + if (sum_->labels_name().empty()) { + throw std::invalid_argument("not a label metric"); + } + + const auto bucket_index = static_cast( + std::distance(bucket_boundaries_.begin(), + std::lower_bound(bucket_boundaries_.begin(), + bucket_boundaries_.end(), value))); + sum_->inc(labels_value, value); + bucket_counts_[bucket_index]->inc(labels_value); + } + auto get_bucket_counts() { return bucket_counts_; } - void serialize(std::string& str) override { + std::map, double, + std::less>> + value_map() override { + return sum_->value_map(); + } + + void serialize(std::string &str) override { + if (!sum_->labels_name().empty()) { + serialize_with_labels(str); + return; + } + serialize_head(str); double count = 0; auto bucket_counts = get_bucket_counts(); @@ -68,6 +143,41 @@ class histogram_t : public metric_t { .append("\n"); } +#ifdef CINATRA_ENABLE_METRIC_JSON + void serialize_to_json(std::string &str) override { + if (!sum_->labels_name().empty()) { + serialize_to_json_with_labels(str); + return; + } + + json_histogram_t hist{name_, help_, std::string(metric_name())}; + + double count = 0; + auto bucket_counts = get_bucket_counts(); + json_histogram_metric_t metric{}; + for (size_t i = 0; i < bucket_counts.size(); i++) { + auto counter = bucket_counts[i]; + + count += counter->value(); + + if (i == bucket_boundaries_.size()) { + metric.quantiles.emplace(std::numeric_limits::max(), + (int64_t)count); + } + else { + metric.quantiles.emplace(bucket_boundaries_[i], + (int64_t)counter->value()); + } + } + metric.count = (int64_t)count; + metric.sum = sum_->value(); + + hist.metrics.push_back(std::move(metric)); + + iguana::to_json(hist, str); + } +#endif + private: template bool is_strict_sorted(ForwardIterator first, ForwardIterator last) { @@ -76,8 +186,102 @@ class histogram_t : public metric_t { ForwardIterator>::value_type>()) == last; } + void serialize_with_labels(std::string &str) { + serialize_head(str); + + auto bucket_counts = get_bucket_counts(); + + auto value_map = sum_->value_map(); + for (auto &[labels_value, value] : value_map) { + if (value == 0) { + continue; + } + + double count = 0; + for (size_t i = 0; i < bucket_counts.size(); i++) { + auto counter = bucket_counts[i]; + str.append(name_).append("_bucket{"); + build_label_string(str, sum_->labels_name(), labels_value); + str.append(","); + + if (i == bucket_boundaries_.size()) { + str.append("le=\"").append("+Inf").append("\"} "); + } + else { + str.append("le=\"") + .append(std::to_string(bucket_boundaries_[i])) + .append("\"} "); + } + + count += counter->value(labels_value); + str.append(std::to_string(count)); + str.append("\n"); + } + + str.append(name_); + str.append("_sum{"); + build_label_string(str, sum_->labels_name(), labels_value); + str.append("} "); + + if (type_ == MetricType::Counter) { + str.append(std::to_string((int64_t)value)); + } + else { + str.append(std::to_string(value)); + } + str.append("\n"); + + str.append(name_).append("_count{"); + build_label_string(str, sum_->labels_name(), labels_value); + str.append("} "); + str.append(std::to_string(count)); + str.append("\n"); + } + } + +#ifdef CINATRA_ENABLE_METRIC_JSON + void serialize_to_json_with_labels(std::string &str) { + json_histogram_t hist{name_, help_, std::string(metric_name())}; + auto bucket_counts = get_bucket_counts(); + + auto value_map = sum_->value_map(); + for (auto &[labels_value, value] : value_map) { + if (value == 0) { + continue; + } + + size_t count = 0; + json_histogram_metric_t metric{}; + for (size_t i = 0; i < bucket_counts.size(); i++) { + auto counter = bucket_counts[i]; + + count += counter->value(labels_value); + + if (i == bucket_boundaries_.size()) { + metric.quantiles.emplace(std::numeric_limits::max(), + (int64_t)count); + } + else { + metric.quantiles.emplace(bucket_boundaries_[i], + (int64_t)counter->value(labels_value)); + } + } + metric.count = (int64_t)count; + metric.sum = sum_->value(labels_value); + + for (size_t i = 0; i < labels_value.size(); i++) { + metric.labels[sum_->labels_name()[i]] = labels_value[i]; + } + + hist.metrics.push_back(std::move(metric)); + } + + iguana::to_json(hist, str); + } +#endif + std::vector bucket_boundaries_; std::vector> bucket_counts_; // readonly std::shared_ptr sum_; }; -} // namespace ylt \ No newline at end of file +} // namespace ylt::metric \ No newline at end of file diff --git a/include/ylt/metric/metric.hpp b/include/ylt/metric/metric.hpp index f93896b6c..ea103e59f 100644 --- a/include/ylt/metric/metric.hpp +++ b/include/ylt/metric/metric.hpp @@ -1,17 +1,33 @@ #pragma once +#include #include #include #include #include #include +#include +#include #include #include #include #include "async_simple/coro/Lazy.h" +#include "async_simple/coro/SyncAwait.h" #include "cinatra/cinatra_log_wrapper.hpp" -namespace ylt { +#ifdef CINATRA_ENABLE_METRIC_JSON +namespace iguana { + +template +inline char* to_chars_float(T value, char* buffer) { + return buffer + snprintf(buffer, 65, "%g", value); +} + +} // namespace iguana + +#include +#endif +namespace ylt::metric { enum class MetricType { Counter, Gauge, @@ -20,15 +36,32 @@ enum class MetricType { Nil, }; +struct metric_filter_options { + std::optional name_regex{}; + std::optional label_regex{}; + bool is_white = true; +}; + class metric_t { public: metric_t() = default; + metric_t(MetricType type, std::string name, std::string help) + : type_(type), name_(std::move(name)), help_(std::move(help)) {} metric_t(MetricType type, std::string name, std::string help, - std::vector labels_name = {}) - : type_(type), - name_(std::move(name)), - help_(std::move(help)), - labels_name_(std::move(labels_name)) {} + std::vector labels_name) + : metric_t(type, std::move(name), std::move(help)) { + labels_name_ = std::move(labels_name); + } + + metric_t(MetricType type, std::string name, std::string help, + std::map static_labels) + : metric_t(type, std::move(name), std::move(help)) { + static_labels_ = std::move(static_labels); + for (auto& [k, v] : static_labels_) { + labels_name_.push_back(k); + labels_value_.push_back(v); + } + } virtual ~metric_t() {} std::string_view name() { return name_; } @@ -55,13 +88,35 @@ class metric_t { const std::vector& labels_name() { return labels_name_; } + const std::map& get_static_labels() { + return static_labels_; + } + + virtual std::map, double, + std::less>> + value_map() { + return {}; + } + virtual void serialize(std::string& str) {} +#ifdef CINATRA_ENABLE_METRIC_JSON + virtual void serialize_to_json(std::string& str) {} +#endif + // only for summary virtual async_simple::coro::Lazy serialize_async(std::string& out) { co_return; } +#ifdef CINATRA_ENABLE_METRIC_JSON + // only for summary + virtual async_simple::coro::Lazy serialize_to_json_async( + std::string& out) { + co_return; + } +#endif + bool is_atomic() const { return use_atomic_; } template @@ -80,6 +135,19 @@ class metric_t { .append("\n"); } + void build_label_string(std::string& str, + const std::vector& label_name, + const std::vector& label_value) { + for (size_t i = 0; i < label_name.size(); i++) { + str.append(label_name[i]) + .append("=\"") + .append(label_value[i]) + .append("\"") + .append(","); + } + str.pop_back(); + } + #ifdef __APPLE__ double mac_os_atomic_fetch_add(std::atomic* obj, double arg) { double v; @@ -101,6 +169,7 @@ class metric_t { MetricType type_ = MetricType::Nil; std::string name_; std::string help_; + std::map static_labels_; std::vector labels_name_; // read only std::vector labels_value_; // read only bool use_atomic_ = false; @@ -138,12 +207,20 @@ struct metric_manager_t { return m; } + static bool register_metric_static(std::shared_ptr metric) { + return register_metric_impl(metric); + } + static bool register_metric_dynamic(std::shared_ptr metric) { return register_metric_impl(metric); } - static bool register_metric_static(std::shared_ptr metric) { - return register_metric_impl(metric); + static bool remove_metric_static(const std::string& name) { + return remove_metric_impl(name); + } + + static bool remove_metric_dynamic(const std::string& name) { + return remove_metric_impl(name); } template @@ -175,30 +252,144 @@ struct metric_manager_t { return metric_keys_impl(); } + // static labels: {{"method", "GET"}, {"url", "/"}} + static std::vector> get_metric_by_labels_static( + const std::map& labels) { + std::vector> vec; + auto map = metric_map_static(); + for (auto& [name, m] : map) { + const auto& static_labels = m->get_static_labels(); + if (static_labels == labels) { + vec.push_back(m); + } + } + return vec; + } + + // static label: {"method", "GET"} + static std::vector> get_metric_by_label_static( + const std::pair& label) { + std::vector> vec; + auto map = metric_map_static(); + for (auto& [name, t] : map) { + const auto& static_labels = t->get_static_labels(); + for (const auto& pair : static_labels) { + if (pair.first == label.first && pair.second == label.second) { + vec.push_back(t); + } + } + } + return vec; + } + + // labels: {{"method", "POST"}, {"code", "200"}} + static std::vector> get_metric_by_labels_dynamic( + const std::map& labels) { + std::vector> vec; + auto map = metric_map_dynamic(); + for (auto& [name, t] : map) { + auto val_map = t->value_map(); + auto labels_name = t->labels_name(); + + for (auto& [k, v] : labels) { + if (auto it = std::find(labels_name.begin(), labels_name.end(), k); + it != labels_name.end()) { + if (auto it = std::find_if(val_map.begin(), val_map.end(), + [label_val = v](auto& pair) { + auto& key = pair.first; + return std::find(key.begin(), key.end(), + label_val) != key.end(); + }); + it != val_map.end()) { + vec.push_back(t); + } + } + } + } + + return vec; + } + template - static T* get_metric_static(const std::string& name) { + static std::shared_ptr get_metric_static(const std::string& name) { auto m = get_metric_impl(name); if (m == nullptr) { return nullptr; } - return m->template as(); + return std::dynamic_pointer_cast(m); } template - static T* get_metric_dynamic(const std::string& name) { + static std::shared_ptr get_metric_dynamic(const std::string& name) { auto m = get_metric_impl(name); if (m == nullptr) { return nullptr; } - return m->template as(); + return std::dynamic_pointer_cast(m); } - static async_simple::coro::Lazy serialize_static() { - return serialize_impl(); + static std::string serialize( + const std::vector>& metrics) { + std::string str; + for (auto& m : metrics) { + if (m->metric_type() == MetricType::Summary) { + async_simple::coro::syncAwait(m->serialize_async(str)); + } + else { + m->serialize(str); + } + } + + return str; + } + + static std::string serialize_static() { return serialize(collect()); } + + static std::string serialize_dynamic() { return serialize(collect()); } + +#ifdef CINATRA_ENABLE_METRIC_JSON + static std::string serialize_to_json_static() { + auto metrics = collect(); + return serialize_to_json(metrics); + } + + static std::string serialize_to_json_dynamic() { + auto metrics = collect(); + return serialize_to_json(metrics); } - static async_simple::coro::Lazy serialize_dynamic() { - return serialize_impl(); + static std::string serialize_to_json( + const std::vector>& metrics) { + if (metrics.empty()) { + return ""; + } + std::string str; + str.append("["); + for (auto& m : metrics) { + size_t start = str.size(); + if (m->metric_type() == MetricType::Summary) { + async_simple::coro::syncAwait(m->serialize_to_json_async(str)); + } + else { + m->serialize_to_json(str); + } + + if (str.size() > start) + str.append(","); + } + str.back() = ']'; + return str; + } +#endif + + static std::vector> filter_metrics_static( + const metric_filter_options& options) { + return filter_metrics(options); + } + + static std::vector> filter_metrics_dynamic( + const metric_filter_options& options) { + return filter_metrics(options); } private: @@ -242,6 +433,12 @@ struct metric_manager_t { return r; } + template + static size_t remove_metric_impl(const std::string& name) { + auto lock = get_lock(); + return metric_map_.erase(name); + } + template static auto metric_map_impl() { auto lock = get_lock(); @@ -289,19 +486,64 @@ struct metric_manager_t { return metrics; } - template - static async_simple::coro::Lazy serialize_impl() { - std::string str; + static void filter_by_label_name( + std::vector>& filtered_metrics, + std::shared_ptr m, const metric_filter_options& options, + std::vector& indexs, size_t index) { + const auto& labels_name = m->labels_name(); + for (auto& label_name : labels_name) { + if (std::regex_match(label_name, *options.label_regex)) { + if (options.is_white) { + filtered_metrics.push_back(m); + } + else { + indexs.push_back(index); + } + } + } + } + + template + static std::vector> filter_metrics( + const metric_filter_options& options) { auto metrics = collect(); + if (!options.name_regex && !options.label_regex) { + return metrics; + } + + std::vector> filtered_metrics; + std::vector indexs; + size_t index = 0; for (auto& m : metrics) { - if (m->metric_type() == MetricType::Summary) { - co_await m->serialize_async(str); + if (options.name_regex && !options.label_regex) { + if (std::regex_match(std::string(m->name()), *options.name_regex)) { + if (options.is_white) { + filtered_metrics.push_back(m); + } + else { + indexs.push_back(index); + } + } + } + else if (options.label_regex && !options.name_regex) { + filter_by_label_name(filtered_metrics, m, options, indexs, index); } else { - m->serialize(str); + if (std::regex_match(std::string(m->name()), *options.name_regex)) { + filter_by_label_name(filtered_metrics, m, options, indexs, index); + } } + index++; } - co_return str; + + if (!options.is_white) { + for (size_t i : indexs) { + metrics.erase(std::next(metrics.begin(), i)); + } + return metrics; + } + + return filtered_metrics; } static inline std::mutex mtx_; @@ -313,4 +555,4 @@ struct metric_manager_t { }; using default_metric_manager = metric_manager_t<0>; -} // namespace ylt \ No newline at end of file +} // namespace ylt::metric \ No newline at end of file diff --git a/include/ylt/metric/summary.hpp b/include/ylt/metric/summary.hpp index 415d6b322..bad8a132a 100644 --- a/include/ylt/metric/summary.hpp +++ b/include/ylt/metric/summary.hpp @@ -6,7 +6,29 @@ #include "ylt/coro_io/coro_io.hpp" #include "ylt/util/concurrentqueue.h" -namespace ylt { +namespace ylt::metric { +#ifdef CINATRA_ENABLE_METRIC_JSON +struct json_summary_metric_t { + std::map labels; + std::map quantiles; + int64_t count; + double sum; +}; +REFLECTION(json_summary_metric_t, labels, quantiles, count, sum); +struct json_summary_t { + std::string name; + std::string help; + std::string type; + std::vector metrics; +}; +REFLECTION(json_summary_t, name, help, type, metrics); +#endif + +struct summary_label_sample { + std::vector labels_value; + double value; +}; + class summary_t : public metric_t { public: using Quantiles = std::vector; @@ -14,22 +36,56 @@ class summary_t : public metric_t { std::chrono::milliseconds max_age = std::chrono::seconds{60}, int age_buckets = 5) : quantiles_{std::move(quantiles)}, - metric_t(MetricType::Summary, std::move(name), std::move(help)) { - work_ = std::make_shared(ctx_); - thd_ = std::thread([this] { - ctx_.run(); - }); - excutor_ = - std::make_unique>(ctx_.get_executor()); - block_ = std::make_shared(); + metric_t(MetricType::Summary, std::move(name), std::move(help)), + max_age_(max_age), + age_buckets_(age_buckets) { + init_executor(); + init_block(block_); block_->quantile_values_ = std::make_shared(quantiles_, max_age, age_buckets); - start_timer(block_).via(excutor_.get()).start([](auto &&) { - }); + use_atomic_ = true; + } + + summary_t(std::string name, std::string help, Quantiles quantiles, + std::vector labels_name, + std::chrono::milliseconds max_age = std::chrono::seconds{60}, + int age_buckets = 5) + : quantiles_{std::move(quantiles)}, + metric_t(MetricType::Summary, std::move(name), std::move(help), + std::move(labels_name)), + max_age_(max_age), + age_buckets_(age_buckets) { + init_executor(); + init_block(labels_block_); + } + + summary_t(std::string name, std::string help, Quantiles quantiles, + std::map static_labels, + std::chrono::milliseconds max_age = std::chrono::seconds{60}, + int age_buckets = 5) + : quantiles_{std::move(quantiles)}, + metric_t(MetricType::Summary, std::move(name), std::move(help), + std::move(static_labels)), + max_age_(max_age), + age_buckets_(age_buckets) { + init_executor(); + init_block(labels_block_); + labels_block_->label_quantile_values_[labels_value_] = + std::make_shared(quantiles_, max_age, age_buckets); + labels_block_->label_count_.emplace(labels_value_, 0); + labels_block_->label_sum_.emplace(labels_value_, 0); + use_atomic_ = true; } ~summary_t() { - block_->stop_ = true; + if (block_) { + block_->stop_ = true; + } + + if (labels_block_) { + labels_block_->stop_ = true; + } + work_ = nullptr; thd_.join(); } @@ -42,7 +98,39 @@ class summary_t : public metric_t { double sum_; }; - void observe(double value) { block_->sample_queue_.enqueue(value); } + struct labels_block_t { + std::atomic stop_ = false; + moodycamel::ConcurrentQueue sample_queue_; + + std::map, std::shared_ptr, + std::less>> + label_quantile_values_; + std::map, std::uint64_t, + std::less>> + label_count_; + std::map, double, + std::less>> + label_sum_; + }; + + void observe(double value) { + if (!labels_name_.empty()) { + throw std::invalid_argument("not a default label metric"); + } + block_->sample_queue_.enqueue(value); + } + + void observe(std::vector labels_value, double value) { + if (labels_value.empty()) { + throw std::invalid_argument("not a label metric"); + } + if (use_atomic_) { + if (labels_value != labels_value_) { + throw std::invalid_argument("not equal with static label"); + } + } + labels_block_->sample_queue_.enqueue({std::move(labels_value), value}); + } async_simple::coro::Lazy> get_rates(double &sum, uint64_t &count) { @@ -51,34 +139,86 @@ class summary_t : public metric_t { co_return std::vector{}; } - co_await coro_io::post([this, &vec, &sum, &count] { - sum = block_->sum_; - count = block_->count_; - for (const auto &quantile : quantiles_) { - vec.push_back(block_->quantile_values_->get(quantile.quantile)); + co_await coro_io::post( + [this, &vec, &sum, &count] { + sum = block_->sum_; + count = block_->count_; + for (const auto &quantile : quantiles_) { + vec.push_back(block_->quantile_values_->get(quantile.quantile)); + } + }, + excutor_.get()); + + co_return vec; + } + + async_simple::coro::Lazy> get_rates( + const std::vector &labels_value, double &sum, + uint64_t &count) { + std::vector vec; + if (quantiles_.empty()) { + co_return std::vector{}; + } + + if (use_atomic_) { + if (labels_value != labels_value_) { + throw std::invalid_argument("not equal with static label"); } - }); + } + + co_await coro_io::post( + [this, &vec, &sum, &count, &labels_value] { + auto it = labels_block_->label_quantile_values_.find(labels_value); + if (it == labels_block_->label_quantile_values_.end()) { + return; + } + sum = labels_block_->label_sum_[labels_value]; + count = labels_block_->label_count_[labels_value]; + for (const auto &quantile : quantiles_) { + vec.push_back(it->second->get(quantile.quantile)); + } + }, + excutor_.get()); co_return vec; } + std::map, double, + std::less>> + value_map() override { + auto ret = async_simple::coro::syncAwait(coro_io::post( + [this] { + return labels_block_->label_sum_; + }, + excutor_.get())); + return ret.value(); + } + async_simple::coro::Lazy get_sum() { - auto ret = co_await coro_io::post([this] { - return block_->sum_; - }); + auto ret = co_await coro_io::post( + [this] { + return block_->sum_; + }, + excutor_.get()); co_return ret.value(); } async_simple::coro::Lazy get_count() { - auto ret = co_await coro_io::post([this] { - return block_->count_; - }); + auto ret = co_await coro_io::post( + [this] { + return block_->count_; + }, + excutor_.get()); co_return ret.value(); } size_t size_approx() { return block_->sample_queue_.size_approx(); } async_simple::coro::Lazy serialize_async(std::string &str) override { + if (block_ == nullptr) { + co_await serialize_async_with_label(str); + co_return; + } if (quantiles_.empty()) { co_return; } @@ -103,8 +243,55 @@ class summary_t : public metric_t { .append("\n"); } +#ifdef CINATRA_ENABLE_METRIC_JSON + async_simple::coro::Lazy serialize_to_json_async( + std::string &str) override { + if (block_ == nullptr) { + co_await serialize_to_json_with_label_async(str); + co_return; + } + + if (quantiles_.empty()) { + co_return; + } + + json_summary_t summary{name_, help_, std::string(metric_name())}; + double sum = 0; + uint64_t count = 0; + auto rates = co_await get_rates(sum, count); + + json_summary_metric_t metric; + + for (size_t i = 0; i < quantiles_.size(); i++) { + metric.quantiles.emplace(quantiles_[i].quantile, rates[i]); + } + + metric.sum = sum; + metric.count = count; + + summary.metrics.push_back(std::move(metric)); + + iguana::to_json(summary, str); + } +#endif private: - async_simple::coro::Lazy start_timer(std::shared_ptr block) { + void init_executor() { + work_ = std::make_shared(ctx_); + thd_ = std::thread([this] { + ctx_.run(); + }); + excutor_ = + std::make_unique>(ctx_.get_executor()); + } + + template + void init_block(std::shared_ptr &block) { + block = std::make_shared(); + start(block).via(excutor_.get()).start([](auto &&) { + }); + } + + async_simple::coro::Lazy start(std::shared_ptr block) { double sample; size_t count = 1000000; while (!block->stop_) { @@ -122,18 +309,132 @@ class summary_t : public metric_t { co_await async_simple::coro::Yield{}; if (block->sample_queue_.size_approx() == 0) { - std::this_thread::sleep_for(std::chrono::milliseconds(5)); + co_await coro_io::sleep_for(std::chrono::milliseconds(5), + excutor_.get()); } } co_return; } + async_simple::coro::Lazy start(std::shared_ptr block) { + summary_label_sample sample; + size_t count = 1000000; + while (!block->stop_) { + size_t index = 0; + while (block->sample_queue_.try_dequeue(sample)) { + auto &ptr = block->label_quantile_values_[sample.labels_value]; + + if (ptr == nullptr) { + ptr = std::make_shared(quantiles_, max_age_, + age_buckets_); + } + + ptr->insert(sample.value); + + block->label_count_[sample.labels_value] += 1; + block->label_sum_[sample.labels_value] += sample.value; + index++; + if (index == count) { + break; + } + } + + co_await async_simple::coro::Yield{}; + + if (block->sample_queue_.size_approx() == 0) { + co_await coro_io::sleep_for(std::chrono::milliseconds(5), + excutor_.get()); + } + } + + co_return; + } + + async_simple::coro::Lazy serialize_async_with_label(std::string &str) { + if (quantiles_.empty()) { + co_return; + } + + serialize_head(str); + + auto sum_map = co_await coro_io::post( + [this] { + return labels_block_->label_sum_; + }, + excutor_.get()); + + for (auto &[labels_value, sum_val] : sum_map.value()) { + double sum = 0; + uint64_t count = 0; + auto rates = co_await get_rates(labels_value, sum, count); + for (size_t i = 0; i < quantiles_.size(); i++) { + str.append(name_); + str.append("{"); + build_label_string(str, labels_name_, labels_value); + str.append(","); + str.append("quantile=\""); + str.append(std::to_string(quantiles_[i].quantile)).append("\"} "); + str.append(std::to_string(rates[i])).append("\n"); + } + + str.append(name_).append("_sum "); + str.append("{"); + build_label_string(str, labels_name_, labels_value); + str.append("} "); + str.append(std::to_string(sum)).append("\n"); + + str.append(name_).append("_count "); + str.append("{"); + build_label_string(str, labels_name_, labels_value); + str.append("} "); + str.append(std::to_string((uint64_t)count)).append("\n"); + } + } + +#ifdef CINATRA_ENABLE_METRIC_JSON + async_simple::coro::Lazy serialize_to_json_with_label_async( + std::string &str) { + if (quantiles_.empty()) { + co_return; + } + + auto sum_map = co_await coro_io::post( + [this] { + return labels_block_->label_sum_; + }, + excutor_.get()); + + json_summary_t summary{name_, help_, std::string(metric_name())}; + + for (auto &[labels_value, sum_val] : sum_map.value()) { + json_summary_metric_t metric; + double sum = 0; + uint64_t count = 0; + auto rates = co_await get_rates(labels_value, sum, count); + metric.count = count; + metric.sum = sum; + for (size_t i = 0; i < quantiles_.size(); i++) { + for (size_t i = 0; i < labels_value.size(); i++) { + metric.labels[labels_name_[i]] = labels_value[i]; + } + metric.quantiles.emplace(quantiles_[i].quantile, rates[i]); + } + + summary.metrics.push_back(std::move(metric)); + } + iguana::to_json(summary, str); + } +#endif + Quantiles quantiles_; // readonly std::shared_ptr block_; + std::shared_ptr labels_block_; std::unique_ptr> excutor_ = nullptr; std::shared_ptr work_; asio::io_context ctx_; std::thread thd_; + std::chrono::milliseconds max_age_; + int age_buckets_; }; -} // namespace ylt \ No newline at end of file +} // namespace ylt::metric \ No newline at end of file diff --git a/include/ylt/standalone/cinatra/coro_http_server.hpp b/include/ylt/standalone/cinatra/coro_http_server.hpp index 29031eae1..17a057fdb 100644 --- a/include/ylt/standalone/cinatra/coro_http_server.hpp +++ b/include/ylt/standalone/cinatra/coro_http_server.hpp @@ -182,12 +182,23 @@ class coro_http_server { } } - void use_metrics(std::string url_path = "/metrics") { + void use_metrics(bool enable_json = false, + std::string url_path = "/metrics") { init_metrics(); set_http_handler( - url_path, [](coro_http_request &req, coro_http_response &res) { - std::string str = async_simple::coro::syncAwait( - ylt::default_metric_manager::serialize_static()); + url_path, + [enable_json](coro_http_request &req, coro_http_response &res) { + std::string str; +#ifdef CINATRA_ENABLE_METRIC_JSON + if (enable_json) { + str = + ylt::metric::default_metric_manager::serialize_to_json_static(); + res.set_content_type(); + } + else +#endif + str = ylt::metric::default_metric_manager::serialize_static(); + res.set_status_and_content(status_type::ok, std::move(str)); }); } @@ -900,7 +911,7 @@ class coro_http_server { private: void init_metrics() { - using namespace ylt; + using namespace ylt::metric; cinatra_metric_conf::enable_metric = true; default_metric_manager::create_metric_static( diff --git a/include/ylt/standalone/cinatra/metric_conf.hpp b/include/ylt/standalone/cinatra/metric_conf.hpp index 549c93cd0..4800481ad 100644 --- a/include/ylt/standalone/cinatra/metric_conf.hpp +++ b/include/ylt/standalone/cinatra/metric_conf.hpp @@ -25,9 +25,8 @@ struct cinatra_metric_conf { return; } - static auto m = - ylt::default_metric_manager::get_metric_static( - server_total_req); + static auto m = ylt::metric::default_metric_manager::get_metric_static< + ylt::metric::counter_t>(server_total_req); if (m == nullptr) { return; } @@ -38,9 +37,8 @@ struct cinatra_metric_conf { if (!enable_metric) { return; } - static auto m = - ylt::default_metric_manager::get_metric_static( - server_failed_req); + static auto m = ylt::metric::default_metric_manager::get_metric_static< + ylt::metric::counter_t>(server_failed_req); if (m == nullptr) { return; } @@ -51,9 +49,8 @@ struct cinatra_metric_conf { if (!enable_metric) { return; } - static auto m = - ylt::default_metric_manager::get_metric_static( - server_total_fd); + static auto m = ylt::metric::default_metric_manager::get_metric_static< + ylt::metric::gauge_t>(server_total_fd); if (m == nullptr) { return; } @@ -64,9 +61,8 @@ struct cinatra_metric_conf { if (!enable_metric) { return; } - static auto m = - ylt::default_metric_manager::get_metric_static( - server_total_fd); + static auto m = ylt::metric::default_metric_manager::get_metric_static< + ylt::metric::gauge_t>(server_total_fd); if (m == nullptr) { return; } @@ -77,9 +73,8 @@ struct cinatra_metric_conf { if (!enable_metric) { return; } - static auto m = - ylt::default_metric_manager::get_metric_static( - server_total_recv_bytes); + static auto m = ylt::metric::default_metric_manager::get_metric_static< + ylt::metric::counter_t>(server_total_recv_bytes); if (m == nullptr) { return; } @@ -90,9 +85,8 @@ struct cinatra_metric_conf { if (!enable_metric) { return; } - static auto m = - ylt::default_metric_manager::get_metric_static( - server_total_send_bytes); + static auto m = ylt::metric::default_metric_manager::get_metric_static< + ylt::metric::counter_t>(server_total_send_bytes); if (m == nullptr) { return; } @@ -103,9 +97,8 @@ struct cinatra_metric_conf { if (!enable_metric) { return; } - static auto m = - ylt::default_metric_manager::get_metric_static( - server_req_latency); + static auto m = ylt::metric::default_metric_manager::get_metric_static< + ylt::metric::histogram_t>(server_req_latency); if (m == nullptr) { return; } @@ -116,9 +109,8 @@ struct cinatra_metric_conf { if (!enable_metric) { return; } - static auto m = - ylt::default_metric_manager::get_metric_static( - server_read_latency); + static auto m = ylt::metric::default_metric_manager::get_metric_static< + ylt::metric::histogram_t>(server_read_latency); if (m == nullptr) { return; } diff --git a/src/metric/tests/test_metric.cpp b/src/metric/tests/test_metric.cpp index ed5d38220..5608460c8 100644 --- a/src/metric/tests/test_metric.cpp +++ b/src/metric/tests/test_metric.cpp @@ -1,12 +1,11 @@ -#include "ylt/metric/gauge.hpp" #define DOCTEST_CONFIG_IMPLEMENT #include #include "doctest.h" -#include "ylt/metric/counter.hpp" -#include "ylt/metric/histogram.hpp" -#include "ylt/metric/summary.hpp" +#include "ylt/metric.hpp" + using namespace ylt; +using namespace ylt::metric; TEST_CASE("test no lable") { { @@ -139,6 +138,13 @@ TEST_CASE("test gauge") { CHECK(g.value() == 2); g.inc(0); +#ifdef CINATRA_ENABLE_METRIC_JSON + std::string str_json; + g.serialize_to_json(str_json); + std::cout << str_json << "\n"; + CHECK(str_json.find("\"value\":2") != std::string::npos); +#endif + g.dec(); CHECK(g.value() == 1); g.dec(); @@ -156,6 +162,15 @@ TEST_CASE("test gauge") { values = g.value_map(); CHECK(values[{"GET", "200", "/"}] == 3); + g.inc({"POST", "200", "/"}, 4); + +#ifdef CINATRA_ENABLE_METRIC_JSON + std::string str_json; + g.serialize_to_json(str_json); + std::cout << str_json << "\n"; + CHECK(str_json.find("\"code\":\"200\"") != std::string::npos); +#endif + std::string str; g.serialize(str); std::cout << str; @@ -175,7 +190,7 @@ TEST_CASE("test gauge") { } TEST_CASE("test histogram") { - histogram_t h("test", "help", {5.0, 10.0, 20.0, 50.0, 100.0}); + histogram_t h("test", "help", {5.23, 10.54, 20.0, 50.0, 100.0}); h.observe(23); auto counts = h.get_bucket_counts(); CHECK(counts[3]->value() == 1); @@ -189,11 +204,18 @@ TEST_CASE("test histogram") { CHECK(counts[0]->value() == 1); std::string str; h.serialize(str); - std::cout << str; + std::cout << str << "\n"; CHECK(str.find("test_count") != std::string::npos); CHECK(str.find("test_sum") != std::string::npos); - CHECK(str.find("test_bucket{le=\"5") != std::string::npos); + CHECK(str.find("test_bucket{le=\"5.23") != std::string::npos); CHECK(str.find("test_bucket{le=\"+Inf\"}") != std::string::npos); + +#ifdef CINATRA_ENABLE_METRIC_JSON + std::string str_json; + h.serialize_to_json(str_json); + std::cout << str_json << "\n"; + CHECK(str_json.find("\"5.23\":1") != std::string::npos); +#endif } TEST_CASE("test summary") { @@ -217,6 +239,13 @@ TEST_CASE("test summary") { CHECK(str.find("test_summary_count") != std::string::npos); CHECK(str.find("test_summary_sum") != std::string::npos); CHECK(str.find("test_summary{quantile=\"") != std::string::npos); + +#ifdef CINATRA_ENABLE_METRIC_JSON + std::string str_json; + async_simple::coro::syncAwait(summary.serialize_to_json_async(str_json)); + std::cout << str_json << "\n"; + CHECK(str_json.find("\"0.9\":") != std::string::npos); +#endif } TEST_CASE("test register metric") { @@ -245,8 +274,7 @@ TEST_CASE("test register metric") { CHECK(map["get_count"]->as()->value() == 1); CHECK(map["get_guage_count"]->as()->value() == 1); - auto s = - async_simple::coro::syncAwait(default_metric_manager::serialize_static()); + auto s = default_metric_manager::serialize_static(); std::cout << s << "\n"; CHECK(s.find("get_count 1") != std::string::npos); CHECK(s.find("get_guage_count 1") != std::string::npos); @@ -275,6 +303,474 @@ TEST_CASE("test register metric") { } } +TEST_CASE("test remove metric and serialize metrics") { + using metric_mgr = metric_manager_t<1>; + metric_mgr::create_metric_dynamic("test_counter", ""); + metric_mgr::create_metric_dynamic("test_counter2", ""); + + size_t count = metric_mgr::metric_count_dynamic(); + CHECK(count == 2); + + metric_mgr::remove_metric_dynamic("test_counter"); + count = metric_mgr::metric_count_dynamic(); + CHECK(count == 1); + + metric_mgr::remove_metric_dynamic("test_counter2"); + count = metric_mgr::metric_count_dynamic(); + CHECK(count == 0); + + CHECK_THROWS_AS( + metric_mgr::create_metric_static("test_static_counter", ""), + std::invalid_argument); + + using metric_mgr2 = metric_manager_t<2>; + auto c = + metric_mgr2::create_metric_static("test_static_counter", ""); + auto c2 = + metric_mgr2::create_metric_static("test_static_counter2", ""); + c->inc(); + c2->inc(); + +#ifdef CINATRA_ENABLE_METRIC_JSON + auto s = metric_mgr2::serialize_to_json_static(); + std::cout << s << "\n"; + auto s1 = metric_mgr2::serialize_to_json({c, c2}); + CHECK(s == s1); +#endif + CHECK_THROWS_AS(metric_mgr2::metric_count_dynamic(), std::invalid_argument); + count = metric_mgr2::metric_count_static(); + CHECK(count == 2); + CHECK_THROWS_AS(metric_mgr2::remove_metric_dynamic("test_static_counter"), + std::invalid_argument); + + metric_mgr2::remove_metric_static("test_static_counter"); + count = metric_mgr2::metric_count_static(); + CHECK(count == 1); +} + +TEST_CASE("test filter metrics static") { + using metric_mgr = metric_manager_t<3>; + auto c = metric_mgr::create_metric_static( + "test_static_counter", "", + std::map{{"method", "GET"}}); + auto c2 = metric_mgr::create_metric_static( + "test_static_counter2", "", + std::map{{"url", "/"}}); + c->inc({"GET"}); + c2->inc({"/"}); + + metric_filter_options options; + options.name_regex = ".*counter.*"; + { + auto metrics = metric_mgr::filter_metrics_static(options); + CHECK(metrics.size() == 2); + + auto s = metric_mgr::serialize(metrics); + CHECK(s.find("test_static_counter") != std::string::npos); + std::cout << s << "\n"; + } + + options.label_regex = ".*ur.*"; + { + auto metrics = metric_mgr::filter_metrics_static(options); + CHECK(metrics.size() == 1); + auto s = metric_mgr::serialize(metrics); + CHECK(s.find("test_static_counter2") != std::string::npos); + std::cout << s << "\n"; + } + + options.name_regex = "no_such_name"; + { + auto metrics = metric_mgr::filter_metrics_static(options); + CHECK(metrics.empty()); + auto s = metric_mgr::serialize(metrics); + CHECK(s.empty()); + } + + options = {}; + options.label_regex = "no_such_label"; + { + auto metrics = metric_mgr::filter_metrics_static(options); + CHECK(metrics.empty()); + auto s = metric_mgr::serialize(metrics); + CHECK(s.empty()); + } + + // don't filter + options = {}; + { + auto metrics = metric_mgr::filter_metrics_static(options); + CHECK(metrics.size() == 2); + } + + // black + options.label_regex = ".*ur.*"; + options.is_white = false; + { + auto metrics = metric_mgr::filter_metrics_static(options); + CHECK(metrics.size() == 1); + auto s = metric_mgr::serialize(metrics); + CHECK(s.find("test_static_counter") != std::string::npos); + CHECK(s.find("test_static_counter2") == std::string::npos); + } + + options = {}; + options.label_regex = ".*ur.*"; + options.is_white = false; + { + auto metrics = metric_mgr::filter_metrics_static(options); + CHECK(metrics.size() == 1); + auto s = metric_mgr::serialize(metrics); + CHECK(s.find("test_static_counter") != std::string::npos); + CHECK(s.find("method") != std::string::npos); + CHECK(s.find("test_static_counter2") == std::string::npos); + CHECK(s.find("url") == std::string::npos); + } +} + +TEST_CASE("test filter metrics dynamic") { + using metric_mgr = metric_manager_t<4>; + auto c = metric_mgr::create_metric_dynamic( + "test_dynamic_counter", "", std::vector{{"method"}}); + auto c2 = metric_mgr::create_metric_dynamic( + "test_dynamic_counter2", "", std::vector{{"url"}}); + c->inc({"GET"}); + c->inc({"POST"}); + c2->inc({"/"}); + c2->inc({"/test"}); + + metric_filter_options options; + options.name_regex = ".*counter.*"; + { + auto metrics = metric_mgr::filter_metrics_dynamic(options); + CHECK(metrics.size() == 2); + + auto s = metric_mgr::serialize(metrics); + CHECK(s.find("test_dynamic_counter") != std::string::npos); + std::cout << s << "\n"; + } + + options.label_regex = ".*ur.*"; + { + auto metrics = metric_mgr::filter_metrics_dynamic(options); + CHECK(metrics.size() == 1); + auto s = metric_mgr::serialize(metrics); + CHECK(s.find("test_dynamic_counter2") != std::string::npos); + std::cout << s << "\n"; + } + + options.name_regex = "no_such_name"; + { + auto metrics = metric_mgr::filter_metrics_dynamic(options); + CHECK(metrics.empty()); + auto s = metric_mgr::serialize(metrics); + CHECK(s.empty()); + } + + options = {}; + options.label_regex = "no_such_label"; + { + auto metrics = metric_mgr::filter_metrics_dynamic(options); + CHECK(metrics.empty()); + auto s = metric_mgr::serialize(metrics); + CHECK(s.empty()); + } + + // don't filter + options = {}; + { + auto metrics = metric_mgr::filter_metrics_dynamic(options); + CHECK(metrics.size() == 2); + } + + // black + options.label_regex = ".*ur.*"; + options.is_white = false; + { + auto metrics = metric_mgr::filter_metrics_dynamic(options); + CHECK(metrics.size() == 1); + auto s = metric_mgr::serialize(metrics); + CHECK(s.find("test_dynamic_counter") != std::string::npos); + CHECK(s.find("test_dynamic_counter2") == std::string::npos); + } + + options = {}; + options.label_regex = ".*ur.*"; + options.is_white = false; + { + auto metrics = metric_mgr::filter_metrics_dynamic(options); + CHECK(metrics.size() == 1); + auto s = metric_mgr::serialize(metrics); + CHECK(s.find("test_dynamic_counter") != std::string::npos); + CHECK(s.find("method") != std::string::npos); + CHECK(s.find("test_dynamic_counter2") == std::string::npos); + CHECK(s.find("url") == std::string::npos); + } +} + +TEST_CASE("test get metric by static labels and label") { + using metric_mgr = metric_manager_t<9>; + metric_mgr::create_metric_static( + "http_req_test", "", + std::map{{"method", "GET"}, {"url", "/"}}); + metric_mgr::create_metric_static( + "http_req_test1", "", + std::map{{"method", "POST"}, {"url", "/"}}); + metric_mgr::create_metric_static( + "http_req_test2", "", + std::map{{"method", "GET"}, {"url", "/test"}}); + + auto v = metric_mgr::get_metric_by_labels_static( + std::map{{"method", "GET"}, {"url", "/test"}}); + CHECK(v[0]->name() == "http_req_test2"); + + v = metric_mgr::get_metric_by_labels_static( + std::map{{"method", "GET"}, {"url", "/"}}); + CHECK(v[0]->name() == "http_req_test"); + + auto h1 = metric_mgr::create_metric_static( + "http_req_static_hist", "help", + std::vector{5.23, 10.54, 20.0, 50.0, 100.0}, + std::map{{"method", "GET"}, {"url", "/"}}); + + h1->observe({"GET", "/"}, 23); + + auto s1 = metric_mgr::create_metric_static( + "http_req_static_summary", "help", + summary_t::Quantiles{ + {0.5, 0.05}, {0.9, 0.01}, {0.95, 0.005}, {0.99, 0.001}}, + std::map{{"method", "GET"}, {"url", "/"}}); + s1->observe({"GET", "/"}, 23); + + auto vec = metric_mgr::get_metric_by_label_static({"method", "GET"}); + CHECK(vec.size() == 4); + + vec = metric_mgr::get_metric_by_label_static({"url", "/"}); + CHECK(vec.size() == 4); + + vec = metric_mgr::get_metric_by_label_static({"url", "/test"}); + CHECK(vec.size() == 1); + + vec = metric_mgr::get_metric_by_label_static({"method", "POST"}); + CHECK(vec.size() == 1); + + vec = metric_mgr::get_metric_by_labels_static( + std::map{{"method", "HEAD"}, {"url", "/test"}}); + CHECK(vec.empty()); + + vec = metric_mgr::get_metric_by_labels_static( + std::map{{"method", "GET"}}); + CHECK(vec.empty()); + + vec = metric_mgr::get_metric_by_label_static({"url", "/index"}); + CHECK(vec.empty()); +} + +TEST_CASE("test get metric by dynamic labels") { + using metric_mgr = metric_manager_t<10>; + auto c = metric_mgr::create_metric_dynamic( + "http_req_static", "", std::vector{"method", "code"}); + + auto c1 = metric_mgr::create_metric_dynamic( + "http_req_static1", "", std::vector{"method", "code"}); + + auto c2 = metric_mgr::create_metric_dynamic( + "http_req_static2", "", std::vector{"method", "code"}); + + auto c3 = metric_mgr::create_metric_dynamic( + "http_req_static3", "", std::vector{"method", "code"}); + + c->inc({"POST", "200"}); + c1->inc({"GET", "200"}); + c2->inc({"POST", "301"}); + c3->inc({"POST", "400"}); + + auto c4 = metric_mgr::create_metric_dynamic( + "http_req_static4", "", std::vector{"host", "url"}); + + auto c5 = metric_mgr::create_metric_dynamic( + "http_req_static5", "", std::vector{"host", "url"}); + + c4->inc({"shanghai", "/"}); + c5->inc({"shanghai", "/test"}); + + auto vec = metric_mgr::get_metric_by_labels_dynamic({{"method", "POST"}}); + CHECK(vec.size() == 3); + + vec = metric_mgr::get_metric_by_labels_dynamic({{"method", "GET"}}); + CHECK(vec.size() == 1); + + vec = metric_mgr::get_metric_by_labels_dynamic({{"host", "shanghai"}}); + CHECK(vec.size() == 2); + + vec = metric_mgr::get_metric_by_labels_dynamic({{"url", "/"}}); + CHECK(vec.size() == 1); + + vec = metric_mgr::get_metric_by_labels_dynamic({{"url", "/test"}}); + CHECK(vec.size() == 1); + + vec = metric_mgr::get_metric_by_labels_dynamic({{"url", "/none"}}); + CHECK(vec.size() == 0); + + vec = metric_mgr::get_metric_by_labels_dynamic({{"method", "HEAD"}}); + CHECK(vec.size() == 0); + + auto h1 = metric_mgr::create_metric_dynamic( + "http_req_static_hist", "help", + std::vector{5.23, 10.54, 20.0, 50.0, 100.0}, + std::vector{"method", "url"}); + + h1->observe({"GET", "/"}, 23); + + auto s1 = metric_mgr::create_metric_dynamic( + "http_req_static_summary", "help", + summary_t::Quantiles{ + {0.5, 0.05}, {0.9, 0.01}, {0.95, 0.005}, {0.99, 0.001}}, + std::vector{"method", "url"}); + s1->observe({"GET", "/"}, 23); + + vec = metric_mgr::get_metric_by_labels_dynamic({{"method", "GET"}}); + CHECK(vec.size() >= 2); + + auto str = metric_mgr::serialize(vec); + std::cout << str; + +#ifdef CINATRA_ENABLE_METRIC_JSON + auto json_str = metric_mgr::serialize_to_json(vec); + std::cout << json_str << "\n"; +#endif +} + +TEST_CASE("test histogram serialize with dynamic labels") { + histogram_t h("test", "help", {5.23, 10.54, 20.0, 50.0, 100.0}, + std::vector{"method", "url"}); + h.observe({"GET", "/"}, 23); + auto counts = h.get_bucket_counts(); + CHECK(counts[3]->value({"GET", "/"}) == 1); + h.observe({"GET", "/"}, 42); + CHECK(counts[3]->value({"GET", "/"}) == 2); + h.observe({"GET", "/"}, 60); + CHECK(counts[4]->value({"GET", "/"}) == 1); + h.observe({"GET", "/"}, 120); + CHECK(counts[5]->value({"GET", "/"}) == 1); + h.observe({"GET", "/"}, 1); + CHECK(counts[0]->value({"GET", "/"}) == 1); + + h.observe({"POST", "/"}, 23); + CHECK(counts[3]->value({"POST", "/"}) == 1); + h.observe({"POST", "/"}, 42); + CHECK(counts[3]->value({"POST", "/"}) == 2); + h.observe({"POST", "/"}, 60); + CHECK(counts[4]->value({"POST", "/"}) == 1); + h.observe({"POST", "/"}, 120); + CHECK(counts[5]->value({"POST", "/"}) == 1); + h.observe({"POST", "/"}, 1); + CHECK(counts[0]->value({"POST", "/"}) == 1); + + std::string str; + h.serialize(str); + std::cout << str; + +#ifdef CINATRA_ENABLE_METRIC_JSON + std::string str_json; + h.serialize_to_json(str_json); + std::cout << str_json << "\n"; +#endif +} + +TEST_CASE("test histogram serialize with static labels") { + histogram_t h( + "test", "help", {5.23, 10.54, 20.0, 50.0, 100.0}, + std::map{{"method", "GET"}, {"url", "/"}}); + h.observe({"GET", "/"}, 23); + auto counts = h.get_bucket_counts(); + CHECK(counts[3]->value({"GET", "/"}) == 1); + h.observe({"GET", "/"}, 42); + CHECK(counts[3]->value({"GET", "/"}) == 2); + h.observe({"GET", "/"}, 60); + CHECK(counts[4]->value({"GET", "/"}) == 1); + h.observe({"GET", "/"}, 120); + CHECK(counts[5]->value({"GET", "/"}) == 1); + h.observe({"GET", "/"}, 1); + CHECK(counts[0]->value({"GET", "/"}) == 1); + + std::string str; + h.serialize(str); + std::cout << str; + +#ifdef CINATRA_ENABLE_METRIC_JSON + std::string str_json; + h.serialize_to_json(str_json); + std::cout << str_json << "\n"; +#endif +} + +TEST_CASE("test summary with dynamic labels") { + summary_t summary{"test_summary", + "summary help", + {{0.5, 0.05}, {0.9, 0.01}, {0.95, 0.005}, {0.99, 0.001}}, + std::vector{"method", "url"}}; + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution<> distr(1, 100); + for (int i = 0; i < 50; i++) { + summary.observe({"GET", "/"}, distr(gen)); + summary.observe({"POST", "/test"}, distr(gen)); + } + + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + + double sum; + uint64_t count; + auto rates = async_simple::coro::syncAwait( + summary.get_rates({"GET", "/"}, sum, count)); + std::cout << rates.size() << "\n"; + + std::string str; + async_simple::coro::syncAwait(summary.serialize_async(str)); + std::cout << str; + +#ifdef CINATRA_ENABLE_METRIC_JSON + std::string json_str; + async_simple::coro::syncAwait(summary.serialize_to_json_async(json_str)); + std::cout << json_str << "\n"; +#endif +} + +TEST_CASE("test summary with static labels") { + summary_t summary{ + "test_summary", + "summary help", + {{0.5, 0.05}, {0.9, 0.01}, {0.95, 0.005}, {0.99, 0.001}}, + std::map{{"method", "GET"}, {"url", "/"}}}; + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution<> distr(1, 100); + for (int i = 0; i < 50; i++) { + summary.observe({"GET", "/"}, distr(gen)); + } + + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + + CHECK_THROWS_AS(summary.observe({"POST", "/"}, 1), std::invalid_argument); + + double sum; + uint64_t count; + auto rates = async_simple::coro::syncAwait( + summary.get_rates({"GET", "/"}, sum, count)); + std::cout << rates.size() << "\n"; + + std::string str; + async_simple::coro::syncAwait(summary.serialize_async(str)); + std::cout << str; + +#ifdef CINATRA_ENABLE_METRIC_JSON + std::string json_str; + async_simple::coro::syncAwait(summary.serialize_to_json_async(json_str)); + std::cout << json_str << "\n"; +#endif +} + DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4007) int main(int argc, char** argv) { return doctest::Context(argc, argv).run(); } DOCTEST_MSVC_SUPPRESS_WARNING_POP \ No newline at end of file diff --git a/website/docs/zh/metric/metrict_introduction.md b/website/docs/zh/metric/metrict_introduction.md index 8d1ce4581..a26d75bac 100644 --- a/website/docs/zh/metric/metrict_introduction.md +++ b/website/docs/zh/metric/metrict_introduction.md @@ -148,18 +148,20 @@ some_counter.inc({"GET", "/"}, 1); 构造函数: ```cpp -// 无标签,调用inc时不带标签,如c.inc() +// 无标签,调用inc时不带标签,如c.inc(),调用此函数则metric 为静态标签的metric // name: 指标对象的名称,注册到指标管理器时会使用这个名称 // help: 指标对象的帮助信息 counter_t(std::string name, std::string help); // labels: 静态标签,构造时需要将标签键值都填完整,如:{{"method", "GET"}, {"url", "/"}} +// 调用此函数则metric 为静态标签的metric // 调用inc时必须带静态标签的值,如:c.inc({"GET", "/"}, 1); counter_t(std::string name, std::string help, std::map labels); // labels_name: 动态标签的键名称,因为标签的值是动态的,而键的名称是固定的,所以这里只需要填键名称,如: {"method", "url"} // 调用时inc时必须带动态标签的值,如:c.inc({method, url}, 1); +// 调用此函数则metric 为动态标签的metric counter_t(std::string name, std::string help, std::vector labels_name); ``` @@ -230,12 +232,18 @@ class metric_t { // 获取标签的键,如{"method", "url"} const std::vector& labels_name(); + // 获取静态标签,如{{"method", "GET"}, {"code", "200"}} + const std::map& get_static_labels(); + // 序列化,调用派生类实现序列化 virtual void serialize(std::string& str); // 给summary专用的api,序列化,调用派生类实现序列化 virtual async_simple::coro::Lazy serialize_async(std::string& out); + // 序列化到json + void serialize_to_json(std::string& str); + // 将基类指针向下转换到派生类指针,如: // std::shared_ptr c = std::make_shared("test", "test"); // counter_t* t = c->as(); @@ -302,6 +310,10 @@ struct metric_manager_t { static bool register_metric_static(std::shared_ptr metric); static bool register_metric_dynamic(std::shared_ptr metric); + // 根据metric名称删除metric + static bool remove_metric_static(const std::string& name); + static bool remove_metric_dynamic(const std::string& name); + // 获取注册的所有指标对象 static std::map> metric_map_static(); static std::map> metric_map_dynamic(); @@ -324,9 +336,43 @@ struct metric_manager_t { static std::shared_ptr get_metric_static(const std::string& name); static std::shared_ptr get_metric_dynamic(const std::string& name); + // 根据静态标签获取所有的指标, 如{{"method", "GET"}, {"url", "/"}} + static std::vector> get_metric_by_labels_static( + const std::map& labels); + + // 根据标签值获取所有的静态标签的指标, 如{"method", "GET"} + static std::vector> get_metric_by_label_static( + const std::pair& label); + + // 根据标签值获取所有动态标签的指标, 如{"method", "GET"} + static std::vector> get_metric_by_labels_dynamic( + const std::map& labels); + // 序列化 static async_simple::coro::Lazy serialize_static(); static async_simple::coro::Lazy serialize_dynamic(); + + // 序列化静态标签的指标到json + static std::string serialize_to_json_static(); + // 序列化动态标签的指标到json + static std::string serialize_to_json_dynamic(); + // 序列化metric集合到json + static std::string serialize_to_json( + const std::vector>& metrics); + + // 过滤配置选项,如果name_regex和label_regex都设置了,则会检查这两个条件,如果只设置了一个则只检查设置过的条件 + struct metric_filter_options { + std::optional name_regex{}; // metric 名称的过滤正则表达式 + std::optional label_regex{};// metric label名称的过滤正则表达式 + bool is_white = true; //true: 白名单,包括语义;false: 黑名单,排除语义 + }; + + // 过滤静态标签的指标 + static std::vector> filter_metrics_static( + const metric_filter_options& options); + // 过滤动态标签的指标 + static std::vector> filter_metrics_dynamic( + const metric_filter_options& options); }; using default_metric_manager = metric_manager_t<0>; ``` @@ -347,11 +393,23 @@ using my_metric_manager = metric_manager_t; // 内部还有一个+Inf 默认的桶,当输入的数据不在前面设置这些桶中,则会落到+Inf 默认桶中。 // 实际上桶的总数为 buckets.size() + 1 // 每个bucket 实际上对应了一个counter指标 +// 调用此函数,则metric为静态metric指标 histogram_t(std::string name, std::string help, std::vector buckets); +// labels_value: 标签key,后面可以使用动态标签值去observe,调用此函数则metric为动态metric 指标 +histogram_t(std::string name, std::string help, std::vector buckets, + std::vector labels_name); + +// labels: 静态标签,调用此函数则metric为静态metric指标 +histogram_t(std::string name, std::string help, std::vector buckets, + std::map labels); + // 往histogram_t 中插入数据,内部会自动增加对应桶的计数 void observe(double value); +// 根据标签值插入数据,可以是动态标签值也可以是静态标签值。如果是静态标签,会做额外的检车,检查传入的labels_value是否和注册时的静态标签值是否相同,不相同会抛异常; +void observe(const std::vector &labels_value, double value); + // 获取所有桶对应的counter指标对象 std::vector> get_bucket_counts(); @@ -416,13 +474,28 @@ test_count 3.000000 ```cpp // Quantiles: 百分位和误差, 如:{{0.5, 0.05}, {0.9, 0.01}, {0.95, 0.005}, {0.99, 0.001}} +// 调用此函数则metric为静态metric 指标 summary_t(std::string name, std::string help, Quantiles quantiles); +// labels_name: 标签名,调用此函数则metric为动态metric 指标 +summary_t(std::string name, std::string help, Quantiles quantiles, std::vector labels_name); + +// static_labels:静态标签,调用此函数则metric为静态metric 指标 +summary_t(std::string name, std::string help, Quantiles quantiles, std::map static_labels); + // 往summary_t插入数据,会自动计算百分位的数量 void observe(double value); -// 获取百分位结果 -async_simple::coro::Lazy> get_rates(); +// 根据标签值(动态或静态的标签值,依据构造函数决定是动态还是静态metric),往summary_t插入数据,会自动计算百分位的数量 +void observe(std::vector labels_value, double value); + +// 获取分位数结果, sum 和count +async_simple::coro::Lazy> get_rates(double &sum, + uint64_t &count) +// 根据标签获取分位数结果, sum 和count +async_simple::coro::Lazy> get_rates( + const std::vector &labels_value, double &sum, + uint64_t &count); // 获取总和 async_simple::coro::Lazy get_sum(); From 1f1ba5236e7f3cdc6c0857d2039476006a00dc2f Mon Sep 17 00:00:00 2001 From: qicosmos Date: Wed, 19 Jun 2024 10:05:11 +0800 Subject: [PATCH 10/12] [metric][improve]improve metric (#693) --- include/ylt/coro_io/io_context_pool.hpp | 12 +++ include/ylt/metric/counter.hpp | 35 ++++--- include/ylt/metric/histogram.hpp | 6 +- include/ylt/metric/metric.hpp | 38 +++++-- include/ylt/metric/summary.hpp | 125 ++++++++++++++---------- 5 files changed, 134 insertions(+), 82 deletions(-) diff --git a/include/ylt/coro_io/io_context_pool.hpp b/include/ylt/coro_io/io_context_pool.hpp index 847fa9cfd..9e02e3bbe 100644 --- a/include/ylt/coro_io/io_context_pool.hpp +++ b/include/ylt/coro_io/io_context_pool.hpp @@ -285,6 +285,18 @@ inline T &g_io_context_pool( return *_g_io_context_pool; } +template +inline std::shared_ptr create_io_context_pool( + unsigned pool_size = std::thread::hardware_concurrency()) { + auto pool = std::make_shared(pool_size); + std::thread thrd{[pool] { + pool->run(); + }}; + thrd.detach(); + + return pool; +} + template inline T &g_block_io_context_pool( unsigned pool_size = std::thread::hardware_concurrency()) { diff --git a/include/ylt/metric/counter.hpp b/include/ylt/metric/counter.hpp index 3c339b078..d801722a3 100644 --- a/include/ylt/metric/counter.hpp +++ b/include/ylt/metric/counter.hpp @@ -60,12 +60,8 @@ class counter_t : public metric_t { } } - std::map, double, - std::less>> - value_map() override { - std::map, double, - std::less>> - map; + metric_hash_map value_map() override { + metric_hash_map map; if (use_atomic_) { map = {atomic_value_map_.begin(), atomic_value_map_.end()}; } @@ -192,9 +188,7 @@ class counter_t : public metric_t { } } - std::map, std::atomic, - std::less>> - &atomic_value_map() { + metric_hash_map> &atomic_value_map() { return atomic_value_map_; } @@ -267,7 +261,12 @@ class counter_t : public metric_t { label_val += value; } #else - label_val += value; + if constexpr (is_atomic) { + label_val.fetch_add(value, std::memory_order_relaxed); + } + else { + label_val += value; + } #endif } break; case op_type_t::DEC: @@ -278,9 +277,13 @@ class counter_t : public metric_t { else { label_val -= value; } - #else - label_val -= value; + if constexpr (is_atomic) { + label_val.fetch_sub(value, std::memory_order_relaxed); + } + else { + label_val -= value; + } #endif break; case op_type_t::SET: @@ -289,14 +292,10 @@ class counter_t : public metric_t { } } - std::map, std::atomic, - std::less>> - atomic_value_map_; + metric_hash_map> atomic_value_map_; std::atomic default_lable_value_ = 0; std::mutex mtx_; - std::map, double, - std::less>> - value_map_; + metric_hash_map value_map_; }; } // namespace ylt::metric \ No newline at end of file diff --git a/include/ylt/metric/histogram.hpp b/include/ylt/metric/histogram.hpp index d85225a5b..1f371b853 100644 --- a/include/ylt/metric/histogram.hpp +++ b/include/ylt/metric/histogram.hpp @@ -100,11 +100,7 @@ class histogram_t : public metric_t { auto get_bucket_counts() { return bucket_counts_; } - std::map, double, - std::less>> - value_map() override { - return sum_->value_map(); - } + metric_hash_map value_map() override { return sum_->value_map(); } void serialize(std::string &str) override { if (!sum_->labels_name().empty()) { diff --git a/include/ylt/metric/metric.hpp b/include/ylt/metric/metric.hpp index ea103e59f..12c25c6b0 100644 --- a/include/ylt/metric/metric.hpp +++ b/include/ylt/metric/metric.hpp @@ -14,6 +14,11 @@ #include "async_simple/coro/Lazy.h" #include "async_simple/coro/SyncAwait.h" #include "cinatra/cinatra_log_wrapper.hpp" +#if __has_include("ylt/coro_io/coro_io.hpp") +#include "ylt/coro_io/coro_io.hpp" +#else +#include "cinatra/ylt/coro_io/coro_io.hpp" +#endif #ifdef CINATRA_ENABLE_METRIC_JSON namespace iguana { @@ -42,11 +47,33 @@ struct metric_filter_options { bool is_white = true; }; +struct vector_hash { + size_t operator()(const std::vector& vec) const { + unsigned int seed = 131; + unsigned int hash = 0; + + for (const auto& str : vec) { + for (auto ch : str) { + hash = hash * seed + ch; + } + } + + return (hash & 0x7FFFFFFF); + } +}; + +template +using metric_hash_map = + std::unordered_map, T, vector_hash>; + class metric_t { public: metric_t() = default; metric_t(MetricType type, std::string name, std::string help) - : type_(type), name_(std::move(name)), help_(std::move(help)) {} + : type_(type), + name_(std::move(name)), + help_(std::move(help)), + metric_created_time_(std::chrono::system_clock::now()) {} metric_t(MetricType type, std::string name, std::string help, std::vector labels_name) : metric_t(type, std::move(name), std::move(help)) { @@ -70,6 +97,8 @@ class metric_t { MetricType metric_type() { return type_; } + auto get_created_time() { return metric_created_time_; } + std::string_view metric_name() { switch (type_) { case MetricType::Counter: @@ -92,11 +121,7 @@ class metric_t { return static_labels_; } - virtual std::map, double, - std::less>> - value_map() { - return {}; - } + virtual metric_hash_map value_map() { return {}; } virtual void serialize(std::string& str) {} @@ -173,6 +198,7 @@ class metric_t { std::vector labels_name_; // read only std::vector labels_value_; // read only bool use_atomic_ = false; + std::chrono::system_clock::time_point metric_created_time_{}; }; template diff --git a/include/ylt/metric/summary.hpp b/include/ylt/metric/summary.hpp index bad8a132a..58957bc74 100644 --- a/include/ylt/metric/summary.hpp +++ b/include/ylt/metric/summary.hpp @@ -3,8 +3,11 @@ #include "detail/time_window_quantiles.hpp" #include "metric.hpp" -#include "ylt/coro_io/coro_io.hpp" +#if __has_include("ylt/util/concurrentqueue.h") #include "ylt/util/concurrentqueue.h" +#else +#include "cinatra/ylt/util/concurrentqueue.h" +#endif namespace ylt::metric { #ifdef CINATRA_ENABLE_METRIC_JSON @@ -39,7 +42,6 @@ class summary_t : public metric_t { metric_t(MetricType::Summary, std::move(name), std::move(help)), max_age_(max_age), age_buckets_(age_buckets) { - init_executor(); init_block(block_); block_->quantile_values_ = std::make_shared(quantiles_, max_age, age_buckets); @@ -55,7 +57,6 @@ class summary_t : public metric_t { std::move(labels_name)), max_age_(max_age), age_buckets_(age_buckets) { - init_executor(); init_block(labels_block_); } @@ -68,7 +69,6 @@ class summary_t : public metric_t { std::move(static_labels)), max_age_(max_age), age_buckets_(age_buckets) { - init_executor(); init_block(labels_block_); labels_block_->label_quantile_values_[labels_value_] = std::make_shared(quantiles_, max_age, age_buckets); @@ -85,9 +85,6 @@ class summary_t : public metric_t { if (labels_block_) { labels_block_->stop_ = true; } - - work_ = nullptr; - thd_.join(); } struct block_t { @@ -101,23 +98,27 @@ class summary_t : public metric_t { struct labels_block_t { std::atomic stop_ = false; moodycamel::ConcurrentQueue sample_queue_; - - std::map, std::shared_ptr, - std::less>> + metric_hash_map> label_quantile_values_; - std::map, std::uint64_t, - std::less>> - label_count_; - std::map, double, - std::less>> - label_sum_; + metric_hash_map label_count_; + metric_hash_map label_sum_; }; void observe(double value) { if (!labels_name_.empty()) { throw std::invalid_argument("not a default label metric"); } + if (block_->sample_queue_.size_approx() >= 20000000) { + // TODO: record failed count. + return; + } block_->sample_queue_.enqueue(value); + + bool expected = false; + if (is_coro_started_.compare_exchange_strong(expected, true)) { + start(block_).via(excutor_->get_executor()).start([](auto &&) { + }); + } } void observe(std::vector labels_value, double value) { @@ -129,7 +130,17 @@ class summary_t : public metric_t { throw std::invalid_argument("not equal with static label"); } } + if (labels_block_->sample_queue_.size_approx() >= 20000000) { + // TODO: record failed count. + return; + } labels_block_->sample_queue_.enqueue({std::move(labels_value), value}); + + bool expected = false; + if (is_coro_started_.compare_exchange_strong(expected, true)) { + start(labels_block_).via(excutor_->get_executor()).start([](auto &&) { + }); + } } async_simple::coro::Lazy> get_rates(double &sum, @@ -147,7 +158,7 @@ class summary_t : public metric_t { vec.push_back(block_->quantile_values_->get(quantile.quantile)); } }, - excutor_.get()); + excutor_->get_executor()); co_return vec; } @@ -178,19 +189,17 @@ class summary_t : public metric_t { vec.push_back(it->second->get(quantile.quantile)); } }, - excutor_.get()); + excutor_->get_executor()); co_return vec; } - std::map, double, - std::less>> - value_map() override { + metric_hash_map value_map() override { auto ret = async_simple::coro::syncAwait(coro_io::post( [this] { return labels_block_->label_sum_; }, - excutor_.get())); + excutor_->get_executor())); return ret.value(); } @@ -199,7 +208,7 @@ class summary_t : public metric_t { [this] { return block_->sum_; }, - excutor_.get()); + excutor_->get_executor()); co_return ret.value(); } @@ -208,7 +217,7 @@ class summary_t : public metric_t { [this] { return block_->count_; }, - excutor_.get()); + excutor_->get_executor()); co_return ret.value(); } @@ -275,19 +284,10 @@ class summary_t : public metric_t { } #endif private: - void init_executor() { - work_ = std::make_shared(ctx_); - thd_ = std::thread([this] { - ctx_.run(); - }); - excutor_ = - std::make_unique>(ctx_.get_executor()); - } - template void init_block(std::shared_ptr &block) { block = std::make_shared(); - start(block).via(excutor_.get()).start([](auto &&) { + start(block).via(excutor_->get_executor()).start([](auto &&) { }); } @@ -306,24 +306,34 @@ class summary_t : public metric_t { } } - co_await async_simple::coro::Yield{}; - if (block->sample_queue_.size_approx() == 0) { - co_await coro_io::sleep_for(std::chrono::milliseconds(5), - excutor_.get()); + is_coro_started_ = false; + if (block->sample_queue_.size_approx() == 0) { + break; + } + + bool expected = false; + if (!is_coro_started_.compare_exchange_strong(expected, true)) { + break; + } + + continue; } + + co_await async_simple::coro::Yield{}; } co_return; } - async_simple::coro::Lazy start(std::shared_ptr block) { + async_simple::coro::Lazy start( + std::shared_ptr label_block) { summary_label_sample sample; size_t count = 1000000; - while (!block->stop_) { + while (!label_block->stop_) { size_t index = 0; - while (block->sample_queue_.try_dequeue(sample)) { - auto &ptr = block->label_quantile_values_[sample.labels_value]; + while (label_block->sample_queue_.try_dequeue(sample)) { + auto &ptr = label_block->label_quantile_values_[sample.labels_value]; if (ptr == nullptr) { ptr = std::make_shared(quantiles_, max_age_, @@ -332,8 +342,8 @@ class summary_t : public metric_t { ptr->insert(sample.value); - block->label_count_[sample.labels_value] += 1; - block->label_sum_[sample.labels_value] += sample.value; + label_block->label_count_[sample.labels_value] += 1; + label_block->label_sum_[sample.labels_value] += sample.value; index++; if (index == count) { break; @@ -342,10 +352,20 @@ class summary_t : public metric_t { co_await async_simple::coro::Yield{}; - if (block->sample_queue_.size_approx() == 0) { - co_await coro_io::sleep_for(std::chrono::milliseconds(5), - excutor_.get()); + if (label_block->sample_queue_.size_approx() == 0) { + is_coro_started_ = false; + if (label_block->sample_queue_.size_approx() == 0) { + break; + } + + bool expected = false; + if (!is_coro_started_.compare_exchange_strong(expected, true)) { + break; + } + + continue; } + co_await async_simple::coro::Yield{}; } co_return; @@ -362,7 +382,7 @@ class summary_t : public metric_t { [this] { return labels_block_->label_sum_; }, - excutor_.get()); + excutor_->get_executor()); for (auto &[labels_value, sum_val] : sum_map.value()) { double sum = 0; @@ -403,7 +423,7 @@ class summary_t : public metric_t { [this] { return labels_block_->label_sum_; }, - excutor_.get()); + excutor_->get_executor()); json_summary_t summary{name_, help_, std::string(metric_name())}; @@ -430,11 +450,10 @@ class summary_t : public metric_t { Quantiles quantiles_; // readonly std::shared_ptr block_; std::shared_ptr labels_block_; - std::unique_ptr> excutor_ = nullptr; - std::shared_ptr work_; - asio::io_context ctx_; - std::thread thd_; + static inline std::shared_ptr excutor_ = + coro_io::create_io_context_pool(1); std::chrono::milliseconds max_age_; int age_buckets_; + std::atomic is_coro_started_ = false; }; } // namespace ylt::metric \ No newline at end of file From 8c4680618b32d8ab7d7e8e63cc4b2909acfbb5f5 Mon Sep 17 00:00:00 2001 From: scuzqy <80660355+scuzqy@users.noreply.github.com> Date: Fri, 21 Jun 2024 17:17:46 +0800 Subject: [PATCH 11/12] [struct_pack] update rule for enabling [[likely]] (#696) MSVC intentionally defined __cplusplus to 199711L, ignoring the actual standard, hence MACRO definitions of `SP_LIKELY` and `SP_UNLIKELY` go to wrong branches in MSVC build. --- include/ylt/struct_pack/marco.h | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/include/ylt/struct_pack/marco.h b/include/ylt/struct_pack/marco.h index 546ac6e9e..86d610b68 100644 --- a/include/ylt/struct_pack/marco.h +++ b/include/ylt/struct_pack/marco.h @@ -31,19 +31,14 @@ #define STRUCT_PACK_MAY_INLINE inline #endif -#if __has_cpp_attribute(likely) && __cplusplus >= 202002L +#if __has_cpp_attribute(likely) && __has_cpp_attribute(unlikely) #define SP_LIKELY(expr) (expr) [[likely]] -#elif __GNUC__ -#define SP_LIKELY(expr) (__builtin_expect(!!(expr), 1)) -#else -#define SP_LIKELY(expr) (expr) -#endif - -#if __has_cpp_attribute(unlikely) && __cplusplus >= 202002L #define SP_UNLIKELY(expr) (expr) [[unlikely]] #elif __GNUC__ +#define SP_LIKELY(expr) (__builtin_expect(!!(expr), 1)) #define SP_UNLIKELY(expr) (__builtin_expect(!!(expr), 0)) #else +#define SP_LIKELY(expr) (expr) #define SP_UNLIKELY(expr) (expr) #endif From 6274f8a40a0e8b4c8fbed328b69f05a0750a00eb Mon Sep 17 00:00:00 2001 From: qicosmos Date: Fri, 21 Jun 2024 20:36:44 +0800 Subject: [PATCH 12/12] [metric][feat and fix]add inner metrics (#697) --- include/ylt/metric.hpp | 2 +- include/ylt/metric/counter.hpp | 54 +-- include/ylt/metric/gauge.hpp | 1 + include/ylt/metric/histogram.hpp | 45 ++- include/ylt/metric/metric.hpp | 57 ++- include/ylt/metric/summary.hpp | 4 +- include/ylt/metric/system_metric.hpp | 339 ++++++++++++++++++ .../standalone/cinatra/coro_http_server.hpp | 13 +- src/metric/tests/test_metric.cpp | 214 ++++++++++- .../docs/zh/metric/metrict_introduction.md | 47 ++- 10 files changed, 725 insertions(+), 51 deletions(-) create mode 100644 include/ylt/metric/system_metric.hpp diff --git a/include/ylt/metric.hpp b/include/ylt/metric.hpp index 89279894d..108113e76 100644 --- a/include/ylt/metric.hpp +++ b/include/ylt/metric.hpp @@ -17,6 +17,6 @@ #define CINATRA_ENABLE_METRIC_JSON #include "metric/gauge.hpp" #include "metric/histogram.hpp" -#include "metric/metric.hpp" #include "metric/summary.hpp" +#include "metric/system_metric.hpp" #include "ylt/struct_json/json_writer.h" diff --git a/include/ylt/metric/counter.hpp b/include/ylt/metric/counter.hpp index d801722a3..48fbaf824 100644 --- a/include/ylt/metric/counter.hpp +++ b/include/ylt/metric/counter.hpp @@ -28,6 +28,7 @@ class counter_t : public metric_t { counter_t(std::string name, std::string help) : metric_t(MetricType::Counter, std::move(name), std::move(help)) { use_atomic_ = true; + g_user_metric_count++; } // static labels value, contains a map with atomic value. @@ -36,6 +37,7 @@ class counter_t : public metric_t { : metric_t(MetricType::Counter, std::move(name), std::move(help), std::move(labels)) { atomic_value_map_.emplace(labels_value_, 0); + g_user_metric_count++; use_atomic_ = true; } @@ -43,9 +45,11 @@ class counter_t : public metric_t { counter_t(std::string name, std::string help, std::vector labels_name) : metric_t(MetricType::Counter, std::move(name), std::move(help), - std::move(labels_name)) {} + std::move(labels_name)) { + g_user_metric_count++; + } - virtual ~counter_t() {} + virtual ~counter_t() { g_user_metric_count--; } double value() { return default_lable_value_; } @@ -82,20 +86,16 @@ class counter_t : public metric_t { return; } - serialize_head(str); - std::string s; - if (use_atomic_) { - serialize_map(atomic_value_map_, s); - } - else { - serialize_map(value_map_, s); + auto map = value_map(); + if (map.empty()) { + return; } - if (s.empty()) { - str.clear(); - } - else { - str.append(s); + std::string value_str; + serialize_map(map, value_str); + if (!value_str.empty()) { + serialize_head(str); + str.append(value_str); } } @@ -113,18 +113,17 @@ class counter_t : public metric_t { return; } + auto map = value_map(); json_counter_t counter{name_, help_, std::string(metric_name())}; - if (use_atomic_) { - to_json(counter, atomic_value_map_, str); - } - else { - to_json(counter, value_map_, str); - } + to_json(counter, map, str); } template void to_json(json_counter_t &counter, T &map, std::string &str) { for (auto &[k, v] : map) { + if (v == 0) { + continue; + } json_counter_metric_t metric; size_t index = 0; for (auto &label_value : k) { @@ -133,7 +132,9 @@ class counter_t : public metric_t { metric.value = (int64_t)v; counter.metrics.push_back(std::move(metric)); } - iguana::to_json(counter, str); + if (!counter.metrics.empty()) { + iguana::to_json(counter, str); + } } #endif @@ -164,10 +165,21 @@ class counter_t : public metric_t { } else { std::lock_guard lock(mtx_); + stat_metric(labels_value); set_value(value_map_[labels_value], value, op_type_t::INC); } } + void stat_metric(const std::vector &labels_value) { + if (!value_map_.contains(labels_value)) { + for (auto &key : labels_value) { + g_user_metric_memory->inc(key.size()); + } + g_user_metric_memory->inc(8); + g_user_metric_labels->inc(); + } + } + void update(double value) { default_lable_value_ = value; } void update(const std::vector &labels_value, double value) { diff --git a/include/ylt/metric/gauge.hpp b/include/ylt/metric/gauge.hpp index 18693f1af..8ab33f143 100644 --- a/include/ylt/metric/gauge.hpp +++ b/include/ylt/metric/gauge.hpp @@ -45,6 +45,7 @@ class gauge_t : public counter_t { } else { std::lock_guard lock(mtx_); + stat_metric(labels_value); set_value(value_map_[labels_value], value, op_type_t::DEC); } } diff --git a/include/ylt/metric/histogram.hpp b/include/ylt/metric/histogram.hpp index 1f371b853..a15a350ed 100644 --- a/include/ylt/metric/histogram.hpp +++ b/include/ylt/metric/histogram.hpp @@ -108,6 +108,10 @@ class histogram_t : public metric_t { return; } + if (sum_->value() == 0) { + return; + } + serialize_head(str); double count = 0; auto bucket_counts = get_bucket_counts(); @@ -146,6 +150,10 @@ class histogram_t : public metric_t { return; } + if (sum_->value() == 0) { + return; + } + json_histogram_t hist{name_, help_, std::string(metric_name())}; double count = 0; @@ -183,11 +191,13 @@ class histogram_t : public metric_t { } void serialize_with_labels(std::string &str) { - serialize_head(str); + auto value_map = sum_->value_map(); + if (value_map.empty()) { + return; + } + std::string value_str; auto bucket_counts = get_bucket_counts(); - - auto value_map = sum_->value_map(); for (auto &[labels_value, value] : value_map) { if (value == 0) { continue; @@ -196,24 +206,31 @@ class histogram_t : public metric_t { double count = 0; for (size_t i = 0; i < bucket_counts.size(); i++) { auto counter = bucket_counts[i]; - str.append(name_).append("_bucket{"); + value_str.append(name_).append("_bucket{"); build_label_string(str, sum_->labels_name(), labels_value); - str.append(","); + value_str.append(","); if (i == bucket_boundaries_.size()) { - str.append("le=\"").append("+Inf").append("\"} "); + value_str.append("le=\"").append("+Inf").append("\"} "); } else { - str.append("le=\"") + value_str.append("le=\"") .append(std::to_string(bucket_boundaries_[i])) .append("\"} "); } count += counter->value(labels_value); - str.append(std::to_string(count)); - str.append("\n"); + value_str.append(std::to_string(count)); + value_str.append("\n"); + } + + if (value_str.empty()) { + return; } + serialize_head(str); + str.append(value_str); + str.append(name_); str.append("_sum{"); build_label_string(str, sum_->labels_name(), labels_value); @@ -237,10 +254,14 @@ class histogram_t : public metric_t { #ifdef CINATRA_ENABLE_METRIC_JSON void serialize_to_json_with_labels(std::string &str) { + auto value_map = sum_->value_map(); + if (value_map.empty()) { + return; + } + json_histogram_t hist{name_, help_, std::string(metric_name())}; auto bucket_counts = get_bucket_counts(); - auto value_map = sum_->value_map(); for (auto &[labels_value, value] : value_map) { if (value == 0) { continue; @@ -272,7 +293,9 @@ class histogram_t : public metric_t { hist.metrics.push_back(std::move(metric)); } - iguana::to_json(hist, str); + if (!hist.metrics.empty()) { + iguana::to_json(hist, str); + } } #endif diff --git a/include/ylt/metric/metric.hpp b/include/ylt/metric/metric.hpp index 12c25c6b0..73424c094 100644 --- a/include/ylt/metric/metric.hpp +++ b/include/ylt/metric/metric.hpp @@ -201,7 +201,22 @@ class metric_t { std::chrono::system_clock::time_point metric_created_time_{}; }; -template +template +struct metric_manager_t; + +struct ylt_system_tag_t {}; +using system_metric_manager = metric_manager_t; + +class counter_t; +inline auto g_user_metric_memory = + std::make_shared("ylt_user_metric_memory", ""); +inline auto g_user_metric_labels = + std::make_shared("ylt_user_metric_labels", ""); +inline auto g_summary_failed_count = + std::make_shared("ylt_summary_failed_count", ""); +inline std::atomic g_user_metric_count = 0; + +template struct metric_manager_t { struct null_mutex_t { void lock() {} @@ -263,6 +278,15 @@ struct metric_manager_t { return r; } + static auto get_metrics() { + if (need_lock_) { + return collect(); + } + else { + return collect(); + } + } + static auto metric_map_static() { return metric_map_impl(); } static auto metric_map_dynamic() { return metric_map_impl(); } @@ -580,5 +604,34 @@ struct metric_manager_t { static inline std::once_flag flag_; }; -using default_metric_manager = metric_manager_t<0>; +struct ylt_default_metric_tag_t {}; +using default_metric_manager = metric_manager_t; + +template +struct metric_collector_t { + static std::string serialize() { + auto vec = get_all_metrics(); + return default_metric_manager::serialize(vec); + } + +#ifdef CINATRA_ENABLE_METRIC_JSON + static std::string serialize_to_json() { + auto vec = get_all_metrics(); + return default_metric_manager::serialize_to_json(vec); + } +#endif + + static std::vector> get_all_metrics() { + std::vector> vec; + (append_vector(vec), ...); + return vec; + } + + private: + template + static void append_vector(std::vector>& vec) { + auto v = T::get_metrics(); + vec.insert(vec.end(), v.begin(), v.end()); + } +}; } // namespace ylt::metric \ No newline at end of file diff --git a/include/ylt/metric/summary.hpp b/include/ylt/metric/summary.hpp index 58957bc74..cf58b9cc5 100644 --- a/include/ylt/metric/summary.hpp +++ b/include/ylt/metric/summary.hpp @@ -109,7 +109,7 @@ class summary_t : public metric_t { throw std::invalid_argument("not a default label metric"); } if (block_->sample_queue_.size_approx() >= 20000000) { - // TODO: record failed count. + g_summary_failed_count->inc(); return; } block_->sample_queue_.enqueue(value); @@ -131,7 +131,7 @@ class summary_t : public metric_t { } } if (labels_block_->sample_queue_.size_approx() >= 20000000) { - // TODO: record failed count. + g_summary_failed_count->inc(); return; } labels_block_->sample_queue_.enqueue({std::move(labels_value), value}); diff --git a/include/ylt/metric/system_metric.hpp b/include/ylt/metric/system_metric.hpp new file mode 100644 index 000000000..81d1e1b40 --- /dev/null +++ b/include/ylt/metric/system_metric.hpp @@ -0,0 +1,339 @@ +#pragma once +#if defined(__GNUC__) +#include +#include + +#include +#include +#include +#include +#include +#include + +#if __has_include("ylt/coro_io/coro_io.hpp") +#include "ylt/coro_io/coro_io.hpp" +#include "ylt/coro_io/io_context_pool.hpp" +#include "ylt/metric/counter.hpp" +#include "ylt/metric/gauge.hpp" +#include "ylt/metric/metric.hpp" +#else +#include "cinatra/ylt/coro_io/coro_io.hpp" +#include "cinatra/ylt/coro_io/io_context_pool.hpp" +#include "cinatra/ylt/metric/counter.hpp" +#include "cinatra/ylt/metric/gauge.hpp" +#include "cinatra/ylt/metric/metric.hpp" +#endif + +// reference: brpc/src/bvar/default_variables.cpp + +namespace ylt::metric { +namespace detail { + +inline int64_t last_time_us = 0; +inline int64_t last_sys_time_us = 0; +inline int64_t last_user_time_us = 0; + +inline int64_t gettimeofday_us() { + timeval now; + gettimeofday(&now, NULL); + return now.tv_sec * 1000000L + now.tv_usec; +} + +inline int64_t timeval_to_microseconds(const timeval &tv) { + return tv.tv_sec * 1000000L + tv.tv_usec; +} + +inline void stat_cpu() { + static auto process_cpu_usage = + system_metric_manager::get_metric_static( + "ylt_process_cpu_usage"); + static auto process_cpu_usage_system = + system_metric_manager::get_metric_static( + "ylt_process_cpu_usage_system"); + static auto process_cpu_usage_user = + system_metric_manager::get_metric_static( + "ylt_process_cpu_usage_user"); + + rusage usage{}; + getrusage(RUSAGE_SELF, &usage); + int64_t utime = timeval_to_microseconds(usage.ru_utime); + int64_t stime = timeval_to_microseconds(usage.ru_stime); + int64_t time_total = utime + stime; + int64_t now = gettimeofday_us(); + if (last_time_us == 0) { + last_time_us = now; + last_sys_time_us = stime; + last_user_time_us = utime; + return; + } + + int64_t elapsed = now - last_time_us; + if (elapsed == 0) { + return; + } + + double cpu_usage = + double(time_total - (last_sys_time_us + last_user_time_us)) / + (now - last_time_us); + double sys_cpu_usage = + double(stime - last_sys_time_us) / (now - last_time_us); + double usr_cpu_usage = + double(utime - last_user_time_us) / (now - last_time_us); + process_cpu_usage->update(cpu_usage); + process_cpu_usage_system->update(sys_cpu_usage); + process_cpu_usage_user->update(usr_cpu_usage); + + last_time_us = now; + last_sys_time_us = stime; + last_user_time_us = utime; +} + +inline void stat_memory() { + static auto process_memory_virtual = + system_metric_manager::get_metric_static( + "ylt_process_memory_virtual"); + static auto process_memory_resident = + system_metric_manager::get_metric_static( + "ylt_process_memory_resident"); + static auto process_memory_shared = + system_metric_manager::get_metric_static( + "ylt_process_memory_shared"); + long virtual_size = 0; + long resident = 0; + long share = 0; + std::ifstream file("/proc/self/statm"); + if (!file) { + return; + } + + file >> virtual_size >> resident >> share; + static long page_size = sysconf(_SC_PAGE_SIZE); + + process_memory_virtual->update(virtual_size); + process_memory_resident->update(resident * page_size); + process_memory_shared->update(share * page_size); +} + +struct ProcIO { + size_t rchar; + size_t wchar; + size_t syscr; + size_t syscw; + size_t read_bytes; + size_t write_bytes; + size_t cancelled_write_bytes; +}; + +inline void stat_io() { + static auto process_io_read_bytes_second = + system_metric_manager::get_metric_static( + "ylt_process_io_read_bytes_second"); + static auto process_io_write_bytes_second = + system_metric_manager::get_metric_static( + "ylt_process_io_write_bytes_second"); + static auto process_io_read_second = + system_metric_manager::get_metric_static( + "ylt_process_io_read_second"); + static auto process_io_write_second = + system_metric_manager::get_metric_static( + "ylt_process_io_write_second"); + + auto stream_file = + std::shared_ptr(fopen("/proc/self/io", "r"), [](FILE *ptr) { + fclose(ptr); + }); + if (stream_file == nullptr) { + return; + } + + ProcIO s{}; + if (fscanf(stream_file.get(), + "%*s %lu %*s %lu %*s %lu %*s %lu %*s %lu %*s %lu %*s %lu", + &s.rchar, &s.wchar, &s.syscr, &s.syscw, &s.read_bytes, + &s.write_bytes, &s.cancelled_write_bytes) != 7) { + return; + } + + process_io_read_bytes_second->update(s.rchar); + process_io_write_bytes_second->update(s.wchar); + process_io_read_second->update(s.syscr); + process_io_write_second->update(s.syscw); +} + +inline void stat_avg_load() { + static auto system_loadavg_1m = + system_metric_manager::get_metric_static( + "ylt_system_loadavg_1m"); + static auto system_loadavg_5m = + system_metric_manager::get_metric_static( + "ylt_system_loadavg_5m"); + static auto system_loadavg_15m = + system_metric_manager::get_metric_static( + "ylt_system_loadavg_15m"); + std::ifstream file("/proc/loadavg"); + if (!file) { + return; + } + + double loadavg_1m = 0; + double loadavg_5m = 0; + double loadavg_15m = 0; + file >> loadavg_1m >> loadavg_5m >> loadavg_15m; + system_loadavg_1m->update(loadavg_1m); + system_loadavg_1m->update(loadavg_5m); + system_loadavg_1m->update(loadavg_15m); +} + +struct ProcStat { + int pid; + // std::string comm; + char state; + int ppid; + int pgrp; + int session; + int tty_nr; + int tpgid; + unsigned flags; + unsigned long minflt; + unsigned long cminflt; + unsigned long majflt; + unsigned long cmajflt; + unsigned long utime; + unsigned long stime; + unsigned long cutime; + unsigned long cstime; + long priority; + long nice; + long num_threads; +}; + +inline void process_status() { + static auto process_uptime = + system_metric_manager::get_metric_static("ylt_process_uptime"); + static auto process_priority = + system_metric_manager::get_metric_static("ylt_process_priority"); + static auto pid = + system_metric_manager::get_metric_static("ylt_pid"); + static auto ppid = + system_metric_manager::get_metric_static("ylt_ppid"); + static auto pgrp = + system_metric_manager::get_metric_static("ylt_pgrp"); + static auto thread_count = + system_metric_manager::get_metric_static("ylt_thread_count"); + + auto stream_file = + std::shared_ptr(fopen("/proc/self/stat", "r"), [](FILE *ptr) { + fclose(ptr); + }); + if (stream_file == nullptr) { + return; + } + + ProcStat stat{}; + if (fscanf(stream_file.get(), + "%d %*s %c " + "%d %d %d %d %d " + "%u %lu %lu %lu " + "%lu %lu %lu %lu %lu " + "%ld %ld %ld", + &stat.pid, &stat.state, &stat.ppid, &stat.pgrp, &stat.session, + &stat.tty_nr, &stat.tpgid, &stat.flags, &stat.minflt, + &stat.cminflt, &stat.majflt, &stat.cmajflt, &stat.utime, + &stat.stime, &stat.cutime, &stat.cstime, &stat.priority, + &stat.nice, &stat.num_threads) != 19) { + return; + } + + process_uptime->inc(); + process_priority->update(stat.priority); + pid->update(stat.pid); + ppid->update(stat.ppid); + pgrp->update(stat.pgrp); + thread_count->update(stat.num_threads); +} + +inline void stat_metric() { + static auto user_metric_count = + system_metric_manager::get_metric_static( + "ylt_user_metric_count"); + user_metric_count->update(g_user_metric_count); +} + +inline void ylt_stat() { + stat_cpu(); + stat_memory(); + stat_io(); + stat_avg_load(); + process_status(); + stat_metric(); +} + +inline void start_stat(std::shared_ptr timer) { + timer->expires_after(std::chrono::seconds(1)); + timer->async_wait([timer](std::error_code ec) { + if (ec) { + return; + } + + ylt_stat(); + start_stat(timer); + }); +} +} // namespace detail + +inline bool start_system_metric() { + system_metric_manager::create_metric_static("ylt_process_cpu_usage", + ""); + system_metric_manager::create_metric_static( + "ylt_process_cpu_usage_system", ""); + system_metric_manager::create_metric_static( + "ylt_process_cpu_usage_user", ""); + + system_metric_manager::create_metric_static( + "ylt_process_memory_virtual", ""); + system_metric_manager::create_metric_static( + "ylt_process_memory_resident", ""); + system_metric_manager::create_metric_static( + "ylt_process_memory_shared", ""); + + system_metric_manager::create_metric_static("ylt_process_uptime", + ""); + system_metric_manager::create_metric_static("ylt_pid", ""); + system_metric_manager::create_metric_static("ylt_ppid", ""); + system_metric_manager::create_metric_static("ylt_pgrp", ""); + system_metric_manager::create_metric_static("ylt_thread_count", ""); + system_metric_manager::create_metric_static("ylt_process_priority", + ""); + + system_metric_manager::create_metric_static("ylt_user_metric_count", + ""); + + system_metric_manager::create_metric_static("ylt_system_loadavg_1m", + ""); + system_metric_manager::create_metric_static("ylt_system_loadavg_5m", + ""); + system_metric_manager::create_metric_static("ylt_system_loadavg_15m", + ""); + + system_metric_manager::create_metric_static( + "ylt_process_io_read_bytes_second", ""); + system_metric_manager::create_metric_static( + "ylt_process_io_write_bytes_second", ""); + system_metric_manager::create_metric_static( + "ylt_process_io_read_second", ""); + system_metric_manager::create_metric_static( + "ylt_process_io_write_second", ""); + + system_metric_manager::register_metric_static(g_user_metric_memory); + system_metric_manager::register_metric_static(g_user_metric_labels); + system_metric_manager::register_metric_static(g_summary_failed_count); + + static auto exucutor = coro_io::create_io_context_pool(1); + auto timer = + std::make_shared(exucutor->get_executor()); + detail::start_stat(timer); + + return true; +} +} // namespace ylt::metric +#endif \ No newline at end of file diff --git a/include/ylt/standalone/cinatra/coro_http_server.hpp b/include/ylt/standalone/cinatra/coro_http_server.hpp index 17a057fdb..d34050e17 100644 --- a/include/ylt/standalone/cinatra/coro_http_server.hpp +++ b/include/ylt/standalone/cinatra/coro_http_server.hpp @@ -11,7 +11,7 @@ #include "ylt/coro_io/coro_file.hpp" #include "ylt/coro_io/coro_io.hpp" #include "ylt/coro_io/io_context_pool.hpp" -#include "ylt/metric/metric.hpp" +#include "ylt/metric/system_metric.hpp" namespace cinatra { enum class file_resp_format_type { @@ -185,19 +185,21 @@ class coro_http_server { void use_metrics(bool enable_json = false, std::string url_path = "/metrics") { init_metrics(); + using root = + ylt::metric::metric_collector_t; set_http_handler( url_path, [enable_json](coro_http_request &req, coro_http_response &res) { std::string str; #ifdef CINATRA_ENABLE_METRIC_JSON if (enable_json) { - str = - ylt::metric::default_metric_manager::serialize_to_json_static(); + str = root::serialize_to_json(); res.set_content_type(); } else #endif - str = ylt::metric::default_metric_manager::serialize_static(); + str = root::serialize(); res.set_status_and_content(status_type::ok, std::move(str)); }); @@ -930,6 +932,9 @@ class coro_http_server { default_metric_manager::create_metric_static( cinatra_metric_conf::server_read_latency, "", std::vector{3, 5, 7, 9, 13, 18, 23, 35, 50}); +#if defined(__GNUC__) + ylt::metric::start_system_metric(); +#endif } private: diff --git a/src/metric/tests/test_metric.cpp b/src/metric/tests/test_metric.cpp index 5608460c8..6242e285d 100644 --- a/src/metric/tests/test_metric.cpp +++ b/src/metric/tests/test_metric.cpp @@ -303,8 +303,11 @@ TEST_CASE("test register metric") { } } +template +struct test_id_t {}; + TEST_CASE("test remove metric and serialize metrics") { - using metric_mgr = metric_manager_t<1>; + using metric_mgr = metric_manager_t>; metric_mgr::create_metric_dynamic("test_counter", ""); metric_mgr::create_metric_dynamic("test_counter2", ""); @@ -323,7 +326,7 @@ TEST_CASE("test remove metric and serialize metrics") { metric_mgr::create_metric_static("test_static_counter", ""), std::invalid_argument); - using metric_mgr2 = metric_manager_t<2>; + using metric_mgr2 = metric_manager_t>; auto c = metric_mgr2::create_metric_static("test_static_counter", ""); auto c2 = @@ -349,7 +352,7 @@ TEST_CASE("test remove metric and serialize metrics") { } TEST_CASE("test filter metrics static") { - using metric_mgr = metric_manager_t<3>; + using metric_mgr = metric_manager_t>; auto c = metric_mgr::create_metric_static( "test_static_counter", "", std::map{{"method", "GET"}}); @@ -429,7 +432,7 @@ TEST_CASE("test filter metrics static") { } TEST_CASE("test filter metrics dynamic") { - using metric_mgr = metric_manager_t<4>; + using metric_mgr = metric_manager_t>; auto c = metric_mgr::create_metric_dynamic( "test_dynamic_counter", "", std::vector{{"method"}}); auto c2 = metric_mgr::create_metric_dynamic( @@ -509,7 +512,7 @@ TEST_CASE("test filter metrics dynamic") { } TEST_CASE("test get metric by static labels and label") { - using metric_mgr = metric_manager_t<9>; + using metric_mgr = metric_manager_t>; metric_mgr::create_metric_static( "http_req_test", "", std::map{{"method", "GET"}, {"url", "/"}}); @@ -567,7 +570,7 @@ TEST_CASE("test get metric by static labels and label") { } TEST_CASE("test get metric by dynamic labels") { - using metric_mgr = metric_manager_t<10>; + using metric_mgr = metric_manager_t>; auto c = metric_mgr::create_metric_dynamic( "http_req_static", "", std::vector{"method", "code"}); @@ -771,6 +774,205 @@ TEST_CASE("test summary with static labels") { #endif } +TEST_CASE("test serialize with emptry metrics") { + std::string s1; + + auto h1 = std::make_shared( + "get_count2", "help", std::vector{5.23, 10.54, 20.0, 50.0, 100.0}, + std::vector{"method"}); + h1->serialize(s1); + CHECK(s1.empty()); +#ifdef CINATRA_ENABLE_METRIC_JSON + h1->serialize_to_json(s1); + CHECK(s1.empty()); +#endif + + auto h2 = std::make_shared( + "get_count2", "help", + std::vector{5.23, 10.54, 20.0, 50.0, 100.0}); + h2->serialize(s1); + CHECK(s1.empty()); +#ifdef CINATRA_ENABLE_METRIC_JSON + h2->serialize_to_json(s1); + CHECK(s1.empty()); +#endif + + auto h3 = std::make_shared( + "get_count2", "help", std::vector{5.23, 10.54, 20.0, 50.0, 100.0}, + std::map{{"method", "/"}}); + h3->serialize(s1); + CHECK(s1.empty()); +#ifdef CINATRA_ENABLE_METRIC_JSON + h3->serialize_to_json(s1); + CHECK(s1.empty()); +#endif + + auto c1 = std::make_shared(std::string("get_count"), + std::string("get counter")); + c1->serialize(s1); + CHECK(s1.empty()); +#ifdef CINATRA_ENABLE_METRIC_JSON + c1->serialize_to_json(s1); + CHECK(s1.empty()); +#endif + + auto c2 = std::make_shared( + std::string("get_count"), std::string("get counter"), + std::map{{"method", "GET"}}); + c2->serialize(s1); + CHECK(s1.empty()); +#ifdef CINATRA_ENABLE_METRIC_JSON + c2->serialize_to_json(s1); + CHECK(s1.empty()); +#endif + + auto c3 = std::make_shared(std::string("get_count"), + std::string("get counter"), + std::vector{"method"}); + c3->serialize(s1); + CHECK(s1.empty()); +#ifdef CINATRA_ENABLE_METRIC_JSON + c3->serialize_to_json(s1); + CHECK(s1.empty()); +#endif + + { + std::string str; + h1->observe({"POST"}, 1); + h1->serialize(str); + CHECK(!str.empty()); + str.clear(); +#ifdef CINATRA_ENABLE_METRIC_JSON + h1->serialize_to_json(str); + CHECK(!str.empty()); +#endif + } + + { + std::string str; + h2->observe(1); + h2->serialize(str); + CHECK(!str.empty()); + str.clear(); +#ifdef CINATRA_ENABLE_METRIC_JSON + h1->serialize_to_json(str); + CHECK(!str.empty()); +#endif + } + + { + std::string str; + c1->inc(); + c1->serialize(str); + CHECK(!str.empty()); + str.clear(); +#ifdef CINATRA_ENABLE_METRIC_JSON + c1->serialize_to_json(str); + CHECK(!str.empty()); +#endif + } + + { + std::string str; + c2->inc({"GET"}); + c2->serialize(str); + CHECK(!str.empty()); + str.clear(); +#ifdef CINATRA_ENABLE_METRIC_JSON + c2->serialize_to_json(str); + CHECK(!str.empty()); +#endif + } + + { + std::string str; + c3->inc({"GET"}); + c3->serialize(str); + CHECK(!str.empty()); + str.clear(); +#ifdef CINATRA_ENABLE_METRIC_JSON + c3->serialize_to_json(str); + CHECK(!str.empty()); +#endif + } +} + +TEST_CASE("test serialize with multiple threads") { + auto c = std::make_shared(std::string("get_count"), + std::string("get counter"), + std::vector{"method"}); + auto g = std::make_shared(std::string("get_count1"), + std::string("get counter"), + std::vector{"method"}); + + auto h1 = std::make_shared( + "get_count2", "help", std::vector{5.23, 10.54, 20.0, 50.0, 100.0}, + std::vector{"method"}); + + auto c1 = std::make_shared(std::string("get_count3"), + std::string("get counter"), + std::vector{"method"}); + + using test_metric_manager = metric_manager_t>; + + test_metric_manager::register_metric_dynamic(c, g, h1, c1); + + c->inc({"POST"}, 1); + g->inc({"GET"}, 1); + h1->observe({"HEAD"}, 1); + + auto s = test_metric_manager::serialize_dynamic(); + std::cout << s; + CHECK(!s.empty()); + CHECK(s.find("get_count") != std::string::npos); + CHECK(s.find("get_count1") != std::string::npos); + CHECK(s.find("get_count2") != std::string::npos); + CHECK(s.find("get_count3") == std::string::npos); + +#ifdef CINATRA_ENABLE_METRIC_JSON + auto json = test_metric_manager::serialize_to_json_dynamic(); + std::cout << json << "\n"; + CHECK(!json.empty()); + CHECK(json.find("get_count") != std::string::npos); + CHECK(json.find("get_count1") != std::string::npos); + CHECK(json.find("get_count2") != std::string::npos); +#endif +} + +#if defined(__GNUC__) +TEST_CASE("test system metric") { + start_system_metric(); + detail::ylt_stat(); + + auto s = system_metric_manager::serialize_static(); + std::cout << s; + CHECK(!s.empty()); + +#ifdef CINATRA_ENABLE_METRIC_JSON + auto json = system_metric_manager::serialize_to_json_static(); + std::cout << json << "\n"; + CHECK(!json.empty()); +#endif + + using metric_manager = metric_manager_t>; + auto c = metric_manager::create_metric_dynamic("test_qps", ""); + c->inc(42); + using root = metric_collector_t; + s.clear(); + s = root::serialize(); + std::cout << s; + CHECK(!s.empty()); + +#ifdef CINATRA_ENABLE_METRIC_JSON + json.clear(); + json = root::serialize_to_json(); + std::cout << json << "\n"; + CHECK(!json.empty()); +#endif +} +#endif + DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4007) int main(int argc, char** argv) { return doctest::Context(argc, argv).run(); } DOCTEST_MSVC_SUPPRESS_WARNING_POP \ No newline at end of file diff --git a/website/docs/zh/metric/metrict_introduction.md b/website/docs/zh/metric/metrict_introduction.md index a26d75bac..e7b9cdb1f 100644 --- a/website/docs/zh/metric/metrict_introduction.md +++ b/website/docs/zh/metric/metrict_introduction.md @@ -295,7 +295,7 @@ CHECK(m1->as()->value() == 1); 指标管理器的api ```cpp -template +template struct metric_manager_t { // 创建并注册指标,返回注册的指标对象 template @@ -326,6 +326,9 @@ struct metric_manager_t { static std::vector metric_keys_static(); static std::vector metric_keys_dynamic(); + // 获取管理器的所有指标 + static std::shared_ptr get_metrics(); + // 根据名称获取指标对象,T为具体指标的类型,如 get_metric_static(); // 如果找不到则返回nullptr template @@ -374,13 +377,49 @@ struct metric_manager_t { static std::vector> filter_metrics_dynamic( const metric_filter_options& options); }; -using default_metric_manager = metric_manager_t<0>; + +struct ylt_default_metric_tag_t {}; +using default_metric_manager = metric_manager_t; ``` metric_manager_t默认为default_metric_manager,如果希望有多个metric manager,用户可以自定义新的metric manager,如: ```cpp -constexpr size_t metric_id = 100; -using my_metric_manager = metric_manager_t; +struct my_tag{}; +using my_metric_manager = metric_manager_t; +``` + +# system_metric_manager +系统metric 管理器,需要调用ylt::metric::start_system_metric(),内部会每秒钟采集系统指标,系统指标: +有进程的cpu,内存,io,平均负载,线程数,指标的指标等指标。 + +指标的指标: +- 总的metric数量 +- 总的label数量 +- metric的内存大小 +- summary失败的数量 + + +# metric_collector_t +metric_collector_t 集中管理所有的metric_manager,如 +```cpp +template +struct metric_collector_t { + // 序列化所有指标管理器中的指标 + static std::string serialize(); + + // 序列化所有指标管理器中的指标为json + static std::string serialize_to_json(); + + // 获取所有指标管理器中的指标 + static std::vector> get_all_metrics(); +}; +``` + +使用metric_collector_t,将所有的指标管理器作为参数传入: +```cpp +using root_manager = metric_collector_t; + +std::string str = root_manager::serialize(); ``` # histogram