From 832eedffcc1df75bab64cb312a5f9983030cf2f2 Mon Sep 17 00:00:00 2001 From: moonfloww Date: Wed, 29 Apr 2026 12:14:49 +0200 Subject: [PATCH 1/4] TSC Clock + Benchmark Methodology Fixes --- benchmark/bench_results.svg | 114 ++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 benchmark/bench_results.svg diff --git a/benchmark/bench_results.svg b/benchmark/bench_results.svg new file mode 100644 index 0000000..36068fa --- /dev/null +++ b/benchmark/bench_results.svg @@ -0,0 +1,114 @@ + + + +Timer variant benchmark: accuracy error vs overhead +Scatter plot of 4 timer variants. X: accuracy error %, Y: overhead %. Lower is better on both axes. + + + + + + + + + + + + + + + + + + + + + + + + + overhead % (lower → better) + + + + + accuracy error % (lower → better) + + + + + + + + + + + + +0% +2% +4% +6% +8% +10% +12% +14% + + + + + + + + +0% +5% +10% +15% +20% + + + + + +chrono + + 12.84% err · 17.79% ovhd + + + + +RDTSC + + 5.85% err · 8.55% ovhd + + + + +RDTSCP + + 1.57% err · 15.36% ovhd + + + + +RDTSCP + LFENCE + + 0.31% err · 19.73% ovhd + + + + +chrono + +RDTSC + +RDTSCP + +RDTSCP + LFENCE + From 603d64dc625d2a777b1f296fa4612c4f074b64a1 Mon Sep 17 00:00:00 2001 From: moonfloww Date: Wed, 29 Apr 2026 12:15:53 +0200 Subject: [PATCH 2/4] TSC Clock + Benchmark Methodology Fixes --- ...ic_singlethreaded.cpp.6CA9B4237835C3CB.idx | Bin 0 -> 1196 bytes .../index/clock_cost.cpp.0A9FC84477B4560E.idx | Bin 0 -> 838 bytes ...tithreaded_puzzle.cpp.92648E33232ED012.idx | Bin 0 -> 2184 bytes .../index/ctrack.hpp.86BBC3D34EC5CF54.idx | Bin 0 -> 49120 bytes .../ctrack_benchmark.cpp.1B072944B92EFF44.idx | Bin 0 -> 17412 bytes ...ack_overhead_test.cpp.1F9B120F33519D8A.idx | Bin 0 -> 1336 bytes .../index/doctest.h.5D29A7DF3C0BE014.idx | Bin 0 -> 157934 bytes ...nce_pi_estimation.cpp.69135500BA762CCA.idx | Bin 0 -> 1204 bytes ...ded_prime_counter.cpp.945D5C7CA8FB4018.idx | Bin 0 -> 1176 bytes .../index/test_basic.cpp.6C564E4D86FAA374.idx | Bin 0 -> 31454 bytes .../test_edge_cases.cpp.430D24178F6560A5.idx | Bin 0 -> 28422 bytes .../test_helpers.hpp.8EE7A294C8F4FAE1.idx | Bin 0 -> 7620 bytes ...est_multithreaded.cpp.BB194F093FD2E201.idx | Bin 0 -> 20680 bytes .../test_nested.cpp.4DE5913E0B0DABB9.idx | Bin 0 -> 30480 bytes .../test_results.cpp.9360315F40455069.idx | Bin 0 -> 33300 bytes .../test_statistics.cpp.0708F3BF20A7210B.idx | Bin 0 -> 33838 bytes CMakeLists.txt | 48 +- benchmark/CMakeLists.txt | 43 +- benchmark/ctrack_benchmark.cpp | 1681 ++++++----- examples/CMakeLists.txt | 1 + examples/basic_singlethreaded.cpp | 2 +- include/ctrack.hpp | 2675 +++++++++-------- 22 files changed, 2394 insertions(+), 2056 deletions(-) create mode 100644 .cache/clangd/index/basic_singlethreaded.cpp.6CA9B4237835C3CB.idx create mode 100644 .cache/clangd/index/clock_cost.cpp.0A9FC84477B4560E.idx create mode 100644 .cache/clangd/index/complex_multithreaded_puzzle.cpp.92648E33232ED012.idx create mode 100644 .cache/clangd/index/ctrack.hpp.86BBC3D34EC5CF54.idx create mode 100644 .cache/clangd/index/ctrack_benchmark.cpp.1B072944B92EFF44.idx create mode 100644 .cache/clangd/index/ctrack_overhead_test.cpp.1F9B120F33519D8A.idx create mode 100644 .cache/clangd/index/doctest.h.5D29A7DF3C0BE014.idx create mode 100644 .cache/clangd/index/high_variance_pi_estimation.cpp.69135500BA762CCA.idx create mode 100644 .cache/clangd/index/multithreaded_prime_counter.cpp.945D5C7CA8FB4018.idx create mode 100644 .cache/clangd/index/test_basic.cpp.6C564E4D86FAA374.idx create mode 100644 .cache/clangd/index/test_edge_cases.cpp.430D24178F6560A5.idx create mode 100644 .cache/clangd/index/test_helpers.hpp.8EE7A294C8F4FAE1.idx create mode 100644 .cache/clangd/index/test_multithreaded.cpp.BB194F093FD2E201.idx create mode 100644 .cache/clangd/index/test_nested.cpp.4DE5913E0B0DABB9.idx create mode 100644 .cache/clangd/index/test_results.cpp.9360315F40455069.idx create mode 100644 .cache/clangd/index/test_statistics.cpp.0708F3BF20A7210B.idx diff --git a/.cache/clangd/index/basic_singlethreaded.cpp.6CA9B4237835C3CB.idx b/.cache/clangd/index/basic_singlethreaded.cpp.6CA9B4237835C3CB.idx new file mode 100644 index 0000000000000000000000000000000000000000..f75eb99fa547f662f88ea57c4891f69076d8e445 GIT binary patch literal 1196 zcmWIYbaPw6!oc91;#rZKT9OE4GKc_iaY<380wV*%1||lEiaBe8ZhIXu5IB4ON64gw ztbr}HfdVxGV)YArCTCjbO>-BT#LQ%mME+>VVXDr)|#g}fqbW7DP=#rz%+hxlF ze=(+UvN)>r#rdhU_R^w~MLOA=mdGx@>%Z?~(naTa zhJr_w**RvY9tvtLShVV;q2Ifjud&%t#k}*{`{iFmEiEqGt+~$ka@GjVEf-|#oQmECp)Arih1_L z_1bv2WbfQ(bC=;y|4sXjx$TvFXaDs6jr$n>Ytint?6h zT0B~OFfAf{+C17wJRKe#IIo>`;_V5iq%>G~_}H1)IbfdS;S*#MMB+&>Ng(l*Sd_S6 zDq)r|N?{FK7Acf4mEn`(loEmkJdh_NrHbIGbEyl%%=^K9YT>Mpf|D3!`1HB-#bCmE zN42GvJ$pBak%v#7NuCQPeD~BVm-e;I3s_jd-hjmk3)ma5h-Bddc>`u03m?cEFauy} zn59r6S%y!TS6B=tDZ{76ttJA~a{T42hPf}yE;5Sn>B#EH!-QAwOEnE=dU6dYtfi!- z0u$!3cyRgIv@bV-!rHRhaMiyRKlANZUiOYf1jXSZC=M4vakvPI!x@TFa}q(3QCyT< zYz<-vfd~i?fH4@D`Alb3FWG$Wr6r4?kN`h}AY6ulAHht{P00Z!b_NbEE+%GnR&EwH GMos`OM0+#< literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/clock_cost.cpp.0A9FC84477B4560E.idx b/.cache/clangd/index/clock_cost.cpp.0A9FC84477B4560E.idx new file mode 100644 index 0000000000000000000000000000000000000000..93807b259a500dfe6ebc6f0318008dcc44460ce8 GIT binary patch literal 838 zcmWIYbaS&~W?*nm@vO*AElFfyU|m8}c0goLXab zsepYENA-<4=Niu$Uc7#B>)qJB+a%xK{q}Wjo{yxRPm9xRwVzMtvj{K-y6-j>w9PhN z(aluw$Dk&1AFsT6_sg6)XK((<`(nj7C+P6K3F&;<$9Kz~Ro*XsRdtrW&`Le8tCM(7 zeZ9qC7v8|Nfi2}ghS2vw$tz}jeujrOPU;I%Uc7L_)_Hq;WHKgKZZea6o3i5T!>F*O z8b?hnci;LS5X!X7kN?#Lao0-L=O*wn?B3G&UHvcaeD_p6xZzx&xy%1czuAu^nz9F**l)6zw%Db=D$p(@uFGpm zO7YT+CI3y!v}0v+PwbwU_g{#&B9pm>f#>$c+TzOGBza(%8Hitzc>Jy?k_Qxm0z51{ z9AE+{0|7;;X~k8*Fx?n)!)Q?tzYrsjfE2qFH%wcpskDfzy^t^ykAQ%(fF?{AkANtP zC>M-ZDbsSz_1+3eUOU0urJ>iP!hynqT!KWd`0lA!F70cZ7cjAa zoeL9Y0XrAQyD@9SbMsTnDB4K&wTrpm%U>WL9s~$#U?AckEgQP5C^Ik!Bbb5+W^!&yjsTF$%g4vW%*w{W!p+Ig I&c(-EaTh@BerAy;!D4 zN3Z1*#CxgJ^Rv?O7Lf!&$nY;WFK1~Iiy#^}1d+ezSYmQ4XT122$vufzg64{&dcP^? zDx5XUnWk&)xHP6UWn10t1=$xY`Nic6Qa#Gnx%l=F*9Qit;DR?oUzf z>bd-4&9@od(?Y_#2fZtf5mT6bikjffA8qb551eBJ|(_vby4Qs zD^8T(;LMqEyk}v2RnqAhZSyOazscZz7j$U*<4=myYSM!jHV+Nn`zgxMJ8nhHN&oDH z`qf8^bh3TP9_#8xx6OF)x-~K7fZ&Ao*N!Ot?c-&uey&RTXKan(#gUwbXQR3|OkL7g z^Lb2lNgS``Rz|h>-{qx~i}zY4XO;DHhSIML^|wAhr^~!nmUgqUnc1_uP``iK{cv+* zz@3DP%wJ2Mt|2yV+PP% zn*+8!5cP%Z7E7A6UEuaa8AP~)^Wp;rP`}2Ij zbD%S<)JOw2yQ1xCBubD)p)gi{!9q6cG>+0hDIXl=}5< znZ(6rv%oBZbHZ(L)lRp>AQ>rhg^Ubx=exTBJqG#mecj+D805$Ib7;-JtBMOE6GdzW znIcUlNX{Tjq{Rd|FY40OJI3(*1Bl8h^gthb2QgH=Pp96;}VUtG7;!VKFFH z9Lqo^&DO8?A@_0O7$`!BOKES5(Fv0Z2eK3>oXiM+m=b9 zlYtpRv(!#awa0U=!DsV?WE{jOG`fNJ$z9CLnAKD|4q|H+XrAuA=$Q@HOacEJg-;PLig$%nP$rJrsZklES<3q>6%eBat`hO#xLB1(JajgnPfacwew4sTy;#O)}I7V7A(6 z{BV6Wu{vOQ;44vJ{+XwzxU`)Lj1g_8GNRe2jA%A0Bbtp0Xix_ZB6?zQDcg zXPF2L;Dop~wqb`z3}X0<3P1+wX}zO1;qjeC51$TP!UslP$QSOfv|*j~+PJPJY&L3* z{&4Ar>D4p8rox~uyi(CaD)_mpTM>GR%Py^Mg59ezR-*)N5 zaYL98$9XF4eh$tlH93YCYokq$X}}DSMGOpb(lQs>%9opylAB>$NNnQm;|dG>X>u%C zXw#!4)t%v(dcIVykV(X@B0}sy2}duy{rm7gAR2Lyk1SKNQZw<_hTu~ao5SO}kfT_F F{{UehyyXA@ literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/ctrack.hpp.86BBC3D34EC5CF54.idx b/.cache/clangd/index/ctrack.hpp.86BBC3D34EC5CF54.idx new file mode 100644 index 0000000000000000000000000000000000000000..daae42bbfd4d9c08c67a12ba3bcccedcfa3fd76d GIT binary patch literal 49120 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 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/doctest.h.5D29A7DF3C0BE014.idx b/.cache/clangd/index/doctest.h.5D29A7DF3C0BE014.idx new file mode 100644 index 0000000000000000000000000000000000000000..0802c8e7480d535617b3d2ae558dd7ac24003218 GIT binary patch literal 157934 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

Oj&`E1- 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 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/high_variance_pi_estimation.cpp.69135500BA762CCA.idx b/.cache/clangd/index/high_variance_pi_estimation.cpp.69135500BA762CCA.idx new file mode 100644 index 0000000000000000000000000000000000000000..b44fb39af173b7151cf628af2b286562ea315bab GIT binary patch literal 1204 zcmWIYbaPw7!oc91;#rZKT9OE4GKc_iaY<3893un6dnN{kiaBd1Ui3O*AmIAh*lub{ zhNDPgya93I)cZT4$b4boc!i))mGo!tYZFoyVrA>Y`s)jwA=1nXz2Zwx}QsptJ%La zCVrV>9=Y$RL4o}iZna|>D`j^swJAK%sVZgN$MtN^g2x=&*1Ucx+W+Ou^_o=u>pR@8 zL|K?$U1%WB@UQffy}@<Uit<99`oJPg7N47_qIavWd+C<6xO z|5oWNop~{x2Nblt608y;U;-xnafa5THJvtlc^G(r(roN(LSOMthRurl)Ss&K0C!z?|gT;0)R7tGHn!>bpd7XlOB7<0pDQ4hZmP_-VX9xqH-Z`CCs z|J?_a7)5wF#W^Klb}yW(G5gGw4QfC`)CJUKV5&o>RzB97Xrm8Q&85nv0aHD-)m8FK zV74XDYz|HiF_^H^f_kNo)8_>P4N=rmw1XKkce_Bb(jUzbkd=a*A~4l3X+|lmfyE?+ z5=cOI$*SwX^~B$JaBuE}YM@Qp{My1WVa{t>;r)3V+JNrj;^b0-*>rE(QAII}1zkV~ zaENnA!i0aYpISKUqu?Zw#@;@zayMJpk&=5{eP63$eyQf~cw6ASmz{tYO z&ce>|)zdUARS zFbAyo;IS~SdF3r89$rNyMGcrRFxEv?q+z_CCDZQa*Sx$9)T<(^q5>0MnB&dj71;I& zWTc0l7fkrK;%C17%FEsXg^?X^CHL`EHe2FHCZK9QJpq_%AkSFO6vo>#Pc^;#@3y}{ zMSNm>;xM0y@bZiC!+AxiIf)=o78fNKyMq|~AOZ{+dH05EA5L5P-=r jFu((bfq@SpDu`ev=ceQUa|Htj7Z(#VJ1aK}8zUzGbTgQD literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/multithreaded_prime_counter.cpp.945D5C7CA8FB4018.idx b/.cache/clangd/index/multithreaded_prime_counter.cpp.945D5C7CA8FB4018.idx new file mode 100644 index 0000000000000000000000000000000000000000..76c5d3ca7481bba2d7dccd8812309bb6910b7578 GIT binary patch literal 1176 zcmWIYbaR`)!oc91;#rZKT9OE4GKc_iaY<38E+Yej5;Frs#hkSh?|LyC3bZ~?-4it_ zQQSqaYO%r>Cym<1NotqxZuCs^+_bho|JULU^H@iYmXvdrPih#KI%rP+;o!+yxaGxc zwktyHoGp$j@Ak;_@9_HMw=E@Rt?{i%J$IGeU#q(>(9vL=s&RUXj^^>qkGI$Fjd*Ox zuO@hmnVmPgN$2!*iNjC0rz=h@d}5aT$U#~=SZB%>S@#2)>UWAI?NF^|~M0&%Cye@2~pt&@S+Y-2Kw?rHR$+t?w?<6uNOP@K(Yp z1NRe?ymdvMW$0ghuED=`y~=}{Hok)eEynAo3+w%0nW7_Z&QM&Ln^Xe~z3G0R;dH%e|!UBUy330_WC zP987;llGYOw!3<5?-pJLF`zWNAiFe}fJqmnrWLy~F))Pq38}xBXv50L!>hoizyq`M zoN{$XlU*=BqYST(wT?YZcw@{BqeVUZLO|6zY&u*pVVFmlq)cN;stHrHaIVJe zGgmgK0gY7UQWb*ZyvsM^E*7ZFBj+lc2;(7m@s4f zjR*JUPN)W&t;wm$3p4Wv`>BPqJ_=3(3hQy|iNb{Mo_gidzP5P*6ALdFBNsa?AX#{Y z8HL$leu0Ss{R9eISh&gXin59F!W6;mXXZi)TpnIAW-+)TU|4DB7{M%G*2u3@vE%(# zCLXZmFmrjpmcw|dOE#u`SIamCbU2SRk37sR$6wBBnES%)A}~;NRCUy0My~kau`sTA zd&eY# z5-1`lfnp{1@l-Zj;zy8PZXI|yGZdxfB!b*tT$EfK3}Og^2ryve{kHSM+_|#xl5B#) sLi_@J4E!)D1_l8HQy9VILokI9%;emZ98ffHaB(p)v$JxuurYE10Qs$R;{X5v literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/test_basic.cpp.6C564E4D86FAA374.idx b/.cache/clangd/index/test_basic.cpp.6C564E4D86FAA374.idx new file mode 100644 index 0000000000000000000000000000000000000000..c18ad25e9c1d8f9abfcfa095e997b0a348cb1d98 GIT binary patch literal 31454 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 KYjFd*(e~dW(W6cP literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/test_helpers.hpp.8EE7A294C8F4FAE1.idx b/.cache/clangd/index/test_helpers.hpp.8EE7A294C8F4FAE1.idx new file mode 100644 index 0000000000000000000000000000000000000000..df4607c0c699c1dec7acb08d179f3ac25ee34c5a GIT binary patch literal 7620 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 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/test_nested.cpp.4DE5913E0B0DABB9.idx b/.cache/clangd/index/test_nested.cpp.4DE5913E0B0DABB9.idx new file mode 100644 index 0000000000000000000000000000000000000000..35fb60858166a07eed6c3ecc2beb8ffe19bbe4e9 GIT binary patch literal 30480 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 G+Vk&At>f7M literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/test_statistics.cpp.0708F3BF20A7210B.idx b/.cache/clangd/index/test_statistics.cpp.0708F3BF20A7210B.idx new file mode 100644 index 0000000000000000000000000000000000000000..bf1eedc5b5f60f1c8e643ec13d697fe3e8e640cc GIT binary patch literal 33838 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _WIN32 -#include -#include -#else -#include -#include -#endif - -// Configuration -struct BenchmarkConfig -{ - size_t total_events = 50'000'000; // Default 50 million events - size_t thread_count = std::thread::hardware_concurrency(); - bool record_baseline = false; - bool compare_baseline = false; - std::string baseline_file = "ctrack_baseline.json"; - bool verbose = false; -}; - -// Baseline data structure -struct BaselineData -{ - double accuracy_error_percent; - double accuracy_error_ms_per_event; - double overhead_percent; - double overhead_ms; - double overhead_ns_per_event; - double memory_bytes_per_event; - double calculation_time_ms; - double peak_calc_memory_mb; - size_t total_events; - size_t thread_count; - std::string timestamp; - std::string platform; -}; - -// Global config -BenchmarkConfig g_config; - -// Get current memory usage in bytes -size_t get_memory_usage() -{ -#ifdef _WIN32 - PROCESS_MEMORY_COUNTERS_EX pmc; - GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS *)&pmc, sizeof(pmc)); - return pmc.WorkingSetSize; -#else - struct rusage usage; - getrusage(RUSAGE_SELF, &usage); - return usage.ru_maxrss * 1024; // Convert KB to bytes on Linux -#endif -} - -// Precise busy wait function - waits for specified nanoseconds -void busy_wait_ns(int64_t nanoseconds) -{ - auto start = std::chrono::high_resolution_clock::now(); - auto target_duration = std::chrono::nanoseconds(nanoseconds); - - while (true) - { - auto now = std::chrono::high_resolution_clock::now(); - auto elapsed = now - start; - if (elapsed >= target_duration) - { - break; - } - } -} - -// Benchmark functions with predictable timing -void leaf_function(int depth) -{ - CTRACK_NAME("leaf_function"); - // Busy wait for 1 microsecond (1000 ns) - busy_wait_ns(1000); -} - -void level_3_function(int depth) -{ - CTRACK_NAME("level_3_function"); - // Busy wait for 500 ns - busy_wait_ns(500); - - // Call leaf function twice - leaf_function(depth + 1); - leaf_function(depth + 1); -} - -void level_2_function(int depth, int iterations) -{ - CTRACK_NAME("level_2_function"); - // Busy wait for 300 ns - busy_wait_ns(300); - - for (int i = 0; i < iterations; ++i) - { - level_3_function(depth + 1); - } -} - -void level_1_function(int iterations) -{ - CTRACK_NAME("level_1_function"); - // Busy wait for 200 ns - busy_wait_ns(200); - - level_2_function(1, iterations); -} - -// Version without CTRACK for overhead measurement -void leaf_function_no_track(int depth) -{ - busy_wait_ns(1000); -} - -void level_3_function_no_track(int depth) -{ - busy_wait_ns(500); - leaf_function_no_track(depth + 1); - leaf_function_no_track(depth + 1); -} - -void level_2_function_no_track(int depth, int iterations) -{ - busy_wait_ns(300); - for (int i = 0; i < iterations; ++i) - { - level_3_function_no_track(depth + 1); - } -} - -void level_1_function_no_track(int iterations) -{ - busy_wait_ns(200); - level_2_function_no_track(1, iterations); -} - -// Worker thread function -void benchmark_worker(size_t events_per_thread, std::atomic &start_flag) -{ - // Wait for start signal - while (!start_flag.load()) - { - std::this_thread::yield(); - } - - // Calculate iterations to reach target event count - // Each level_1 call generates: 1 + 1 + iterations * (1 + 2) events - // For iterations=10: 1 + 1 + 10 * 3 = 32 events per call - const int iterations = 10; - const int events_per_call = 2 + iterations * 3; - size_t calls_needed = events_per_thread / events_per_call; - - for (size_t i = 0; i < calls_needed; ++i) - { - level_1_function(iterations); - } -} - -// Worker thread function without tracking -void benchmark_worker_no_track(size_t events_per_thread, std::atomic &start_flag) -{ - while (!start_flag.load()) - { - std::this_thread::yield(); - } - - const int iterations = 10; - const int events_per_call = 2 + iterations * 3; - size_t calls_needed = events_per_thread / events_per_call; - - for (size_t i = 0; i < calls_needed; ++i) - { - level_1_function_no_track(iterations); - } -} - -// Parse timing from CTRACK results string for a specific function -double parse_function_timing(const std::string &results, const std::string &function_name) -{ - // Look for the Details section first - size_t details_pos = results.find("Details"); - if (details_pos == std::string::npos) - { - return -1.0; // Details section not found - } - - // Look for the function name after the Details section - size_t func_pos = results.find(function_name, details_pos); - if (func_pos == std::string::npos) - { - return -1.0; // Function not found in Details section - } - - // Find the line containing this function in the Details section - size_t line_start = results.rfind('\n', func_pos); - if (line_start == std::string::npos) - line_start = details_pos; - else - line_start++; // Skip the newline - - size_t line_end = results.find('\n', func_pos); - if (line_end == std::string::npos) - line_end = results.length(); - - std::string line = results.substr(line_start, line_end - line_start); - - // Look for the "time acc" column value (4th column after filename, function, line) - // Split by | and find the 4th field - std::vector fields; - std::istringstream iss(line); - std::string field; - - while (std::getline(iss, field, '|')) - { - // Trim whitespace - field.erase(0, field.find_first_not_of(" \t")); - field.erase(field.find_last_not_of(" \t") + 1); - if (!field.empty()) - { - fields.push_back(field); - } - } - - // The time acc should be in the 4th field (0-indexed: filename=0, function=1, line=2, time_acc=3) - if (fields.size() > 3) - { - std::string time_acc = fields[3]; - - // Parse value and unit from time_acc (e.g., "2.09 ms") - std::istringstream time_iss(time_acc); - double value; - std::string unit; - - if (time_iss >> value >> unit) - { - // Convert to nanoseconds based on unit - if (unit == "s") - return value * 1e9; - else if (unit == "ms") - return value * 1e6; - else if (unit == "mcs") - return value * 1e3; - else if (unit == "ns") - return value; - } - } - - return -1.0; // Could not parse -} - -// Measure accuracy by comparing known timings with CTRACK measurements -std::pair measure_accuracy() -{ - std::cout << "\n=== Measuring Accuracy ===" << std::endl; - - // Clear any previous tracking data by getting and discarding results - ctrack::result_as_string(); - - // Run a controlled test with known timings - const int test_iterations = 100; - for (int i = 0; i < test_iterations; ++i) - { - level_1_function(10); - } - - // Get results - auto results = ctrack::result_as_string(); - - // Expected timings per iteration (in nanoseconds): - // leaf_function: 1000ns (called 20 times per iteration) = 20,000ns total per iteration - // level_3_function: 500ns + 2*1000ns = 2500ns (called 10 times per iteration) = 25,000ns total per iteration - // level_2_function: 300ns + 10*2500ns = 25,300ns (called 1 time per iteration) = 25,300ns total per iteration - // level_1_function: 200ns + 25,300ns = 25,500ns (called 1 time per iteration) = 25,500ns total per iteration - - struct ExpectedTiming - { - std::string name; - double expected_total_ns; - int call_count; - }; - - std::vector expected_timings = { - {"leaf_function", 1000.0 * 20 * test_iterations, 20 * test_iterations}, - {"level_3_function", 2500.0 * 10 * test_iterations, 10 * test_iterations}, - {"level_2_function", 25300.0 * 1 * test_iterations, 1 * test_iterations}, - {"level_1_function", 25500.0 * 1 * test_iterations, 1 * test_iterations}}; - - double total_expected_time = 0.0; - double total_actual_time = 0.0; - double max_absolute_error = 0.0; - - if (g_config.verbose) - { - std::cout << "Function accuracy analysis:" << std::endl; - } - - for (const auto &timing : expected_timings) - { - double actual_ns = parse_function_timing(results, timing.name); - if (actual_ns > 0) - { - double expected_ns = timing.expected_total_ns; - double absolute_error = std::abs(actual_ns - expected_ns); - double percent_error = (absolute_error / expected_ns) * 100.0; - - total_expected_time += expected_ns; - total_actual_time += actual_ns; - max_absolute_error = (std::max)(max_absolute_error, absolute_error); - - if (g_config.verbose) - { - std::cout << " " << timing.name << ": expected " << expected_ns / 1e6 << " ms, got " - << actual_ns / 1e6 << " ms (error: " << percent_error << "%)" << std::endl; - } - } - else if (g_config.verbose) - { - std::cout << " " << timing.name << ": could not parse timing" << std::endl; - } - } - - double overall_error_percent = 0.0; - double overall_error_ms = 0.0; - - if (total_expected_time > 0) - { - double total_absolute_error = std::abs(total_actual_time - total_expected_time); - overall_error_percent = (total_absolute_error / total_expected_time) * 100.0; - - // Calculate total number of events across all functions - double total_events = 0; - for (const auto &timing : expected_timings) - { - total_events += timing.call_count; - } - - // Convert to milliseconds per event - overall_error_ms = (total_absolute_error / 1e6) / total_events; // Convert to milliseconds per event - } - - if (g_config.verbose) - { - std::cout << "Overall accuracy error: " << overall_error_percent << "% (" << overall_error_ms << " ms per event)" << std::endl; - } - - return {overall_error_percent, overall_error_ms}; -} - -// Measure overhead by comparing with and without CTRACK -std::tuple measure_overhead() -{ - std::cout << "\n=== Measuring Overhead ===" << std::endl; - - const size_t overhead_events = 1'000'000; // 1M events for overhead test - size_t events_per_thread = overhead_events / g_config.thread_count; - - // Measure without CTRACK - auto start_no_track = std::chrono::high_resolution_clock::now(); - { - std::vector threads; - std::atomic start_flag{false}; - - for (size_t i = 0; i < g_config.thread_count; ++i) - { - threads.emplace_back(benchmark_worker_no_track, events_per_thread, std::ref(start_flag)); - } - - start_flag = true; - - for (auto &t : threads) - { - t.join(); - } - } - auto end_no_track = std::chrono::high_resolution_clock::now(); - auto duration_no_track = std::chrono::duration_cast(end_no_track - start_no_track).count(); - - // Clear tracking data by getting and discarding results - ctrack::result_as_string(); - - // Measure with CTRACK - auto start_track = std::chrono::high_resolution_clock::now(); - { - std::vector threads; - std::atomic start_flag{false}; - - for (size_t i = 0; i < g_config.thread_count; ++i) - { - threads.emplace_back(benchmark_worker, events_per_thread, std::ref(start_flag)); - } - - start_flag = true; - - for (auto &t : threads) - { - t.join(); - } - } - auto end_track = std::chrono::high_resolution_clock::now(); - auto duration_track = std::chrono::duration_cast(end_track - start_track).count(); - - double overhead_percent = ((double)(duration_track - duration_no_track) / duration_no_track) * 100.0; - double overhead_ms = (duration_track - duration_no_track) / 1000.0; // Convert microseconds to milliseconds - double overhead_ns_per_event = ((duration_track - duration_no_track) * 1000.0) / overhead_events; // nanoseconds per event - - if (g_config.verbose) - { - std::cout << "Without CTRACK: " << duration_no_track << " µs" << std::endl; - std::cout << "With CTRACK: " << duration_track << " µs" << std::endl; - std::cout << "Overhead: " << overhead_percent << "% (" << overhead_ms << " ms total, " - << overhead_ns_per_event << " ns per event)" << std::endl; - } - - return {overhead_percent, overhead_ms, overhead_ns_per_event}; -} - -// Measure memory usage and calculation time -std::tuple measure_memory_and_calculation_time() -{ - std::cout << "\n=== Measuring Memory Usage and Calculation Time ===" << std::endl; - - // Clear any previous tracking data by getting and discarding results - ctrack::result_as_string(); - - // Measure initial memory - size_t initial_memory = get_memory_usage(); - - // Generate events - size_t events_per_thread = g_config.total_events / g_config.thread_count; - - if (g_config.verbose) - { - std::cout << "Generating " << g_config.total_events << " events across " - << g_config.thread_count << " threads..." << std::endl; - } - - auto gen_start = std::chrono::high_resolution_clock::now(); - { - std::vector threads; - std::atomic start_flag{false}; - - for (size_t i = 0; i < g_config.thread_count; ++i) - { - threads.emplace_back(benchmark_worker, events_per_thread, std::ref(start_flag)); - } - - start_flag = true; - - for (auto &t : threads) - { - t.join(); - } - } - auto gen_end = std::chrono::high_resolution_clock::now(); - - // Measure memory after event generation - size_t post_event_memory = get_memory_usage(); - size_t memory_used = post_event_memory - initial_memory; - double bytes_per_event = (double)memory_used / g_config.total_events; - - if (g_config.verbose) - { - auto gen_duration = std::chrono::duration_cast(gen_end - gen_start).count(); - std::cout << "Event generation took: " << gen_duration << " ms" << std::endl; - std::cout << "Memory used: " << memory_used / (1024.0 * 1024.0) << " MB" << std::endl; - std::cout << "Memory per event: " << bytes_per_event << " bytes" << std::endl; - } - - // Measure calculation time and peak memory usage - std::atomic monitoring{true}; - std::atomic peak_memory{post_event_memory}; - - // Start memory monitoring thread - std::thread monitor_thread([&monitoring, &peak_memory, initial_memory]() - { - while (monitoring.load()) { - size_t current_memory = get_memory_usage(); - size_t current_peak = peak_memory.load(); - while (current_memory > current_peak && - !peak_memory.compare_exchange_weak(current_peak, current_memory)) {} - std::this_thread::sleep_for(std::chrono::milliseconds(10)); // Poll every 10ms - } }); - - auto calc_start = std::chrono::high_resolution_clock::now(); - auto results = ctrack::result_as_string(); - auto calc_end = std::chrono::high_resolution_clock::now(); - - // Stop monitoring - monitoring = false; - monitor_thread.join(); - - auto calc_duration = std::chrono::duration_cast(calc_end - calc_start).count() / 1000.0; - double peak_calc_memory_mb = (peak_memory.load() - initial_memory) / (1024.0 * 1024.0); - - if (g_config.verbose) - { - std::cout << "Result calculation took: " << calc_duration << " ms" << std::endl; - std::cout << "Peak memory during calculation: " << peak_calc_memory_mb << " MB" << std::endl; - } - - return {bytes_per_event, calc_duration, peak_calc_memory_mb}; -} - -// Save baseline to file -void save_baseline(const BaselineData &data) -{ - std::ofstream file(g_config.baseline_file); - if (!file) - { - std::cerr << "Error: Could not open baseline file for writing: " << g_config.baseline_file << std::endl; - return; - } - - // Simple JSON format - file << "{\n"; - file << " \"accuracy_error_percent\": " << data.accuracy_error_percent << ",\n"; - file << " \"accuracy_error_ms_per_event\": " << data.accuracy_error_ms_per_event << ",\n"; - file << " \"overhead_percent\": " << data.overhead_percent << ",\n"; - file << " \"overhead_ms\": " << data.overhead_ms << ",\n"; - file << " \"overhead_ns_per_event\": " << data.overhead_ns_per_event << ",\n"; - file << " \"memory_bytes_per_event\": " << data.memory_bytes_per_event << ",\n"; - file << " \"calculation_time_ms\": " << data.calculation_time_ms << ",\n"; - file << " \"peak_calc_memory_mb\": " << data.peak_calc_memory_mb << ",\n"; - file << " \"total_events\": " << data.total_events << ",\n"; - file << " \"thread_count\": " << data.thread_count << ",\n"; - file << " \"timestamp\": \"" << data.timestamp << "\",\n"; - file << " \"platform\": \"" << data.platform << "\"\n"; - file << "}\n"; - - std::cout << "\nBaseline saved to: " << g_config.baseline_file << std::endl; -} - -// Load baseline from file -bool load_baseline(BaselineData &data) -{ - std::ifstream file(g_config.baseline_file); - if (!file) - { - return false; - } - - // Simple JSON parsing (production code would use a proper JSON library) - std::string line; - while (std::getline(file, line)) - { - if (line.find("\"accuracy_error_percent\":") != std::string::npos) - { - size_t pos = line.find(": ") + 2; - size_t end = line.find(",", pos); - data.accuracy_error_percent = std::stod(line.substr(pos, end - pos)); - } - else if (line.find("\"accuracy_error_ms_per_event\":") != std::string::npos) - { - size_t pos = line.find(": ") + 2; - size_t end = line.find(",", pos); - data.accuracy_error_ms_per_event = std::stod(line.substr(pos, end - pos)); - } - else if (line.find("\"overhead_percent\":") != std::string::npos) - { - size_t pos = line.find(": ") + 2; - size_t end = line.find(",", pos); - data.overhead_percent = std::stod(line.substr(pos, end - pos)); - } - else if (line.find("\"overhead_ms\":") != std::string::npos) - { - size_t pos = line.find(": ") + 2; - size_t end = line.find(",", pos); - data.overhead_ms = std::stod(line.substr(pos, end - pos)); - } - else if (line.find("\"overhead_ns_per_event\":") != std::string::npos) - { - size_t pos = line.find(": ") + 2; - size_t end = line.find(",", pos); - data.overhead_ns_per_event = std::stod(line.substr(pos, end - pos)); - } - else if (line.find("\"memory_bytes_per_event\":") != std::string::npos) - { - size_t pos = line.find(": ") + 2; - size_t end = line.find(",", pos); - data.memory_bytes_per_event = std::stod(line.substr(pos, end - pos)); - } - else if (line.find("\"calculation_time_ms\":") != std::string::npos) - { - size_t pos = line.find(": ") + 2; - size_t end = line.find(",", pos); - data.calculation_time_ms = std::stod(line.substr(pos, end - pos)); - } - else if (line.find("\"peak_calc_memory_mb\":") != std::string::npos) - { - size_t pos = line.find(": ") + 2; - size_t end = line.find(",", pos); - data.peak_calc_memory_mb = std::stod(line.substr(pos, end - pos)); - } - else if (line.find("\"total_events\":") != std::string::npos) - { - size_t pos = line.find(": ") + 2; - size_t end = line.find(",", pos); - data.total_events = std::stoull(line.substr(pos, end - pos)); - } - else if (line.find("\"thread_count\":") != std::string::npos) - { - size_t pos = line.find(": ") + 2; - size_t end = line.find(",", pos); - data.thread_count = std::stoull(line.substr(pos, end - pos)); - } - } - - return true; -} - -// Compare current results with baseline -void compare_with_baseline(const BaselineData ¤t) -{ - BaselineData baseline; - if (!load_baseline(baseline)) - { - std::cerr << "Error: Could not load baseline file: " << g_config.baseline_file << std::endl; - return; - } - - std::cout << "\n=== Baseline Comparison ===" << std::endl; - std::cout << std::fixed << std::setprecision(2); - auto print_comparison = [](const std::string &metric, double baseline_val, double current_val, bool lower_is_better = true) - { - double diff = current_val - baseline_val; - double percent_change = (diff / baseline_val) * 100.0; - - std::string direction = (diff > 0) ? "increased" : "decreased"; - std::string indicator = (lower_is_better ? (diff > 0 ? "worse" : "better") : (diff > 0 ? "better" : "worse")); - - std::cout << metric << ":\n"; - std::cout << " Baseline: " << baseline_val << "\n"; - std::cout << " Current: " << current_val << "\n"; - std::cout << " Change: " << indicator << " - " << std::abs(percent_change) << "% " << direction << "\n\n"; - }; - - print_comparison("Accuracy Error %", baseline.accuracy_error_percent, current.accuracy_error_percent); - print_comparison("Accuracy Error (ms/event)", baseline.accuracy_error_ms_per_event, current.accuracy_error_ms_per_event); - print_comparison("Overhead %", std::abs(baseline.overhead_percent), std::abs(current.overhead_percent)); - print_comparison("Overhead Time (ms)", std::abs(baseline.overhead_ms), std::abs(current.overhead_ms)); - print_comparison("Overhead per Event (ns)", baseline.overhead_ns_per_event, current.overhead_ns_per_event); - print_comparison("Memory/Event (bytes)", baseline.memory_bytes_per_event, current.memory_bytes_per_event); - print_comparison("Calculation Time (ms)", baseline.calculation_time_ms, current.calculation_time_ms); - print_comparison("Peak Calc Memory (MB)", baseline.peak_calc_memory_mb, current.peak_calc_memory_mb); -} - -// Get platform string -std::string get_platform() -{ -#ifdef _WIN32 - return "Windows"; -#elif __APPLE__ - return "macOS"; -#elif __linux__ - return "Linux"; -#else - return "Unknown"; -#endif -} - -// Get current timestamp -std::string get_timestamp() -{ - auto now = std::chrono::system_clock::now(); - auto time_t = std::chrono::system_clock::to_time_t(now); - std::stringstream ss; -#ifdef _WIN32 - struct tm time_info; - localtime_s(&time_info, &time_t); - ss << std::put_time(&time_info, "%Y-%m-%d %H:%M:%S"); -#else - ss << std::put_time(std::localtime(&time_t), "%Y-%m-%d %H:%M:%S"); -#endif - return ss.str(); -} - -// Print usage -void print_usage(const char *program_name) -{ - std::cout << "Usage: " << program_name << " [options]\n"; - std::cout << "Options:\n"; - std::cout << " --events Number of events to generate (default: 50000000)\n"; - std::cout << " --threads Number of threads to use (default: hardware concurrency)\n"; - std::cout << " --baseline Baseline file path (default: ctrack_baseline.json)\n"; - std::cout << " --record-baseline Record current results as baseline\n"; - std::cout << " --compare-baseline Compare results with baseline\n"; - std::cout << " --verbose Enable verbose output\n"; - std::cout << " --help Show this help message\n"; -} - -// Parse command line arguments -bool parse_args(int argc, char *argv[]) -{ - for (int i = 1; i < argc; ++i) - { - std::string arg = argv[i]; - - if (arg == "--help") - { - print_usage(argv[0]); - return false; - } - else if (arg == "--events" && i + 1 < argc) - { - g_config.total_events = std::stoull(argv[++i]); - } - else if (arg == "--threads" && i + 1 < argc) - { - g_config.thread_count = std::stoull(argv[++i]); - } - else if (arg == "--baseline" && i + 1 < argc) - { - g_config.baseline_file = argv[++i]; - } - else if (arg == "--record-baseline") - { - g_config.record_baseline = true; - } - else if (arg == "--compare-baseline") - { - g_config.compare_baseline = true; - } - else if (arg == "--verbose") - { - g_config.verbose = true; - } - else - { - std::cerr << "Unknown option: " << arg << std::endl; - print_usage(argv[0]); - return false; - } - } - - return true; -} - -int main(int argc, char *argv[]) -{ - if (!parse_args(argc, argv)) - { - return 1; - } - - std::cout << "CTRACK Comprehensive Benchmark\n"; - std::cout << "==============================\n"; - std::cout << "Total events: " << g_config.total_events << "\n"; - std::cout << "Thread count: " << g_config.thread_count << "\n"; - std::cout << "Events per thread: " << g_config.total_events / g_config.thread_count << "\n"; - - // Run benchmarks - auto [accuracy_error_percent, accuracy_error_ms_per_event] = measure_accuracy(); - auto [overhead_percent, overhead_ms, overhead_ns_per_event] = measure_overhead(); - auto [bytes_per_event, calc_time, peak_calc_memory] = measure_memory_and_calculation_time(); - - // Prepare results - BaselineData current_data; - current_data.accuracy_error_percent = accuracy_error_percent; - current_data.accuracy_error_ms_per_event = accuracy_error_ms_per_event; - current_data.overhead_percent = overhead_percent; - current_data.overhead_ms = overhead_ms; - current_data.overhead_ns_per_event = overhead_ns_per_event; - current_data.memory_bytes_per_event = bytes_per_event; - current_data.calculation_time_ms = calc_time; - current_data.peak_calc_memory_mb = peak_calc_memory; - current_data.total_events = g_config.total_events; - current_data.thread_count = g_config.thread_count; - current_data.timestamp = get_timestamp(); - current_data.platform = get_platform(); - - // Print summary - std::cout << "\n=== Benchmark Results ===" << std::endl; - std::cout << std::fixed << std::setprecision(2); - std::cout << "Accuracy error: " << accuracy_error_percent << "% (" << accuracy_error_ms_per_event << " ms per event)" << std::endl; - std::cout << "Overhead: " << overhead_percent << "% (" << overhead_ms << " ms total, " - << overhead_ns_per_event << " ns per event)" << std::endl; - std::cout << "Memory per event: " << bytes_per_event << " bytes" << std::endl; - std::cout << "Calculation time: " << calc_time << " ms" << std::endl; - std::cout << "Peak calculation memory: " << peak_calc_memory << " MB" << std::endl; - - // Handle baseline operations - if (g_config.record_baseline) - { - save_baseline(current_data); - } - - if (g_config.compare_baseline) - { - compare_with_baseline(current_data); - } - - return 0; -} \ No newline at end of file +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#include +#else +#include +#include +#endif + +// Prevent the compiler from inlining or collapsing calls across call-sites. +// With -O3 the _no_track helpers would otherwise be fully inlined into the +// worker loop, letting the optimiser merge/eliminate busy-wait iterations and +// producing artificially low (even negative) overhead measurements. +#if defined(_MSC_VER) +#define BENCHMARK_NOINLINE __declspec(noinline) +#else +#define BENCHMARK_NOINLINE __attribute__((noinline)) +#endif + +// --------------------------------------------------------------------------- +// Orthogonal wall-clock: does NOT share the vDSO/TSC path used by either +// std::chrono or ctrack's internal clocks, so it can measure overhead without +// self-measurement bias regardless of which ctrack clock variant is compiled. +// +// On Windows we fall back to QueryPerformanceCounter which goes through the +// HAL and is independent of both RDTSC and the C++ runtime clock. +// --------------------------------------------------------------------------- +inline int64_t raw_clock_ns() +{ +#ifdef _WIN32 + LARGE_INTEGER freq, cnt; + QueryPerformanceFrequency(&freq); + QueryPerformanceCounter(&cnt); + return static_cast(cnt.QuadPart * 1'000'000'000LL / freq.QuadPart); +#else + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC_RAW, &ts); + return static_cast(ts.tv_sec) * 1'000'000'000LL + ts.tv_nsec; +#endif +} + + +// Configuration +struct BenchmarkConfig +{ + size_t total_events = 50'000'000; // Default 50 million events + size_t thread_count = std::thread::hardware_concurrency(); + bool record_baseline = false; + bool compare_baseline = false; + std::string baseline_file = "ctrack_baseline.json"; + bool verbose = false; +}; + +// Baseline data structure +struct BaselineData +{ + double accuracy_error_percent; + double accuracy_error_us_per_event; + double overhead_percent; + double overhead_ms; + double overhead_ns_per_event; + double memory_bytes_per_event; + double calculation_time_ms; + double peak_calc_memory_mb; + size_t total_events; + size_t thread_count; + std::string timestamp; + std::string platform; +}; + +// Global config +BenchmarkConfig g_config; + +// Get current memory usage in bytes +size_t get_memory_usage() +{ +#ifdef _WIN32 + PROCESS_MEMORY_COUNTERS_EX pmc; + GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS *)&pmc, sizeof(pmc)); + return pmc.WorkingSetSize; +#else + struct rusage usage; + getrusage(RUSAGE_SELF, &usage); + return usage.ru_maxrss * 1024; // Convert KB to bytes on Linux +#endif +} + +// Precise busy wait function - waits for specified nanoseconds +BENCHMARK_NOINLINE void busy_wait_ns(int64_t nanoseconds) +{ + auto start = std::chrono::high_resolution_clock::now(); + auto target_duration = std::chrono::nanoseconds(nanoseconds); + + while (true) + { + auto now = std::chrono::high_resolution_clock::now(); + auto elapsed = now - start; + if (elapsed >= target_duration) + { + break; + } + } +} + +// Benchmark functions with predictable timing +void leaf_function(int depth) +{ + CTRACK_NAME("leaf_function"); + // Busy wait for 1 microsecond (1000 ns) + busy_wait_ns(1000); +} + +void level_3_function(int depth) +{ + CTRACK_NAME("level_3_function"); + // Busy wait for 500 ns + busy_wait_ns(500); + + // Call leaf function twice + leaf_function(depth + 1); + leaf_function(depth + 1); +} + +void level_2_function(int depth, int iterations) +{ + CTRACK_NAME("level_2_function"); + // Busy wait for 300 ns + busy_wait_ns(300); + + for (int i = 0; i < iterations; ++i) + { + level_3_function(depth + 1); + } +} + +void level_1_function(int iterations) +{ + CTRACK_NAME("level_1_function"); + // Busy wait for 200 ns + busy_wait_ns(200); + + level_2_function(1, iterations); +} + +// Version without CTRACK for overhead measurement +BENCHMARK_NOINLINE void leaf_function_no_track(int depth) +{ + busy_wait_ns(1000); +} + +BENCHMARK_NOINLINE void level_3_function_no_track(int depth) +{ + busy_wait_ns(500); + leaf_function_no_track(depth + 1); + leaf_function_no_track(depth + 1); +} + +BENCHMARK_NOINLINE void level_2_function_no_track(int depth, int iterations) +{ + busy_wait_ns(300); + for (int i = 0; i < iterations; ++i) + { + level_3_function_no_track(depth + 1); + } +} + +BENCHMARK_NOINLINE void level_1_function_no_track(int iterations) +{ + busy_wait_ns(200); + level_2_function_no_track(1, iterations); +} + +// Worker thread function +void benchmark_worker(size_t events_per_thread, std::atomic &start_flag) +{ + // Wait for start signal + while (!start_flag.load()) + { + std::this_thread::yield(); + } + + // Calculate iterations to reach target event count + // Each level_1 call generates: 1 + 1 + iterations * (1 + 2) events + // For iterations=10: 1 + 1 + 10 * 3 = 32 events per call + const int iterations = 10; + const int events_per_call = 2 + iterations * 3; + size_t calls_needed = events_per_thread / events_per_call; + + for (size_t i = 0; i < calls_needed; ++i) + { + level_1_function(iterations); + } +} + +// Worker thread function without tracking +void benchmark_worker_no_track(size_t events_per_thread, std::atomic &start_flag) +{ + while (!start_flag.load()) + { + std::this_thread::yield(); + } + + const int iterations = 10; + const int events_per_call = 2 + iterations * 3; + size_t calls_needed = events_per_thread / events_per_call; + + for (size_t i = 0; i < calls_needed; ++i) + { + level_1_function_no_track(iterations); + } +} + +// Parse timing from CTRACK results string for a specific function +double parse_function_timing(const std::string &results, const std::string &function_name) +{ + // Look for the Details section first + size_t details_pos = results.find("Details"); + if (details_pos == std::string::npos) + { + return -1.0; // Details section not found + } + + // Look for the function name after the Details section + size_t func_pos = results.find(function_name, details_pos); + if (func_pos == std::string::npos) + { + return -1.0; // Function not found in Details section + } + + // Find the line containing this function in the Details section + size_t line_start = results.rfind('\n', func_pos); + if (line_start == std::string::npos) + line_start = details_pos; + else + line_start++; // Skip the newline + + size_t line_end = results.find('\n', func_pos); + if (line_end == std::string::npos) + line_end = results.length(); + + std::string line = results.substr(line_start, line_end - line_start); + + // Look for the "time acc" column value (4th column after filename, function, line) + // Split by | and find the 4th field + std::vector fields; + std::istringstream iss(line); + std::string field; + + while (std::getline(iss, field, '|')) + { + // Trim whitespace + field.erase(0, field.find_first_not_of(" \t")); + field.erase(field.find_last_not_of(" \t") + 1); + if (!field.empty()) + { + fields.push_back(field); + } + } + + // The time acc should be in the 4th field (0-indexed: filename=0, function=1, line=2, time_acc=3) + if (fields.size() > 3) + { + std::string time_acc = fields[3]; + + // Parse value and unit from time_acc (e.g., "2.09 ms") + std::istringstream time_iss(time_acc); + double value; + std::string unit; + + if (time_iss >> value >> unit) + { + // Convert to nanoseconds based on unit + if (unit == "s") + return value * 1e9; + else if (unit == "ms") + return value * 1e6; + else if (unit == "us") + return value * 1e3; + else if (unit == "ns") + return value; + } + } + + return -1.0; // Could not parse +} + +// Measure accuracy by comparing known timings with CTRACK measurements +std::pair measure_accuracy() +{ + std::cout << "\n=== Measuring Accuracy ===" << std::endl; + + // Clear any previous tracking data by getting and discarding results + ctrack::result_as_string(); + + // Run a controlled test with known timings + const int test_iterations = 100; + for (int i = 0; i < test_iterations; ++i) + { + level_1_function(10); + } + + // Get results + auto results = ctrack::result_as_string(); + + // Expected timings per iteration (in nanoseconds): + // leaf_function: 1000ns (called 20 times per iteration) = 20,000ns total per iteration + // level_3_function: 500ns + 2*1000ns = 2500ns (called 10 times per iteration) = 25,000ns total per iteration + // level_2_function: 300ns + 10*2500ns = 25,300ns (called 1 time per iteration) = 25,300ns total per iteration + // level_1_function: 200ns + 25,300ns = 25,500ns (called 1 time per iteration) = 25,500ns total per iteration + + struct ExpectedTiming + { + std::string name; + double expected_total_ns; + int call_count; + }; + + std::vector expected_timings = { + {"leaf_function", 1000.0 * 20 * test_iterations, 20 * test_iterations}, + {"level_3_function", 2500.0 * 10 * test_iterations, 10 * test_iterations}, + {"level_2_function", 25300.0 * 1 * test_iterations, 1 * test_iterations}, + {"level_1_function", 25500.0 * 1 * test_iterations, 1 * test_iterations}}; + + double total_expected_time = 0.0; + double total_actual_time = 0.0; + double max_absolute_error = 0.0; + + if (g_config.verbose) + { + std::cout << "Function accuracy analysis:" << std::endl; + } + + for (const auto &timing : expected_timings) + { + double actual_ns = parse_function_timing(results, timing.name); + if (actual_ns > 0) + { + double expected_ns = timing.expected_total_ns; + double absolute_error = std::abs(actual_ns - expected_ns); + double percent_error = (absolute_error / expected_ns) * 100.0; + + total_expected_time += expected_ns; + total_actual_time += actual_ns; + max_absolute_error = (std::max)(max_absolute_error, absolute_error); + + if (g_config.verbose) + { + std::cout << " " << timing.name << ": expected " << expected_ns / 1e6 << " ms, got " + << actual_ns / 1e6 << " ms (error: " << percent_error << "%)" << std::endl; + } + } + else if (g_config.verbose) + { + std::cout << " " << timing.name << ": could not parse timing" << std::endl; + } + } + + double overall_error_percent = 0.0; + double overall_error_ms = 0.0; + + if (total_expected_time > 0) + { + double total_absolute_error = std::abs(total_actual_time - total_expected_time); + overall_error_percent = (total_absolute_error / total_expected_time) * 100.0; + + // Calculate total number of events across all functions + double total_events = 0; + for (const auto &timing : expected_timings) + { + total_events += timing.call_count; + } + + // Convert to milliseconds per event + overall_error_ms = (total_absolute_error / 1e3) / total_events; // Convert to us per event + } + + if (g_config.verbose) + { + std::cout << "Overall accuracy error: " << overall_error_percent << "% (" << overall_error_ms << " ms per event)" << std::endl; + } + + return {overall_error_percent, overall_error_ms}; +} + +// --------------------------------------------------------------------------- +// measure_overhead: uses raw_clock_ns() (CLOCK_MONOTONIC_RAW / QPC) so the +// outer timer is orthogonal to whatever clock ctrack uses internally. +// This eliminates the vDSO-cache self-measurement bias that made the chrono +// build appear to have artificially low overhead. +// --------------------------------------------------------------------------- +std::tuple measure_overhead() +{ + std::cout << "\n=== Measuring Overhead ===" << std::endl; + + const size_t overhead_events = 1'000'000; + size_t events_per_thread = overhead_events / g_config.thread_count; + + // Helper: spawn threads, wait for join, return nothing (timing done outside) + auto run_variant = [&](bool with_track) + { + std::vector threads; + std::atomic start_flag{false}; + for (size_t i = 0; i < g_config.thread_count; ++i) + { + if (with_track) + threads.emplace_back(benchmark_worker, events_per_thread, std::ref(start_flag)); + else + threads.emplace_back(benchmark_worker_no_track, events_per_thread, std::ref(start_flag)); + } + start_flag = true; + for (auto &t : threads) t.join(); + // NOTE: result_as_string() is intentionally NOT called here. + // It must stay outside the timed window. + }; + + // Warmup + run_variant(false); + ctrack::result_as_string(); // clear accumulated state + run_variant(true); + ctrack::result_as_string(); // clear accumulated state + + // Multi-trial with alternating order + const int NUM_TRIALS = 5; + std::vector no_track_times, track_times; + + for (int trial = 0; trial < NUM_TRIALS; ++trial) + { + bool no_track_first = (trial % 2 == 0); + + // measure(with_track): clear ctrack state BEFORE t0, time pure work, + // discard results AFTER t1. + auto measure = [&](bool with_track) -> double + { + // Pre-clear: outside timed window + ctrack::result_as_string(); + + int64_t t0 = raw_clock_ns(); // ← CLOCK_MONOTONIC_RAW / QPC + run_variant(with_track); + int64_t t1 = raw_clock_ns(); // ← CLOCK_MONOTONIC_RAW / QPC + + // Post-clear: outside timed window + if (with_track) ctrack::result_as_string(); + + return static_cast(t1 - t0) / 1'000.0; // ns → µs + }; + + if (no_track_first) + { + no_track_times.push_back(measure(false)); + track_times .push_back(measure(true)); + } + else + { + track_times .push_back(measure(true)); + no_track_times.push_back(measure(false)); + } + } + + // Median to reject scheduler outliers + auto median = [](std::vector v) -> double + { + std::sort(v.begin(), v.end()); + return v[v.size() / 2]; + }; + + double dur_no_track = median(no_track_times); + double dur_track = median(track_times); + double raw_diff = dur_track - dur_no_track; // µs + double clamped_diff = std::max(0.0, raw_diff); + + double overhead_percent = (clamped_diff / dur_no_track) * 100.0; + double overhead_ms = clamped_diff / 1'000.0; + double overhead_ns_per_event = (clamped_diff * 1'000.0) / overhead_events; + + if (g_config.verbose) + { + std::cout << "Without ctrack (median): " << dur_no_track << " µs\n"; + std::cout << "With ctrack (median): " << dur_track << " µs\n"; + if (raw_diff < 0) + std::cout << "Raw diff: " << raw_diff << " µs (negative — clamped to 0, measurement noise)\n"; + std::cout << "Overhead: " << overhead_percent << "% (" + << overhead_ms << " ms, " << overhead_ns_per_event << " ns/event)\n"; + } + + return {overhead_percent, overhead_ms, overhead_ns_per_event}; +} + +std::tuple measure_memory_and_calculation_time() +{ + std::cout << "\n=== Measuring Memory Usage and Calculation Time ===" << std::endl; + ctrack::result_as_string(); + size_t initial_memory = get_memory_usage(); + size_t events_per_thread = g_config.total_events / g_config.thread_count; + + if (g_config.verbose) + { + std::cout << "Generating " << g_config.total_events << " events across " + << g_config.thread_count << " threads..." << std::endl; + } + + auto gen_start = std::chrono::high_resolution_clock::now(); + { + std::vector threads; + std::atomic start_flag{false}; + + for (size_t i = 0; i < g_config.thread_count; ++i) + { + threads.emplace_back(benchmark_worker, events_per_thread, std::ref(start_flag)); + } + + start_flag = true; + + for (auto &t : threads) + { + t.join(); + } + } + auto gen_end = std::chrono::high_resolution_clock::now(); + + // Measure memory after event generation + size_t post_event_memory = get_memory_usage(); + size_t memory_used = post_event_memory - initial_memory; + double bytes_per_event = (double)memory_used / g_config.total_events; + + if (g_config.verbose) + { + auto gen_duration = std::chrono::duration_cast(gen_end - gen_start).count(); + std::cout << "Event generation took: " << gen_duration << " ms" << std::endl; + std::cout << "Memory used: " << memory_used / (1024.0 * 1024.0) << " MB" << std::endl; + std::cout << "Memory per event: " << bytes_per_event << " bytes" << std::endl; + } + + // Measure calculation time and peak memory usage + std::atomic monitoring{true}; + std::atomic peak_memory{post_event_memory}; + + // Start memory monitoring thread + std::thread monitor_thread([&monitoring, &peak_memory, initial_memory]() + { + while (monitoring.load()) { + size_t current_memory = get_memory_usage(); + size_t current_peak = peak_memory.load(); + while (current_memory > current_peak && + !peak_memory.compare_exchange_weak(current_peak, current_memory)) {} + std::this_thread::sleep_for(std::chrono::milliseconds(10)); // Poll every 10ms + } }); + + auto calc_start = std::chrono::high_resolution_clock::now(); + auto results = ctrack::result_as_string(); + auto calc_end = std::chrono::high_resolution_clock::now(); + + // Stop monitoring + monitoring = false; + monitor_thread.join(); + + auto calc_duration = std::chrono::duration_cast(calc_end - calc_start).count() / 1000.0; + double peak_calc_memory_mb = (peak_memory.load() - initial_memory) / (1024.0 * 1024.0); + + if (g_config.verbose) + { + std::cout << "Result calculation took: " << calc_duration << " ms" << std::endl; + std::cout << "Peak memory during calculation: " << peak_calc_memory_mb << " MB" << std::endl; + } + + return {bytes_per_event, calc_duration, peak_calc_memory_mb}; +} + +// Save baseline to file +void save_baseline(const BaselineData &data) +{ + std::ofstream file(g_config.baseline_file); + if (!file) + { + std::cerr << "Error: Could not open baseline file for writing: " << g_config.baseline_file << std::endl; + return; + } + + // Simple JSON format + file << "{\n"; + file << " \"accuracy_error_percent\": " << data.accuracy_error_percent << ",\n"; + file << " \"accuracy_error_ms_per_event\": " << data.accuracy_error_us_per_event << ",\n"; + file << " \"overhead_percent\": " << data.overhead_percent << ",\n"; + file << " \"overhead_ms\": " << data.overhead_ms << ",\n"; + file << " \"overhead_ns_per_event\": " << data.overhead_ns_per_event << ",\n"; + file << " \"memory_bytes_per_event\": " << data.memory_bytes_per_event << ",\n"; + file << " \"calculation_time_ms\": " << data.calculation_time_ms << ",\n"; + file << " \"peak_calc_memory_mb\": " << data.peak_calc_memory_mb << ",\n"; + file << " \"total_events\": " << data.total_events << ",\n"; + file << " \"thread_count\": " << data.thread_count << ",\n"; + file << " \"timestamp\": \"" << data.timestamp << "\",\n"; + file << " \"platform\": \"" << data.platform << "\"\n"; + file << "}\n"; + + std::cout << "\nBaseline saved to: " << g_config.baseline_file << std::endl; +} + +// Load baseline from file +bool load_baseline(BaselineData &data) +{ + std::ifstream file(g_config.baseline_file); + if (!file) + { + return false; + } + + // Simple JSON parsing (production code would use a proper JSON library) + std::string line; + while (std::getline(file, line)) + { + if (line.find("\"accuracy_error_percent\":") != std::string::npos) + { + size_t pos = line.find(": ") + 2; + size_t end = line.find(",", pos); + data.accuracy_error_percent = std::stod(line.substr(pos, end - pos)); + } + else if (line.find("\"accuracy_error_ms_per_event\":") != std::string::npos) + { + size_t pos = line.find(": ") + 2; + size_t end = line.find(",", pos); + data.accuracy_error_us_per_event = std::stod(line.substr(pos, end - pos)); + } + else if (line.find("\"overhead_percent\":") != std::string::npos) + { + size_t pos = line.find(": ") + 2; + size_t end = line.find(",", pos); + data.overhead_percent = std::stod(line.substr(pos, end - pos)); + } + else if (line.find("\"overhead_ms\":") != std::string::npos) + { + size_t pos = line.find(": ") + 2; + size_t end = line.find(",", pos); + data.overhead_ms = std::stod(line.substr(pos, end - pos)); + } + else if (line.find("\"overhead_ns_per_event\":") != std::string::npos) + { + size_t pos = line.find(": ") + 2; + size_t end = line.find(",", pos); + data.overhead_ns_per_event = std::stod(line.substr(pos, end - pos)); + } + else if (line.find("\"memory_bytes_per_event\":") != std::string::npos) + { + size_t pos = line.find(": ") + 2; + size_t end = line.find(",", pos); + data.memory_bytes_per_event = std::stod(line.substr(pos, end - pos)); + } + else if (line.find("\"calculation_time_ms\":") != std::string::npos) + { + size_t pos = line.find(": ") + 2; + size_t end = line.find(",", pos); + data.calculation_time_ms = std::stod(line.substr(pos, end - pos)); + } + else if (line.find("\"peak_calc_memory_mb\":") != std::string::npos) + { + size_t pos = line.find(": ") + 2; + size_t end = line.find(",", pos); + data.peak_calc_memory_mb = std::stod(line.substr(pos, end - pos)); + } + else if (line.find("\"total_events\":") != std::string::npos) + { + size_t pos = line.find(": ") + 2; + size_t end = line.find(",", pos); + data.total_events = std::stoull(line.substr(pos, end - pos)); + } + else if (line.find("\"thread_count\":") != std::string::npos) + { + size_t pos = line.find(": ") + 2; + size_t end = line.find(",", pos); + data.thread_count = std::stoull(line.substr(pos, end - pos)); + } + } + + return true; +} + +// Compare current results with baseline +void compare_with_baseline(const BaselineData ¤t) +{ + BaselineData baseline; + if (!load_baseline(baseline)) + { + std::cerr << "Error: Could not load baseline file: " << g_config.baseline_file << std::endl; + return; + } + + std::cout << "\n=== Baseline Comparison ===" << std::endl; + std::cout << std::fixed << std::setprecision(2); + auto print_comparison = [](const std::string &metric, double baseline_val, double current_val, bool lower_is_better = true) + { + double diff = current_val - baseline_val; + double percent_change = (diff / baseline_val) * 100.0; + + std::string direction = (diff > 0) ? "increased" : "decreased"; + std::string indicator = (lower_is_better ? (diff > 0 ? "worse" : "better") : (diff > 0 ? "better" : "worse")); + + std::cout << metric << ":\n"; + std::cout << " Baseline: " << baseline_val << "\n"; + std::cout << " Current: " << current_val << "\n"; + std::cout << " Change: " << indicator << " - " << std::abs(percent_change) << "% " << direction << "\n\n"; + }; + + print_comparison("Accuracy Error %", baseline.accuracy_error_percent, current.accuracy_error_percent); + print_comparison("Accuracy Error (ms/event)", baseline.accuracy_error_us_per_event, current.accuracy_error_us_per_event); + print_comparison("Overhead %", std::abs(baseline.overhead_percent), std::abs(current.overhead_percent)); + print_comparison("Overhead Time (ms)", std::abs(baseline.overhead_ms), std::abs(current.overhead_ms)); + print_comparison("Overhead per Event (ns)", baseline.overhead_ns_per_event, current.overhead_ns_per_event); + print_comparison("Memory/Event (bytes)", baseline.memory_bytes_per_event, current.memory_bytes_per_event); + print_comparison("Calculation Time (ms)", baseline.calculation_time_ms, current.calculation_time_ms); + print_comparison("Peak Calc Memory (MB)", baseline.peak_calc_memory_mb, current.peak_calc_memory_mb); +} + +// Get platform string +std::string get_platform() +{ +#ifdef _WIN32 + return "Windows"; +#elif __APPLE__ + return "macOS"; +#elif __linux__ + return "Linux"; +#else + return "Unknown"; +#endif +} + +// Get current timestamp +std::string get_timestamp() +{ + auto now = std::chrono::system_clock::now(); + auto time_t = std::chrono::system_clock::to_time_t(now); + std::stringstream ss; +#ifdef _WIN32 + struct tm time_info; + localtime_s(&time_info, &time_t); + ss << std::put_time(&time_info, "%Y-%m-%d %H:%M:%S"); +#else + ss << std::put_time(std::localtime(&time_t), "%Y-%m-%d %H:%M:%S"); +#endif + return ss.str(); +} + +// Print usage +void print_usage(const char *program_name) +{ + std::cout << "Usage: " << program_name << " [options]\n"; + std::cout << "Options:\n"; + std::cout << " --events Number of events to generate (default: 50000000)\n"; + std::cout << " --threads Number of threads to use (default: hardware concurrency)\n"; + std::cout << " --baseline Baseline file path (default: ctrack_baseline.json)\n"; + std::cout << " --record-baseline Record current results as baseline\n"; + std::cout << " --compare-baseline Compare results with baseline\n"; + std::cout << " --verbose Enable verbose output\n"; + std::cout << " --help Show this help message\n"; +} + +// Parse command line arguments +bool parse_args(int argc, char *argv[]) +{ + for (int i = 1; i < argc; ++i) + { + std::string arg = argv[i]; + + if (arg == "--help") + { + print_usage(argv[0]); + return false; + } + else if (arg == "--events" && i + 1 < argc) + { + g_config.total_events = std::stoull(argv[++i]); + } + else if (arg == "--threads" && i + 1 < argc) + { + g_config.thread_count = std::stoull(argv[++i]); + } + else if (arg == "--baseline" && i + 1 < argc) + { + g_config.baseline_file = argv[++i]; + } + else if (arg == "--record-baseline") + { + g_config.record_baseline = true; + } + else if (arg == "--compare-baseline") + { + g_config.compare_baseline = true; + } + else if (arg == "--verbose") + { + g_config.verbose = true; + } + else + { + std::cerr << "Unknown option: " << arg << std::endl; + print_usage(argv[0]); + return false; + } + } + + return true; +} + +int main(int argc, char *argv[]) +{ + if (!parse_args(argc, argv)) + { + return 1; + } + + std::cout << "CTRACK Comprehensive Benchmark\n"; + std::cout << "==============================\n"; + std::cout << "Total events: " << g_config.total_events << "\n"; + std::cout << "Thread count: " << g_config.thread_count << "\n"; + std::cout << "Events per thread: " << g_config.total_events / g_config.thread_count << "\n"; + + // Run benchmarks + auto [accuracy_error_percent, accuracy_error_us_per_event] = measure_accuracy(); + auto [overhead_percent, overhead_ms, overhead_ns_per_event] = measure_overhead(); + auto [bytes_per_event, calc_time, peak_calc_memory] = measure_memory_and_calculation_time(); + + // Prepare results + BaselineData current_data; + current_data.accuracy_error_percent = accuracy_error_percent; + current_data.accuracy_error_us_per_event = accuracy_error_us_per_event; + current_data.overhead_percent = overhead_percent; + current_data.overhead_ms = overhead_ms; + current_data.overhead_ns_per_event = overhead_ns_per_event; + current_data.memory_bytes_per_event = bytes_per_event; + current_data.calculation_time_ms = calc_time; + current_data.peak_calc_memory_mb = peak_calc_memory; + current_data.total_events = g_config.total_events; + current_data.thread_count = g_config.thread_count; + current_data.timestamp = get_timestamp(); + current_data.platform = get_platform(); + + // Print summary + std::cout << "\n=== Benchmark Results ===" << std::endl; + std::cout << std::fixed << std::setprecision(2); + std::cout << "Accuracy error: " << accuracy_error_percent << "% (" << accuracy_error_us_per_event << " us per event)" << std::endl; + std::cout << "Overhead: " << overhead_percent << "% (" << overhead_ms << " ms total, " + << overhead_ns_per_event << " ns per event)" << std::endl; + std::cout << "Memory per event: " << bytes_per_event << " bytes" << std::endl; + std::cout << "Calculation time: " << calc_time << " ms" << std::endl; + std::cout << "Peak calculation memory: " << peak_calc_memory << " MB" << std::endl; + + // Handle baseline operations + if (g_config.record_baseline) + { + save_baseline(current_data); + } + + if (g_config.compare_baseline) + { + compare_with_baseline(current_data); + } + + return 0; +} diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 2e82e61..ea3cc76 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,4 +1,5 @@ +#add_compile_definitions(CTRACK_CLOCK_RDTSC) # ""=chrono # Create executables for each example add_executable(basic_singlethreaded basic_singlethreaded.cpp) add_executable(multithreaded_prime_counter multithreaded_prime_counter.cpp) diff --git a/examples/basic_singlethreaded.cpp b/examples/basic_singlethreaded.cpp index 27fcd81..802d314 100644 --- a/examples/basic_singlethreaded.cpp +++ b/examples/basic_singlethreaded.cpp @@ -43,4 +43,4 @@ int main() { ctrack::result_print(); //std::cout << ctrack::result_as_string() << std::endl; return 0; -} \ No newline at end of file +} diff --git a/include/ctrack.hpp b/include/ctrack.hpp index 52d309c..527504c 100644 --- a/include/ctrack.hpp +++ b/include/ctrack.hpp @@ -27,6 +27,7 @@ #include #include #include +#include #define CTRACK_VERSION_MAJOR 1 #define CTRACK_VERSION_MINOR 1 @@ -38,8 +39,8 @@ // Create a string version #define CTRACK_VERSION_STRING \ - TOSTRING(CTRACK_VERSION_MAJOR) \ - "_" TOSTRING(CTRACK_VERSION_MINOR) "_" TOSTRING(CTRACK_VERSION_PATCH) +TOSTRING(CTRACK_VERSION_MAJOR) \ +"_" TOSTRING(CTRACK_VERSION_MINOR) "_" TOSTRING(CTRACK_VERSION_PATCH) // Use the version string as the namespace name #define CTRACK_VERSION_NAMESPACE v##CTRACK_VERSION_MAJOR##_##CTRACK_VERSION_MINOR##_##CTRACK_VERSION_PATCH @@ -47,1211 +48,1483 @@ namespace ctrack { - inline namespace CTRACK_VERSION_NAMESPACE - { + +// Cross-platform inline + intrinsic shims (to survive from compiler optim) +#if defined(_MSC_VER) +#define CTRACK_ALWAYS_INLINE __forceinline +#elif defined(__GNUC__) || defined(__clang__) +#define CTRACK_ALWAYS_INLINE inline __attribute__((always_inline)) +#else +#define CTRACK_ALWAYS_INLINE inline +#endif + +// TSC clock backends (x86_64 only) +// otherwise, only Clock_Chrono compiles +#if defined(__x86_64__) || defined(_M_X64) + +#if defined(_MSC_VER) +#include +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#else +#include +#include +#endif + +// TSC -> ns conversion state +// Defined once inside EventHandler constructor. Then read only +inline double cycles_per_ns = 3000.0; // 3Ghz +inline std::chrono::system_clock::time_point tsc_anchor_system{}; +inline uint64_t tsc_anchor_cycles = 0; + +// CPUID wrapper +inline void ctrack_cpuid( + uint32_t leaf, + uint32_t subleaf, + uint32_t& eax, + uint32_t& ebx, + uint32_t& ecx, + uint32_t& edx) +{ +#if defined(_MSC_VER) + int regs[4]; + __cpuidex(regs, static_cast(leaf), static_cast(subleaf)); + eax = regs[0]; ebx = regs[1]; ecx = regs[2]; edx = regs[3]; +#else + __cpuid_count(leaf, subleaf, eax, ebx, ecx, edx); +#endif +} + +// C1: CPUID 0x15, exact TSC frequency. Intel Skylake+ (2015+) +inline double tsc_ghz_from_cpuid_15h() { + uint32_t a, b, c, d; + ctrack_cpuid(0, 0, a, b, c, d); + if (a < 0x15) return 0.0; + + ctrack_cpuid(0x15, 0, a, b, c, d); + // EAX = denominator, EBX = numerator, ECX = core crystal Hz + if (a == 0 || b == 0 || c == 0) return 0.0; + return (static_cast(c) * b / a) / 1e9; +} + +// C2: CPUID 0x16, base frequency in MHz. Intel Haswell+ (2013+) +inline double tsc_ghz_from_cpuid_16h() { + uint32_t a, b, c, d; + ctrack_cpuid(0, 0, a, b, c, d); + if (a < 0x16) return 0.0; + + ctrack_cpuid(0x16, 0, a, b, c, d); + uint32_t base_mhz = a & 0xFFFF; + if (base_mhz == 0) return 0.0; + return static_cast(base_mhz) / 1000.0; +} + +// C3 (Linux): intel_pstate base_frequency Intel CPU only +inline double tsc_ghz_from_sysfs_base() { +#if defined(__linux__) + std::ifstream f("/sys/devices/system/cpu/cpu0/cpufreq/base_frequency"); + if (!f) return 0.0; + double khz; + if (!(f >> khz) || khz <= 0.0) return 0.0; + return khz / 1e6; +#else + return 0.0; +#endif +} + +// C4 (Windows): registry ~MHz, set at boot from CPUID +inline double tsc_ghz_from_windows_registry() { +#if defined(_WIN32) + HKEY key; + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_READ, &key) != ERROR_SUCCESS) + return 0.0; + DWORD mhz = 0, size = sizeof(DWORD); + LONG status = RegQueryValueExA(key, "~MHz", nullptr, nullptr, reinterpret_cast(&mhz), &size); + RegCloseKey(key); + if (status != ERROR_SUCCESS || mhz == 0) return 0.0; + return static_cast(mhz) / 1000.0; +#else + return 0.0; +#endif +} + +// Calibration fallback: lightweight runtime calibration (~3ms) +// +// Last-resort fallback for AMD bare-metal and virtualized environments +// where no static frequency source is available. Three 1ms samples, +// median wins. This is the *only* path that pays a startup cost; users +// on Intel hardware will exit at C1 or C2 before reaching here. +inline double tsc_ghz_from_calibration() { + constexpr int N = 3; + double samples[N]; + + for (int i = 0; i < N; ++i) { + auto wall_t0 = std::chrono::steady_clock::now(); + uint64_t tsc_t0 = __rdtsc(); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + uint64_t tsc_t1 = __rdtsc(); + auto wall_t1 = std::chrono::steady_clock::now(); + + double ns = std::chrono::duration(wall_t1 - wall_t0).count(); + if (ns <= 0.0) { samples[i] = 0.0; continue; } + samples[i] = static_cast(tsc_t1 - tsc_t0) / ns; // cycles/ns = GHz + } + + std::sort(samples, samples + N); + return samples[N / 2]; // median rejects the worst scheduler hiccup +} + +// Master calibration: try sources in order, abort if all fail +inline void calibrate_tsc() { + double ghz = tsc_ghz_from_cpuid_15h(); + if (ghz <= 0.0) ghz = tsc_ghz_from_cpuid_16h(); + if (ghz <= 0.0) ghz = tsc_ghz_from_sysfs_base(); + if (ghz <= 0.0) ghz = tsc_ghz_from_windows_registry(); + if (ghz <= 0.0) ghz = tsc_ghz_from_calibration(); + + if (ghz <= 0.0) { + std::cerr << + "[ctrack] FATAL: TSC clock backend selected at compile time but no usable frequency source found.\n" + "[ctrack] Rebuild without CTRACK_CLOCK_RDTSC / RDTSCP / RDTSCP_LFENCE to use the chrono fallback.\n"; + std::abort(); + } + + cycles_per_ns = ghz; + tsc_anchor_cycles = __rdtsc(); + tsc_anchor_system = std::chrono::system_clock::now(); +} + +inline uint_fast64_t cycles_to_ns(uint64_t cycles) { + return static_cast(cycles / cycles_per_ns); +} + +inline std::string cycles_to_timestring(uint64_t tp) { + int64_t delta_cycles = static_cast(tp) - static_cast(tsc_anchor_cycles); + auto delta_ns = std::chrono::nanoseconds(static_cast(delta_cycles / cycles_per_ns)); + auto system_tp = tsc_anchor_system + delta_ns; + auto tt = std::chrono::system_clock::to_time_t(system_tp); + std::tm tm{}; +#if defined(_WIN32) + localtime_s(&tm, &tt); +#else + localtime_r(&tt, &tm); +#endif + std::ostringstream oss; + oss << std::put_time(&tm, "%Y-%m-%d %H:%M:%S"); + return oss.str(); +} + +#if defined(CTRACK_CLOCK_RDTSC) +struct Clock_RDTSC { + using time_point = uint64_t; + CTRACK_ALWAYS_INLINE static time_point NOW() { return __rdtsc(); } + static inline uint_fast64_t duration_ns(time_point s, time_point e) { return cycles_to_ns(e - s); } + static inline std::string to_string(const time_point &tp) { return cycles_to_timestring(tp); } +}; +using ActiveClock = Clock_RDTSC; +#elif defined(CTRACK_CLOCK_RDTSCP) +struct Clock_RDTSCP { + using time_point = uint64_t; + CTRACK_ALWAYS_INLINE static time_point NOW() { unsigned int aux; return __rdtscp(&aux); } + static inline uint_fast64_t duration_ns(time_point s, time_point e) { return cycles_to_ns(e - s); } + static inline std::string to_string(const time_point &tp) { return cycles_to_timestring(tp); } +}; +using ActiveClock = Clock_RDTSCP; +#elif defined(CTRACK_CLOCK_RDTSCP_LFENCE) +struct Clock_RDTSCP_LFENCE { + using time_point = uint64_t; + CTRACK_ALWAYS_INLINE static time_point NOW() { _mm_lfence(); unsigned int aux; return __rdtscp(&aux); } + static inline uint_fast64_t duration_ns(time_point s, time_point e) { return cycles_to_ns(e - s); } + static inline std::string to_string(const time_point &tp) { return cycles_to_timestring(tp); } +}; +using ActiveClock = Clock_RDTSCP_LFENCE; +#endif + +#else // not x86_64 + +// Hard-fail at compile time if a TSC backend is requested on a non-x86 build. +#if defined(CTRACK_CLOCK_RDTSC) || defined(CTRACK_CLOCK_RDTSCP) || defined(CTRACK_CLOCK_RDTSCP_LFENCE) +#error "CTRACK_CLOCK_RDTSC* requires x86_64. Remove the macro to use Clock_Chrono." +#endif + +#endif // x86_64 + +// ── Chrono fallback (default if no TSC backend selected) ───────────────── +#if !defined(CTRACK_CLOCK_RDTSC) && !defined(CTRACK_CLOCK_RDTSCP) && !defined(CTRACK_CLOCK_RDTSCP_LFENCE) +struct Clock_Chrono { + using time_point = std::chrono::high_resolution_clock::time_point; + CTRACK_ALWAYS_INLINE static time_point NOW() { + return std::chrono::high_resolution_clock::now(); + } + static inline uint_fast64_t duration_ns(time_point s, time_point e) { + return std::chrono::duration_cast(e - s).count(); + } + static inline std::string to_string(const time_point &tp) { + auto system_tp = std::chrono::system_clock::now() + + std::chrono::duration_cast( + tp - std::chrono::high_resolution_clock::now()); + auto tt = std::chrono::system_clock::to_time_t(system_tp); + std::tm tm{}; +#if defined(_WIN32) + localtime_s(&tm, &tt); +#else + localtime_r(&tt, &tm); +#endif + std::ostringstream oss; + oss << std::put_time(&tm, "%Y-%m-%d %H:%M:%S"); + return oss.str(); + } +}; +using ActiveClock = Clock_Chrono; +#endif // chrono + + +inline namespace CTRACK_VERSION_NAMESPACE +{ #ifndef CTRACK_DISABLE_EXECUTION_POLICY - constexpr auto execution_policy = std::execution::par_unseq; +constexpr auto execution_policy = std::execution::par_unseq; #define OPT_EXEC_POLICY execution_policy, #else #define OPT_EXEC_POLICY #endif - template - auto sum_field(const std::vector &vec, Field T::*field) - { - using FieldType = std::decay_t().*field)>; - return std::transform_reduce( - OPT_EXEC_POLICY - vec.begin(), - vec.end(), - FieldType{}, - std::plus<>(), - [field](const auto &item) - { return item.*field; }); - } - - template - auto sum_squared_field(const std::vector &values, Field T::*field) - { - using FieldType = std::decay_t().*field)>; - return std::transform_reduce( - OPT_EXEC_POLICY - values.begin(), - values.end(), - FieldType{}, - std::plus<>(), - [field](const T &v) - { - return (v.*field) * (v.*field); - }); - } - - template - double calculate_std_dev_field(std::vector &values, Field T::*field, const double mean) - { - double res = std::transform_reduce( - OPT_EXEC_POLICY - values.begin(), - values.end(), - 0.0, - std::plus<>(), - [mean, field](const T &v) - { - return std::pow(static_cast(v.*field) - mean, 2); - }); - - return sqrt(res / values.size()); - } - - template - auto get_distinct_field_values(const std::vector &vec, Field T::*field) - { - std::set().*field)>> distinct_values; - - std::transform(vec.begin(), vec.end(), - std::inserter(distinct_values, distinct_values.end()), - [field](const T *item) - { return item->*field; }); - return distinct_values; - } - - template - auto get_distinct_field_values(const std::vector &vec, Field T::*field) - { - std::set().*field)>> distinct_values; - - std::transform(vec.begin(), vec.end(), - std::inserter(distinct_values, distinct_values.end()), - [field](const T &item) - { return item.*field; }); - return distinct_values; - } - - template - size_t count_distinct_field_values(const std::vector &vec, Field T::*field) - { - return get_distinct_field_values(vec, field).size(); - } - - template - void order_pointer_vector_by_field(std::vector &vec, MemberType StructType::*member, bool asc = true) - { - std::sort(OPT_EXEC_POLICY vec.begin(), vec.end(), - [member, asc](const StructType *a, const StructType *b) - { - if (asc) - return (a->*member) < (b->*member); - else - return (a->*member) > (b->*member); - }); - } - - template - size_t countAllEvents(const std::deque> &events) - { - return std::transform_reduce( - OPT_EXEC_POLICY - events.begin(), - events.end(), - size_t(0), - std::plus<>(), - [](const auto &vec) - { - return vec.size(); - }); - } - - struct ColorScheme - { - std::string border_color; - std::string header_color; - std::string top_header_color; - std::string row_color; - - ColorScheme(const std::string &border, - const std::string &header, - const std::string &top_header, - const std::string &row) - : border_color(border), - header_color(header), - top_header_color(top_header), - row_color(row) {} - }; - - static inline const ColorScheme default_colors{ - "\033[38;5;24m", // Darker Blue (Border) - "\033[1;38;5;135m", // Purple (Header) - "\033[1;38;5;92m", // Darker Purple (Top Header) - "\033[38;5;39m" // Light Blue (Row) - }; - - // Alternate color scheme (still nice to read on terminals) - static inline const ColorScheme alternate_colors{ - "\033[38;5;28m", // Dark Green (Border) - "\033[1;38;5;208m", // Orange (Header) - "\033[1;38;5;130m", // Dark Orange (Top Header) - "\033[38;5;71m" // Light Green (Row) - }; - - class BeautifulTable - { - private: - std::vector> top_header; - std::vector header; - std::vector> rows; - std::vector columnWidths; - bool useColor; - ColorScheme colors; - static inline const std::string RESET_COLOR = "\033[0m"; - - void updateColumnWidths(const std::vector &row) - { - for (size_t i = 0; i < row.size(); ++i) - { - if (i >= columnWidths.size()) - { - columnWidths.push_back(row[i].length()); - } - else - { - columnWidths[i] = std::max(columnWidths[i], row[i].length()); - } - } - } - - template - void printHorizontalLine(StreamType &stream) const - { - if (useColor) - stream << colors.border_color; - stream << "+"; - for (size_t width : columnWidths) - { - stream << std::string(width + 2, '-') << "+"; - } - if (useColor) - stream << RESET_COLOR; - stream << "\n"; - } - - template - void printRow(StreamType &stream, const std::vector &row, const std::string &color, bool center = false) const - { - if (useColor) - stream << colors.border_color; - stream << "|"; - if (useColor) - stream << RESET_COLOR << color; - for (size_t i = 0; i < row.size(); ++i) - { - if (center) - { - size_t padding = columnWidths[i] - row[i].length(); - size_t leftPadding = padding / 2; - size_t rightPadding = padding - leftPadding; - stream << std::string(leftPadding + 1, ' ') << row[i] << std::string(rightPadding + 1, ' '); - } - else - { - stream << " " << std::setw(static_cast(columnWidths[i])) << std::right << row[i] << " "; - } - if (useColor) - stream << RESET_COLOR << colors.border_color; - stream << "|"; - if (useColor) - stream << RESET_COLOR << color; - } - if (useColor) - stream << RESET_COLOR; - stream << "\n"; - } - - template - void printRow(StreamType &stream, const std::vector> &row, const std::string &color) const - { - if (useColor) - stream << colors.border_color; - stream << "|"; - if (useColor) - stream << RESET_COLOR << color; - int y = 0; - for (size_t i = 0; i < row.size(); ++i) - { - size_t sum = row[i].second - 1; - for (int x = y; x < y + row[i].second; x++) - { - sum += columnWidths[x] + 2; - } - y += row[i].second; - - size_t textWidth = row[i].first.length(); - size_t totalPadding = sum - textWidth; - size_t leftPadding = totalPadding / 2; - size_t rightPadding = totalPadding - leftPadding; - - // Print left padding - stream << std::string(leftPadding, ' '); - - // Print text - stream << row[i].first; - - // Print right padding - stream << std::string(rightPadding, ' '); - if (useColor) - stream << RESET_COLOR << colors.border_color; - stream << "|"; - if (useColor) - stream << RESET_COLOR << color; - } - if (useColor) - stream << RESET_COLOR; - stream << "\n"; - } - - public: - BeautifulTable(const std::vector &headerColumns, bool enableColor = false, const ColorScheme &colors = default_colors, const std::vector> &top_header = {}) - : top_header(top_header), header(headerColumns), useColor(enableColor), colors(colors) - { - updateColumnWidths(header); - } - - void addRow(const std::vector &row) - { - if (row.size() != header.size()) - { - throw std::invalid_argument("Row size must match header size"); - } - rows.push_back(row); - updateColumnWidths(row); - } - - template - void print(StreamType &stream) const - { - if (top_header.size() > 0) - { - printHorizontalLine(stream); - printRow(stream, top_header, colors.top_header_color); - } - printHorizontalLine(stream); - printRow(stream, header, colors.header_color, true); - printHorizontalLine(stream); - for (const auto &row : rows) - { - printRow(stream, row, colors.row_color); - printHorizontalLine(stream); - } - } - - template - static inline std::string table_string(const T &value) - { - std::ostringstream oss; - oss << value; - return oss.str(); - } - - static inline std::string table_time(uint_fast64_t nanoseconds) - { - return table_time(static_cast(nanoseconds)); - } - - static inline std::string table_time(double nanoseconds) - { - const char *units[] = {"ns", "mcs", "ms", "s"}; - int unit = 0; - double value = static_cast(nanoseconds); - while (value >= 1000 && unit < 3) - { - value /= 1000; - unit++; - } - std::ostringstream oss; - oss << std::fixed << std::setprecision(2) << value << " " << units[unit]; - return oss.str(); - } - - static inline std::string table_percentage(uint_fast64_t value, uint_fast64_t total) - { - if (total == 0) - { - return "nan%"; - } - - // Calculate the percentage - double percentage = (static_cast(value) / total) * 100.0; - - // Format the percentage as a string with 2 decimal places - std::ostringstream ss; - ss << std::fixed << std::setprecision(2) << percentage << "%"; - - return ss.str(); - } - - static inline std::string table_timepoint(const std::chrono::high_resolution_clock::time_point &tp) - { - auto system_tp = std::chrono::system_clock::now() + - std::chrono::duration_cast( - tp - std::chrono::high_resolution_clock::now()); - - auto tt = std::chrono::system_clock::to_time_t(system_tp); - std::tm tm{}; +template +auto sum_field(const std::vector &vec, Field T::*field) +{ + using FieldType = std::decay_t().*field)>; + return std::transform_reduce( + OPT_EXEC_POLICY + vec.begin(), + vec.end(), + FieldType{}, + std::plus<>(), + [field](const auto &item) + { return item.*field; } + ); +} -#if defined(_WIN32) - localtime_s(&tm, &tt); -#else - localtime_r(&tt, &tm); +template +auto sum_squared_field(const std::vector &values, Field T::*field) +{ + using FieldType = std::decay_t().*field)>; + return std::transform_reduce( + OPT_EXEC_POLICY + values.begin(), + values.end(), + FieldType{}, + std::plus<>(), + [field](const T &v) + { + return (v.*field) * (v.*field); + } + ); +} + +template +double calculate_std_dev_field(std::vector &values, Field T::*field, const double mean) +{ + double res = std::transform_reduce( + OPT_EXEC_POLICY + values.begin(), + values.end(), + 0.0, + std::plus<>(), + [mean, field](const T &v) + { + return std::pow(static_cast(v.*field) - mean, 2); + } + ); + + return sqrt(res / values.size()); +} + +template +auto get_distinct_field_values(const std::vector &vec, Field T::*field) +{ + std::set().*field)>> distinct_values; + + std::transform( + vec.begin(), vec.end(), + std::inserter(distinct_values, distinct_values.end()), + [field](const T *item) + { return item->*field; } + ); + return distinct_values; +} + +template +auto get_distinct_field_values(const std::vector &vec, Field T::*field) +{ + std::set().*field)>> distinct_values; + + std::transform( + vec.begin(), vec.end(), + std::inserter(distinct_values, distinct_values.end()), + [field](const T &item) + { return item.*field; } + ); + return distinct_values; +} + +template +size_t count_distinct_field_values(const std::vector &vec, Field T::*field) +{ + return get_distinct_field_values(vec, field).size(); +} + +template +void order_pointer_vector_by_field(std::vector &vec, MemberType StructType::*member, bool asc = true) +{ + std::sort( + OPT_EXEC_POLICY vec.begin(), vec.end(), + [member, asc](const StructType *a, const StructType *b){ + if (asc) + return (a->*member) < (b->*member); + else + return (a->*member) > (b->*member); + }); +} + +template +size_t countAllEvents(const std::deque> &events) +{ + return std::transform_reduce( + OPT_EXEC_POLICY + events.begin(), + events.end(), + size_t(0), + std::plus<>(), + [](const auto &vec) + { + return vec.size(); + }); +} + +struct ColorScheme +{ + std::string border_color; + std::string header_color; + std::string top_header_color; + std::string row_color; + + ColorScheme(const std::string &border, + const std::string &header, + const std::string &top_header, + const std::string &row) + : border_color(border), + header_color(header), + top_header_color(top_header), + row_color(row) + {} +}; + +static inline const ColorScheme default_colors{ + "\033[38;5;24m", // Darker Blue (Border) + "\033[1;38;5;135m", // Purple (Header) + "\033[1;38;5;92m", // Darker Purple (Top Header) + "\033[38;5;39m" // Light Blue (Row) +}; + +// Alternate color scheme (still nice to read on terminals) +static inline const ColorScheme alternate_colors{ + "\033[38;5;28m", // Dark Green (Border) + "\033[1;38;5;208m", // Orange (Header) + "\033[1;38;5;130m", // Dark Orange (Top Header) + "\033[38;5;71m" // Light Green (Row) +}; + +class BeautifulTable +{ +private: + std::vector> top_header; + std::vector header; + std::vector> rows; + std::vector columnWidths; + bool useColor; + ColorScheme colors; + static inline const std::string RESET_COLOR = "\033[0m"; + + void updateColumnWidths(const std::vector &row) + { + for (size_t i = 0; i < row.size(); ++i) + { + if (i >= columnWidths.size()) + { + columnWidths.push_back(row[i].length()); + } + else + { + columnWidths[i] = std::max(columnWidths[i], row[i].length()); + } + } + } + + template + void printHorizontalLine(StreamType &stream) const + { + if (useColor) + stream << colors.border_color; + stream << "+"; + for (size_t width : columnWidths) + { + stream << std::string(width + 2, '-') << "+"; + } + if (useColor) + stream << RESET_COLOR; + stream << "\n"; + } + + template + void printRow(StreamType &stream, const std::vector &row, const std::string &color, bool center = false) const + { + if (useColor) + stream << colors.border_color; + stream << "|"; + if (useColor) + stream << RESET_COLOR << color; + for (size_t i = 0; i < row.size(); ++i) + { + if (center) + { + size_t padding = columnWidths[i] - row[i].length(); + size_t leftPadding = padding / 2; + size_t rightPadding = padding - leftPadding; + stream << std::string(leftPadding + 1, ' ') << row[i] << std::string(rightPadding + 1, ' '); + } + else + { + stream << " " << std::setw(static_cast(columnWidths[i])) << std::right << row[i] << " "; + } + if (useColor) + stream << RESET_COLOR << colors.border_color; + stream << "|"; + if (useColor) + stream << RESET_COLOR << color; + } + if (useColor) + stream << RESET_COLOR; + stream << "\n"; + } + + template + void printRow(StreamType &stream, const std::vector> &row, const std::string &color) const + { + if (useColor) + stream << colors.border_color; + stream << "|"; + if (useColor) + stream << RESET_COLOR << color; + int y = 0; + for (size_t i = 0; i < row.size(); ++i) + { + size_t sum = row[i].second - 1; + for (int x = y; x < y + row[i].second; x++) + { + sum += columnWidths[x] + 2; + } + y += row[i].second; + + size_t textWidth = row[i].first.length(); + size_t totalPadding = sum - textWidth; + size_t leftPadding = totalPadding / 2; + size_t rightPadding = totalPadding - leftPadding; + + // Print left padding + stream << std::string(leftPadding, ' '); + + // Print text + stream << row[i].first; + + // Print right padding + stream << std::string(rightPadding, ' '); + if (useColor) + stream << RESET_COLOR << colors.border_color; + stream << "|"; + if (useColor) + stream << RESET_COLOR << color; + } + if (useColor) + stream << RESET_COLOR; + stream << "\n"; + } + +public: + BeautifulTable(const std::vector &headerColumns, bool enableColor = false, const ColorScheme &colors = default_colors, const std::vector> &top_header = {}) + : top_header(top_header), header(headerColumns), useColor(enableColor), colors(colors) + { + updateColumnWidths(header); + } + + void addRow(const std::vector &row) + { + if (row.size() != header.size()) + { + throw std::invalid_argument("Row size must match header size"); + } + rows.push_back(row); + updateColumnWidths(row); + } + + template + void print(StreamType &stream) const + { + if (top_header.size() > 0) + { + printHorizontalLine(stream); + printRow(stream, top_header, colors.top_header_color); + } + printHorizontalLine(stream); + printRow(stream, header, colors.header_color, true); + printHorizontalLine(stream); + for (const auto &row : rows) + { + printRow(stream, row, colors.row_color); + printHorizontalLine(stream); + } + } + + template + static inline std::string table_string(const T &value) + { + std::ostringstream oss; + oss << value; + return oss.str(); + } + + static inline std::string table_time(uint_fast64_t nanoseconds) + { + return table_time(static_cast(nanoseconds)); + } + + static inline std::string table_time(double nanoseconds) + { + const char *units[] = {"ns", "us", "ms", "s"}; + int unit = 0; + double value = static_cast(nanoseconds); + while (value >= 1000 && unit < 3) + { + value /= 1000; + unit++; + } + std::ostringstream oss; + oss << std::fixed << std::setprecision(2) << value << " " << units[unit]; + return oss.str(); + } + + static inline std::string table_percentage(uint_fast64_t value, uint_fast64_t total) + { + if (total == 0) + { + return "nan%"; + } + + // Calculate the percentage + double percentage = (static_cast(value) / total) * 100.0; + + // Format the percentage as a string with 2 decimal places + std::ostringstream ss; + ss << std::fixed << std::setprecision(2) << percentage << "%"; + + return ss.str(); + } + + static inline std::string table_timepoint(const ActiveClock::time_point &tp) + { + return ActiveClock::to_string(tp); + } + + static inline std::string stable_shortenPath(const std::string &fullPath, size_t maxLength = 35) + { + namespace fs = std::filesystem; + + fs::path path(fullPath); + std::string filename = path.filename().string(); + + if (filename.length() <= maxLength) + { + return filename; + } + + // If filename is too long, truncate it and add ... + return filename.substr(0, maxLength - 3) + "..."; + } + + using bt = BeautifulTable; +}; + + + + + + +struct Event +{ + ActiveClock::time_point start_time; + ActiveClock::time_point end_time; + int line; + int thread_id; + std::string_view filename; + std::string_view function; + unsigned int event_id; + + Event(const ActiveClock::time_point &start_time, const ActiveClock::time_point &end_time, const std::string_view filename, const int line, const std::string_view function, const int thread_id, const unsigned int event_id) + : start_time(start_time), end_time(end_time), line(line), thread_id(thread_id), filename(filename), function(function), event_id(event_id) + {} +}; + +struct Simple_Event +{ + uint_fast64_t duration = 0; + ActiveClock::time_point start_time{}; + int_fast64_t unique_id = 0; + ActiveClock::time_point end_time{}; + Simple_Event(const ActiveClock::time_point &start_time, const ActiveClock::time_point &end_time, const uint_fast64_t duration, const int_fast64_t unique_id) : duration(duration), start_time(start_time), unique_id(unique_id), end_time(end_time) {} + Simple_Event() {} +}; + +inline bool cmp_simple_event_by_duration_asc(const Simple_Event &a, const Simple_Event &b) +{ + return a.duration < b.duration; +} +inline bool cmp_simple_event_by_start_time_asc(const Simple_Event &a, const Simple_Event &b) +{ + return a.start_time < b.start_time; +} + +inline uint_fast64_t get_unique_event_id(unsigned int thread_id, unsigned int event_id) +{ + uint_fast64_t uniqueId = static_cast(thread_id); + uniqueId = uniqueId << 32; + uniqueId += static_cast(event_id); + return uniqueId; +} + +inline std::vector create_simple_events(const std::vector &events) +{ + std::vector simple_events{}; + simple_events.resize(events.size()); + std::transform( + OPT_EXEC_POLICY + events.begin(), + events.end(), + simple_events.begin(), + [](const Event &event) + { + Simple_Event simple_event(event.start_time, event.end_time, ActiveClock::duration_ns(event.start_time, event.end_time), get_unique_event_id(event.thread_id, event.event_id)); + return simple_event; + }); + return simple_events; +} + +inline std::vector create_simple_events(const std::vector &events) +{ + std::vector simple_events{}; + simple_events.resize(events.size()); + std::transform( + OPT_EXEC_POLICY + events.begin(), + events.end(), + simple_events.begin(), + [](const Event *event){ + Simple_Event simple_event(event->start_time, event->end_time, ActiveClock::duration_ns(event->start_time, event->end_time), get_unique_event_id(event->thread_id, event->event_id)); + return simple_event; + }); + return simple_events; +} + +// requires already sorted +inline std::vector sorted_create_grouped_simple_events(const std::vector &events) +{ + std::vector result{}; + if (events.size() == 0) + return result; + result.push_back(events[0]); + unsigned int current_idx = 0; + + for (size_t i = 1; i < events.size(); i++) + { + if (result[current_idx].end_time >= events[i].start_time) + { + result[current_idx].end_time = std::max(result[current_idx].end_time, events[i].end_time); + } + else + { + result.push_back(events[i]); + current_idx++; + } + } + + for (auto &entry : result) + { + entry.duration = ActiveClock::duration_ns(entry.start_time, entry.end_time); + } + + return result; +} + +inline std::vector load_child_events_simple(const std::vector &parent_events_simple, + const std::unordered_map &events_map, + const std::unordered_map> &child_graph) +{ + std::vector child_events{}; + + for (const auto &simple_parent_event : parent_events_simple) + { + auto it = child_graph.find(simple_parent_event.unique_id); + if (it != child_graph.end()) + { + auto &parent_event = events_map.at(simple_parent_event.unique_id); + for (auto &child_id : it->second) + { + auto &child_event = events_map.at(child_id); + if (child_event->filename == parent_event->filename && + child_event->function == parent_event->function && + child_event->line == parent_event->line) + continue; + + child_events.push_back(child_event); + } + } + } + + return create_simple_events(child_events); +}; + +class EventGroup +{ +public: + void calculateStats(unsigned int non_center_percent, const std::unordered_map &events_map, const std::unordered_map> &child_graph) + { + if (all_events.size() == 0) + return; + + + auto all_events_simple = create_simple_events(all_events); + std::sort(OPT_EXEC_POLICY all_events_simple.begin(), all_events_simple.end(), cmp_simple_event_by_duration_asc); + all_cnt = static_cast(all_events_simple.size()); + const double factor = (1.0 / static_cast(all_cnt)); + + auto all_child_events_simple = load_child_events_simple(all_events_simple, events_map, child_graph); + + all_time_acc = sum_field(all_events_simple, &Simple_Event::duration); + + const double all_mean = all_time_acc * factor; + if (std::fpclassify(all_mean) == FP_ZERO) + return; + + all_st = calculate_std_dev_field(all_events_simple, &Simple_Event::duration, all_mean); // std::sqrt(all_variance); + all_cv = all_st / all_mean; + + all_thread_cnt = static_cast(get_distinct_field_values(all_events, &Event::thread_id).size()); + unsigned int amount_non_center = all_cnt * non_center_percent / 100; + + fastest_range = non_center_percent; + slowest_range = 100 - non_center_percent; + + std::vector fastest_events_simple, slowest_events_simple, center_events_simple; + fastest_events_simple.reserve(amount_non_center); + slowest_events_simple.reserve(amount_non_center); + if (all_cnt > 2) + center_events_simple.reserve(all_cnt - 2 * amount_non_center); + + for (unsigned int i = 0; i < all_events_simple.size(); i++) + { + if (i < amount_non_center) + { + fastest_events_simple.push_back(all_events_simple[i]); + } + else if (i >= all_cnt - amount_non_center) + { + slowest_events_simple.push_back(all_events_simple[i]); + } + else + { + center_events_simple.push_back(all_events_simple[i]); + } + } + if (amount_non_center > 0) + { + // fastest + fastest_min = fastest_events_simple[0].duration; + fastest_mean = sum_field(fastest_events_simple, &Simple_Event::duration) / static_cast(amount_non_center); + + // slowest + slowest_max = slowest_events_simple[slowest_events_simple.size() - 1].duration; + slowest_mean = sum_field(slowest_events_simple, &Simple_Event::duration) / static_cast(amount_non_center); + } + + // center + center_min = center_events_simple[0].duration; + center_max = center_events_simple[center_events_simple.size() - 1].duration; + center_mean = sum_field(center_events_simple, &Simple_Event::duration) / static_cast(center_events_simple.size()); + if (center_events_simple.size() % 2 == 1) + center_med = center_events_simple[center_events_simple.size() / 2].duration; + else + center_med = (center_events_simple[center_events_simple.size() / 2].duration + center_events_simple[center_events_simple.size() / 2 - 1].duration) / 2; + + auto center_child_events_simple = load_child_events_simple(center_events_simple, events_map, child_graph); + + std::sort(OPT_EXEC_POLICY center_events_simple.begin(), center_events_simple.end(), cmp_simple_event_by_start_time_asc); + center_grouped = sorted_create_grouped_simple_events(center_events_simple); + center_time_active = sum_field(center_grouped, &Simple_Event::duration); + + std::sort(OPT_EXEC_POLICY center_child_events_simple.begin(), center_child_events_simple.end(), cmp_simple_event_by_start_time_asc); + auto center_child_events_grouped = sorted_create_grouped_simple_events(center_child_events_simple); + center_time_active_exclusive = center_time_active - sum_field(center_child_events_grouped, &Simple_Event::duration); + + std::sort(OPT_EXEC_POLICY all_events_simple.begin(), all_events_simple.end(), cmp_simple_event_by_start_time_asc); + all_grouped = sorted_create_grouped_simple_events(all_events_simple); + all_time_active = sum_field(all_grouped, &Simple_Event::duration); + + std::sort(OPT_EXEC_POLICY all_child_events_simple.begin(), all_child_events_simple.end(), cmp_simple_event_by_start_time_asc); + auto all_child_events_grouped = sorted_create_grouped_simple_events(all_child_events_simple); + all_time_active_exclusive = all_time_active - sum_field(all_child_events_grouped, &Simple_Event::duration); + } + + // all_group + + double all_cv = 0.0; + double all_st = 0.0; + + unsigned int all_cnt = 0; + uint_fast64_t all_time_acc = 0; + uint_fast64_t all_time_active = 0; + uint_fast64_t all_time_active_exclusive = 0; + unsigned int all_thread_cnt = 0; + std::vector all_grouped = {}; + std::vector all_events = {}; + + // fastest_group + unsigned int fastest_range = 0; + uint_fast64_t fastest_min = 0; + double fastest_mean = 0.0; + + // slowest group + unsigned int slowest_range = 0; + uint_fast64_t slowest_max = 0; + double slowest_mean = 0.0; + + // center group + + uint_fast64_t center_min = 0; + uint_fast64_t center_max = 0; + uint_fast64_t center_med = 0; + double center_mean = 0; + uint_fast64_t center_time_active = 0; + uint_fast64_t center_time_active_exclusive = 0; + std::vector center_grouped = {}; + + std::string filename = {}; + std::string function_name = {}; + int line = 0; + +private: +}; + +typedef std::vector t_events; +typedef std::map> sub_events; + +struct store +{ + inline static std::atomic write_events_locked = false; + inline static std::mutex event_mutex; + inline static ActiveClock::time_point track_start_time = ActiveClock::NOW(); + inline static std::atomic store_clear_cnt = 0; + + inline static std::atomic thread_cnt = -1; + inline static std::deque a_events{}; + inline static std::deque a_sub_events{}; + + inline static std::deque a_current_event_id{}, a_current_event_cnt{}, a_string_id{}; + + inline static std::deque a_thread_ids{}; +}; +inline thread_local t_events *event_ptr = nullptr; +inline thread_local sub_events *sub_events_ptr = nullptr; + +inline thread_local unsigned int *current_event_id = nullptr; +inline thread_local unsigned int *current_event_cnt = nullptr; +inline thread_local unsigned int *string_id = nullptr; + +inline thread_local int *thread_id = nullptr; + +typedef std::map line_result; +typedef std::map function_result; +typedef std::map filename_result; + +struct ctrack_result_settings +{ + unsigned int non_center_percent = 1; + double min_percent_active_exclusive = 0.0; // between 0-100 + double percent_exclude_fastest_active_exclusive = 0.0; // between 0-100 +}; + +struct summary_row +{ + std::string filename; + std::string function_name; + int line{}; + int calls{}; + double percent_ae_bracket{}; // ae[center]% by configuration + double percent_ae_all{}; // ae[0-100]% + std::chrono::nanoseconds time_ae_all{}; + std::chrono::nanoseconds time_a_all{}; +}; + +struct summary_table +{ + std::vector rows; +}; + +struct detail_stats +{ + // Info fields + std::string filename; + std::string function_name; + int line{}; + std::chrono::nanoseconds time_acc{}; // Simple sum of all execution times (can exceed wall clock in MT) + std::chrono::nanoseconds sd{}; // Standard deviation + double cv{}; // Coefficient of variation (sd/mean) + int calls{}; // Total number of calls + int threads{}; // Number of different threads that called this function + + // Summary-like fields (for unified access) + double percent_ae_bracket{}; // ae[center]% as percentage of total time + double percent_ae_all{}; // ae[0-100]% as percentage of total time + std::chrono::nanoseconds time_ae_all{}; // Active exclusive time (wall clock minus child functions) + std::chrono::nanoseconds time_a_all{}; // Active time (actual wall clock time, handles MT overlap) + + // Fastest/Center/Slowest stats + std::chrono::nanoseconds fastest_min{}; + std::chrono::nanoseconds fastest_mean{}; + std::chrono::nanoseconds center_min{}; + std::chrono::nanoseconds center_mean{}; + std::chrono::nanoseconds center_med{}; + std::chrono::nanoseconds center_time_a{}; // Active time for center range + std::chrono::nanoseconds center_time_ae{}; // Active exclusive time for center range + std::chrono::nanoseconds center_max{}; + std::chrono::nanoseconds slowest_mean{}; + std::chrono::nanoseconds slowest_max{}; + + // Percentile ranges for reference + unsigned int fastest_range{}; + unsigned int slowest_range{}; +}; + +struct detail_table +{ + std::vector rows; +}; + +struct ctrack_result_tables +{ + // Meta information + ActiveClock::time_point start_time; + ActiveClock::time_point end_time; + std::chrono::nanoseconds time_total{}; + std::chrono::nanoseconds time_ctracked{}; + + // Table data + summary_table summary; + detail_table details; + + // Settings used + ctrack_result_settings settings; +}; + +class ctrack_result +{ +public: + ctrack_result(const ctrack_result_settings &settings, const ActiveClock::time_point &track_start_time, const ActiveClock::time_point &track_end_time) : settings(settings), track_start_time(track_start_time), track_end_time(track_end_time) + { + time_total = ActiveClock::duration_ns(track_start_time, track_end_time); + center_intervall_str = "[" + std::to_string(settings.non_center_percent) + "-" + std::to_string(100 - settings.non_center_percent) + "]"; + } + + template + void get_summary_table(StreamType &stream, bool use_color = false) + { + BeautifulTable info({ + "Start", + "End", + "time total", + "time ctracked", + "time ctracked %", + }, use_color, alternate_colors); + + info.addRow({BeautifulTable::table_timepoint(tables.start_time), + BeautifulTable::table_timepoint(tables.end_time), + BeautifulTable::table_time(static_cast(tables.time_total.count())), + BeautifulTable::table_time(static_cast(tables.time_ctracked.count())), + BeautifulTable::table_percentage(static_cast(tables.time_ctracked.count()), static_cast(tables.time_total.count()))}); + + info.print(stream); + BeautifulTable table({ + "filename", + "function", + "line", + "calls", + "ae" + center_intervall_str + "%", + "ae[0-100]%", + "time ae[0-100]", + "time a[0-100]"}, use_color, alternate_colors); + + for (const auto &row : tables.summary.rows) + { + table.addRow({ + BeautifulTable::stable_shortenPath(row.filename), + row.function_name, + BeautifulTable::table_string(row.line), + BeautifulTable::table_string(row.calls), + BeautifulTable::table_percentage(static_cast(row.percent_ae_bracket * tables.time_total.count() / 100.0), tables.time_total.count()), + BeautifulTable::table_percentage(static_cast(row.percent_ae_all * tables.time_total.count() / 100.0), tables.time_total.count()), + BeautifulTable::table_time(static_cast(row.time_ae_all.count())), + BeautifulTable::table_time(static_cast(row.time_a_all.count())) + }); + } + + table.print(stream); + } + + template + void get_detail_table(StreamType &stream, bool use_color = false, bool reverse_vector = false) + { + auto details_copy = tables.details.rows; + if (reverse_vector) + { + std::reverse(details_copy.begin(), details_copy.end()); + } + for (int i = static_cast(details_copy.size()) - 1; i >= 0; i--) + { + const auto &detail = details_copy[i]; + + BeautifulTable info({"filename", "function", "line", "time acc", "sd", "cv", "calls", "threads"}, + use_color, default_colors); + info.addRow({ + BeautifulTable::stable_shortenPath(detail.filename), + detail.function_name, + BeautifulTable::table_string(detail.line), + BeautifulTable::table_time(static_cast(detail.time_acc.count())), + BeautifulTable::table_time(static_cast(detail.sd.count())), + BeautifulTable::table_string(detail.cv), + BeautifulTable::table_string(detail.calls), + BeautifulTable::table_string(detail.threads) + }); + + const auto fastest_header = "fastest[0-" + std::to_string(detail.fastest_range) + "]%"; + const auto center_header = "center" + center_intervall_str + "%"; + const auto slowest_header = "slowest[" + std::to_string(detail.slowest_range) + "-100]%"; + + BeautifulTable table( + {"min", "mean", "min", "mean", "med", "time a", "time ae", "max", "mean", "max"}, + use_color, + default_colors, + { + {fastest_header, 2}, + {center_header, 6}, + {slowest_header, 2} + } + ); + + table.addRow({ + BeautifulTable::table_time(static_cast(detail.fastest_min.count())), + BeautifulTable::table_time(static_cast(detail.fastest_mean.count())), + BeautifulTable::table_time(static_cast(detail.center_min.count())), + BeautifulTable::table_time(static_cast(detail.center_mean.count())), + BeautifulTable::table_time(static_cast(detail.center_med.count())), + BeautifulTable::table_time(static_cast(detail.center_time_a.count())), + BeautifulTable::table_time(static_cast(detail.center_time_ae.count())), + BeautifulTable::table_time(static_cast(detail.center_max.count())), + BeautifulTable::table_time(static_cast(detail.slowest_mean.count())), + BeautifulTable::table_time(static_cast(detail.slowest_max.count())) + }); + info.print(stream); + table.print(stream); + + stream << std::endl; + } + } + + void calculate_stats() + { + std::vector grouped_events{}; + for (auto &[filename, filename_entry] : f_res) + { + ctracked_files++; + for (auto &[function, function_entry] : filename_entry) + { + ctracked_functions++; + for (auto &[line, line_entry] : function_entry) + { + ctracked_uses++; + line_entry.filename = filename; + line_entry.function_name = function; + line_entry.line = line; + line_entry.calculateStats(settings.non_center_percent, a_events, child_graph); + sorted_events.push_back(&line_entry); + grouped_events.insert(grouped_events.end(), line_entry.all_grouped.begin(), line_entry.all_grouped.end()); + } + } + } + + std::sort(OPT_EXEC_POLICY grouped_events.begin(), grouped_events.end(), cmp_simple_event_by_start_time_asc); + auto all_grouped = sorted_create_grouped_simple_events(grouped_events); + sum_time_active_exclusive = sum_field(all_grouped, &Simple_Event::duration); + + order_pointer_vector_by_field(sorted_events, &EventGroup::all_time_active_exclusive, false); + + int fastest_events = static_cast(sorted_events.size() * settings.percent_exclude_fastest_active_exclusive / 100); + // remove fastest keep in mind fastest elements are at the back + if (fastest_events > 0) + sorted_events.erase(sorted_events.end() - fastest_events, sorted_events.end()); + + uint_fast64_t min_time_active_exclusive = static_cast(time_total * settings.min_percent_active_exclusive / 100); + // remove fastest keep in mind fastest elements are at the back + if (min_time_active_exclusive > 0) + sorted_events.erase( + std::remove_if(sorted_events.begin(), sorted_events.end(), [min_time_active_exclusive](EventGroup *e) + + { return e->all_time_active_exclusive < min_time_active_exclusive; }), + sorted_events.end()); + + // Build the structured result tables + build_result_tables(); + } + + void move_events_from_store(std::deque &events) + { + m_events_storage = std::move(events); + } + + void populate_maps() + { + size_t total_events = 0; + for (const auto &event_vec : m_events_storage) + { + total_events += event_vec.size(); + } + a_events.reserve(total_events); + + for (const auto &event_vec : m_events_storage) + { + for (const auto &event : event_vec) + { + f_res[event.filename][event.function][event.line].all_events.push_back(&event); + a_events.insert({get_unique_event_id(event.thread_id, event.event_id), &event}); + } + } + } + + void add_sub_events(const sub_events &s_events, const unsigned int thread_id_) + { + + for (auto const &[key, val] : s_events) + { + int_fast64_t parent_id = get_unique_event_id(thread_id_, key); + for (const auto &child : val) + { + child_graph[parent_id].push_back(get_unique_event_id(thread_id_, child)); + } + } + } + + std::unordered_map a_events{}; + filename_result f_res{}; + + std::unordered_map> child_graph{}; + ctrack_result_settings settings; + ActiveClock::time_point track_start_time, track_end_time; + uint_fast64_t time_total; + uint_fast64_t sum_time_active_exclusive = 0; + + uint_fast64_t ctracked_files = 0; + uint_fast64_t ctracked_functions = 0; + uint_fast64_t ctracked_uses = 0; + + std::vector sorted_events{}; + std::string center_intervall_str; + ctrack_result_tables tables{}; + +private: + std::deque m_events_storage; + + void build_result_tables() + { + // Populate meta information + tables.start_time = track_start_time; + tables.end_time = track_end_time; + tables.time_total = std::chrono::nanoseconds(time_total); + tables.time_ctracked = std::chrono::nanoseconds(sum_time_active_exclusive); + tables.settings = settings; + + // Clear existing data + tables.summary.rows.clear(); + tables.details.rows.clear(); + + // Reserve space for efficiency + tables.summary.rows.reserve(sorted_events.size()); + tables.details.rows.reserve(sorted_events.size()); + + // Build summary and detail rows from sorted_events + for (const auto &entry : sorted_events) + { + // Build summary row + summary_row sum_row; + sum_row.filename = std::string(entry->filename); + sum_row.function_name = std::string(entry->function_name); + sum_row.line = entry->line; + sum_row.calls = entry->all_cnt; + sum_row.percent_ae_bracket = (time_total > 0) ? (static_cast(entry->center_time_active_exclusive) / time_total * 100.0) : 0.0; + sum_row.percent_ae_all = (time_total > 0) ? (static_cast(entry->all_time_active_exclusive) / time_total * 100.0) : 0.0; + sum_row.time_ae_all = std::chrono::nanoseconds(entry->all_time_active_exclusive); + sum_row.time_a_all = std::chrono::nanoseconds(entry->all_time_active); + tables.summary.rows.push_back(sum_row); + + // Build detail row + detail_stats detail_row; + detail_row.filename = std::string(entry->filename); + detail_row.function_name = std::string(entry->function_name); + detail_row.line = entry->line; + detail_row.time_acc = std::chrono::nanoseconds(entry->all_time_acc); + detail_row.sd = std::chrono::nanoseconds(static_cast(entry->all_st)); + detail_row.cv = entry->all_cv; + detail_row.calls = entry->all_cnt; + detail_row.threads = entry->all_thread_cnt; + + // Summary-like fields (same calculations as summary row) + detail_row.percent_ae_bracket = (time_total > 0) ? (static_cast(entry->center_time_active_exclusive) / time_total * 100.0) : 0.0; + detail_row.percent_ae_all = (time_total > 0) ? (static_cast(entry->all_time_active_exclusive) / time_total * 100.0) : 0.0; + detail_row.time_ae_all = std::chrono::nanoseconds(entry->all_time_active_exclusive); + detail_row.time_a_all = std::chrono::nanoseconds(entry->all_time_active); // Fastest/Center/Slowest stats + detail_row.fastest_min = std::chrono::nanoseconds(entry->fastest_min); + detail_row.fastest_mean = std::chrono::nanoseconds(static_cast(entry->fastest_mean)); + detail_row.center_min = std::chrono::nanoseconds(entry->center_min); + detail_row.center_mean = std::chrono::nanoseconds(static_cast(entry->center_mean)); + detail_row.center_med = std::chrono::nanoseconds(entry->center_med); + detail_row.center_time_a = std::chrono::nanoseconds(entry->center_time_active); + detail_row.center_time_ae = std::chrono::nanoseconds(entry->center_time_active_exclusive); + detail_row.center_max = std::chrono::nanoseconds(entry->center_max); + detail_row.slowest_mean = std::chrono::nanoseconds(static_cast(entry->slowest_mean)); + detail_row.slowest_max = std::chrono::nanoseconds(entry->slowest_max); + + detail_row.fastest_range = entry->fastest_range; + detail_row.slowest_range = entry->slowest_range; + + tables.details.rows.push_back(detail_row); + } + } + +public: + const ctrack_result_tables &get_tables() const { return tables; } +}; + +inline int fetch_event_t_id() +{ + if (thread_id == nullptr || *thread_id == -1) + { + std::scoped_lock lock(store::event_mutex); + + if (thread_id == nullptr) + { + store::a_thread_ids.emplace_back(++store::thread_cnt); + thread_id = &store::a_thread_ids[store::a_thread_ids.size() - 1]; + } + else + { + *thread_id = ++store::thread_cnt; + } + + store::a_events.emplace_back(t_events{}); + store::a_sub_events.emplace_back(sub_events{}); + store::a_current_event_id.emplace_back(0); + store::a_current_event_cnt.emplace_back(0); + store::a_string_id.emplace_back(0); + + event_ptr = &store::a_events[*thread_id]; + sub_events_ptr = &store::a_sub_events[*thread_id]; + + current_event_id = &store::a_current_event_id[*thread_id]; + current_event_cnt = &store::a_current_event_cnt[*thread_id]; + string_id = &store::a_string_id[*thread_id]; + + event_ptr->reserve(100); + } + return *thread_id; +} + +class EventHandler +{ +public: + EventHandler(int line = __builtin_LINE(), + const char *filename = __builtin_FILE(), + const char *function = __builtin_FUNCTION()) : line(line) + { +#if defined(CTRACK_CLOCK_RDTSC) || defined(CTRACK_CLOCK_RDTSCP) || defined(CTRACK_CLOCK_RDTSCP_LFENCE) + static const bool _ = (calibrate_tsc(), true); +#endif + previous_store_clear_cnt = store::store_clear_cnt; + this->filename = filename; + this->function = function; + while (store::write_events_locked) {} + + register_event(); + this->start_time = ActiveClock::NOW(); // needs calibration done + } + ~EventHandler() + { + auto end_time = ActiveClock::NOW(); + while (store::write_events_locked) + { + } + + if (store::store_clear_cnt != previous_store_clear_cnt) + { + register_event(); + } + + event_ptr->emplace_back(Event{start_time, end_time, filename, line, function, t_id, event_id}); + + *current_event_id = previous_event_id; + if (previous_event_id > 0) + { + auto &children = (*sub_events_ptr)[previous_event_id]; + if (children.size() == children.capacity()) + children.reserve(children.capacity() < 4 ? 4 : children.capacity() * 4); + children.push_back(event_id); + } + } + +private: + void register_event() + { + t_id = fetch_event_t_id(); + previous_event_id = *current_event_id; + event_id = ++(*current_event_cnt); + *current_event_id = event_id; + } + ActiveClock::time_point start_time; + int line; + unsigned int previous_store_clear_cnt; + + std::string_view filename, function; + + int t_id; + unsigned int event_id; + unsigned int previous_event_id; +}; + +inline void clear_a_store() +{ + store::a_current_event_id.clear(); + store::a_current_event_id.shrink_to_fit(); + + store::a_current_event_cnt.clear(); + store::a_current_event_cnt.shrink_to_fit(); + + store::a_string_id.clear(); + store::a_string_id.shrink_to_fit(); + + store::a_events.clear(); + store::a_events.shrink_to_fit(); + + store::a_sub_events.clear(); + store::a_sub_events.shrink_to_fit(); + + store::thread_cnt = -1; + for (auto &entry : store::a_thread_ids) + { + entry = -1; + } + + event_ptr = nullptr; + sub_events_ptr = nullptr; + current_event_id = nullptr; + current_event_cnt = nullptr; + string_id = nullptr; + thread_id = nullptr; + + store::store_clear_cnt++; + store::track_start_time = ActiveClock::NOW(); +} + +inline ctrack_result calc_stats_and_clear(ctrack_result_settings settings = {}) +{ + auto end = ActiveClock::NOW(); + ctrack_result res{settings, store::track_start_time, end}; + + // copy data + { + store::write_events_locked = true; + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + std::scoped_lock lock(store::event_mutex); + + res.move_events_from_store(store::a_events); + res.populate_maps(); + + for (int thread_id_ = 0; thread_id_ <= store::thread_cnt; thread_id_++) + { + auto &t_sub_events = store::a_sub_events[thread_id_]; + res.add_sub_events(t_sub_events, thread_id_); + } + clear_a_store(); + store::write_events_locked = false; + } + + res.calculate_stats(); + store::track_start_time = ActiveClock::NOW(); + + return res; +} + +inline void result_print(ctrack_result_settings settings = {}) +{ + auto res = calc_stats_and_clear(settings); +#if defined(CTRACK_CLOCK_RDTSC) || defined(CTRACK_CLOCK_RDTSCP) || defined(CTRACK_CLOCK_RDTSCP_LFENCE) + std::cout << "TSC frequency: " << cycles_per_ns << " GHz\n"; +#endif + std::cout << "Details" << std::endl; + res.get_detail_table(std::cout, true); + std::cout << "Summary" << std::endl; + res.get_summary_table(std::cout, true); +} + +inline std::string result_as_string(ctrack_result_settings settings = {}) +{ + auto res = calc_stats_and_clear(settings); + std::stringstream ss; +#if defined(CTRACK_CLOCK_RDTSC) || defined(CTRACK_CLOCK_RDTSCP) || defined(CTRACK_CLOCK_RDTSCP_LFENCE) + ss << "TSC frequency: " << cycles_per_ns << " GHz\n"; #endif + ss << "Summary\n"; + res.get_summary_table(ss, false); + ss << "Details\n"; + res.get_detail_table(ss, false, true); - std::ostringstream oss; - oss << std::put_time(&tm, "%Y-%m-%d %H:%M:%S"); - return oss.str(); - } - - static inline std::string stable_shortenPath(const std::string &fullPath, size_t maxLength = 35) - { - namespace fs = std::filesystem; - - fs::path path(fullPath); - std::string filename = path.filename().string(); - - if (filename.length() <= maxLength) - { - return filename; - } - - // If filename is too long, truncate it and add ... - return filename.substr(0, maxLength - 3) + "..."; - } - - using bt = BeautifulTable; - }; - - struct Event - { - std::chrono::high_resolution_clock::time_point start_time; - std::chrono::high_resolution_clock::time_point end_time; - int line; - int thread_id; - std::string_view filename; - std::string_view function; - unsigned int event_id; - Event(const std::chrono::high_resolution_clock::time_point &start_time, const std::chrono::high_resolution_clock::time_point &end_time, const std::string_view filename, const int line, const std::string_view function, const int thread_id, const unsigned int event_id) - : start_time(start_time), end_time(end_time), line(line), thread_id(thread_id), filename(filename), function(function), event_id(event_id) - { - } - }; - - struct Simple_Event - { - uint_fast64_t duration = 0; - std::chrono::high_resolution_clock::time_point start_time{}; - int_fast64_t unique_id = 0; - std::chrono::high_resolution_clock::time_point end_time{}; - Simple_Event(const std::chrono::high_resolution_clock::time_point &start_time, const std::chrono::high_resolution_clock::time_point &end_time, const uint_fast64_t duration, const int_fast64_t unique_id) : duration(duration), start_time(start_time), unique_id(unique_id), end_time(end_time) {} - Simple_Event() {} - }; - - inline bool cmp_simple_event_by_duration_asc(const Simple_Event &a, const Simple_Event &b) - { - return a.duration < b.duration; - } - inline bool cmp_simple_event_by_start_time_asc(const Simple_Event &a, const Simple_Event &b) - { - return a.start_time < b.start_time; - } - - inline uint_fast64_t get_unique_event_id(unsigned int thread_id, unsigned int event_id) - { - uint_fast64_t uniqueId = static_cast(thread_id); - uniqueId = uniqueId << 32; - uniqueId += static_cast(event_id); - return uniqueId; - } - - inline std::vector create_simple_events(const std::vector &events) - { - std::vector simple_events{}; - simple_events.resize(events.size()); - std::transform( - OPT_EXEC_POLICY - events.begin(), - events.end(), - simple_events.begin(), - [](const Event &event) - { - Simple_Event simple_event(event.start_time, event.end_time, std::chrono::duration_cast(event.end_time - event.start_time).count(), get_unique_event_id(event.thread_id, event.event_id)); - return simple_event; - }); - return simple_events; - } - - inline std::vector create_simple_events(const std::vector &events) - { - std::vector simple_events{}; - simple_events.resize(events.size()); - std::transform( - OPT_EXEC_POLICY - events.begin(), - events.end(), - simple_events.begin(), - [](const Event *event) - { - Simple_Event simple_event(event->start_time, event->end_time, std::chrono::duration_cast(event->end_time - event->start_time).count(), get_unique_event_id(event->thread_id, event->event_id)); - return simple_event; - }); - return simple_events; - } - - // requires already sorted - inline std::vector sorted_create_grouped_simple_events(const std::vector &events) - { - std::vector result{}; - if (events.size() == 0) - return result; - result.push_back(events[0]); - unsigned int current_idx = 0; - - for (size_t i = 1; i < events.size(); i++) - { - if (result[current_idx].end_time >= events[i].start_time) - { - result[current_idx].end_time = std::max(result[current_idx].end_time, events[i].end_time); - } - else - { - result.push_back(events[i]); - current_idx++; - } - } - - for (auto &entry : result) - { - entry.duration = std::chrono::duration_cast(entry.end_time - entry.start_time).count(); - } - - return result; - } - - inline std::vector load_child_events_simple(const std::vector &parent_events_simple, - const std::unordered_map &events_map, const std::unordered_map> &child_graph) - { - std::vector child_events{}; - - // std::set< int_fast64_t> parent_ids = get_distinct_field_values(parent_events_simple, &Simple_Event::unique_id); - for (const auto &simple_parent_event : parent_events_simple) - { - auto it = child_graph.find(simple_parent_event.unique_id); - if (it != child_graph.end()) - { - for (auto &child_id : it->second) - { - auto &child_event = events_map.at(child_id); - auto &parent_event = events_map.at(simple_parent_event.unique_id); - if (child_event->filename == parent_event->filename && - child_event->function == parent_event->function && - child_event->line == parent_event->line) - continue; - - child_events.push_back(child_event); - } - } - } - - return create_simple_events(child_events); - }; - - class EventGroup - { - public: - void calculateStats(unsigned int non_center_percent, const std::unordered_map &events_map, const std::unordered_map> &child_graph) - { - if (all_events.size() == 0) - return; - - auto all_events_simple = create_simple_events(all_events); - std::sort(OPT_EXEC_POLICY all_events_simple.begin(), all_events_simple.end(), cmp_simple_event_by_duration_asc); - all_cnt = static_cast(all_events_simple.size()); - const double factor = (1.0 / static_cast(all_cnt)); - - auto all_child_events_simple = load_child_events_simple(all_events_simple, events_map, child_graph); - - all_time_acc = sum_field(all_events_simple, &Simple_Event::duration); - - const double all_mean = all_time_acc * factor; - if (std::fpclassify(all_mean) == FP_ZERO) - return; - - all_st = calculate_std_dev_field(all_events_simple, &Simple_Event::duration, all_mean); // std::sqrt(all_variance); - all_cv = all_st / all_mean; - - all_thread_cnt = static_cast(get_distinct_field_values(all_events, &Event::thread_id).size()); - unsigned int amount_non_center = all_cnt * non_center_percent / 100; - - fastest_range = non_center_percent; - slowest_range = 100 - non_center_percent; - - std::vector fastest_events_simple, slowest_events_simple, center_events_simple; - fastest_events_simple.reserve(amount_non_center); - slowest_events_simple.reserve(amount_non_center); - if (all_cnt > 2) - center_events_simple.reserve(all_cnt - 2 * amount_non_center); - - for (unsigned int i = 0; i < all_events_simple.size(); i++) - { - if (i < amount_non_center) - { - fastest_events_simple.push_back(all_events_simple[i]); - } - else if (i >= all_cnt - amount_non_center) - { - slowest_events_simple.push_back(all_events_simple[i]); - } - else - { - center_events_simple.push_back(all_events_simple[i]); - } - } - if (amount_non_center > 0) - { - // fastest - fastest_min = fastest_events_simple[0].duration; - fastest_mean = sum_field(fastest_events_simple, &Simple_Event::duration) / static_cast(amount_non_center); - - // slowest - slowest_max = slowest_events_simple[slowest_events_simple.size() - 1].duration; - slowest_mean = sum_field(slowest_events_simple, &Simple_Event::duration) / static_cast(amount_non_center); - } - - // center - center_min = center_events_simple[0].duration; - center_max = center_events_simple[center_events_simple.size() - 1].duration; - center_mean = sum_field(center_events_simple, &Simple_Event::duration) / static_cast(center_events_simple.size()); - if (center_events_simple.size() % 2 == 1) - center_med = center_events_simple[center_events_simple.size() / 2].duration; - else - center_med = (center_events_simple[center_events_simple.size() / 2].duration + center_events_simple[center_events_simple.size() / 2 - 1].duration) / 2; - - auto center_child_events_simple = load_child_events_simple(center_events_simple, events_map, child_graph); - - std::sort(OPT_EXEC_POLICY center_events_simple.begin(), center_events_simple.end(), cmp_simple_event_by_start_time_asc); - center_grouped = sorted_create_grouped_simple_events(center_events_simple); - center_time_active = sum_field(center_grouped, &Simple_Event::duration); - - std::sort(OPT_EXEC_POLICY center_child_events_simple.begin(), center_child_events_simple.end(), cmp_simple_event_by_start_time_asc); - auto center_child_events_grouped = sorted_create_grouped_simple_events(center_child_events_simple); - center_time_active_exclusive = center_time_active - sum_field(center_child_events_grouped, &Simple_Event::duration); - - std::sort(OPT_EXEC_POLICY all_events_simple.begin(), all_events_simple.end(), cmp_simple_event_by_start_time_asc); - all_grouped = sorted_create_grouped_simple_events(all_events_simple); - all_time_active = sum_field(all_grouped, &Simple_Event::duration); - - std::sort(OPT_EXEC_POLICY all_child_events_simple.begin(), all_child_events_simple.end(), cmp_simple_event_by_start_time_asc); - auto all_child_events_grouped = sorted_create_grouped_simple_events(all_child_events_simple); - all_time_active_exclusive = all_time_active - sum_field(all_child_events_grouped, &Simple_Event::duration); - } - - // all_group - - double all_cv = 0.0; - double all_st = 0.0; - - unsigned int all_cnt = 0; - uint_fast64_t all_time_acc = 0; - uint_fast64_t all_time_active = 0; - uint_fast64_t all_time_active_exclusive = 0; - unsigned int all_thread_cnt = 0; - std::vector all_grouped = {}; - std::vector all_events = {}; - - // fastest_group - unsigned int fastest_range = 0; - uint_fast64_t fastest_min = 0; - double fastest_mean = 0.0; - - // slowest group - unsigned int slowest_range = 0; - uint_fast64_t slowest_max = 0; - double slowest_mean = 0.0; - - // center group - - uint_fast64_t center_min = 0; - uint_fast64_t center_max = 0; - uint_fast64_t center_med = 0; - double center_mean = 0; - uint_fast64_t center_time_active = 0; - uint_fast64_t center_time_active_exclusive = 0; - std::vector center_grouped = {}; - - std::string filename = {}; - std::string function_name = {}; - int line = 0; - - private: - }; - - typedef std::vector t_events; - typedef std::map> sub_events; - - struct store - { - inline static std::atomic write_events_locked = false; - inline static std::mutex event_mutex; - inline static std::chrono::high_resolution_clock::time_point track_start_time = std::chrono::high_resolution_clock::now(); - inline static std::atomic store_clear_cnt = 0; - - inline static std::atomic thread_cnt = -1; - inline static std::deque a_events{}; - inline static std::deque a_sub_events{}; - - inline static std::deque a_current_event_id{}, a_current_event_cnt{}, a_string_id{}; - - inline static std::deque a_thread_ids{}; - }; - - inline thread_local t_events *event_ptr = nullptr; - inline thread_local sub_events *sub_events_ptr = nullptr; - - inline thread_local unsigned int *current_event_id = nullptr; - inline thread_local unsigned int *current_event_cnt = nullptr; - inline thread_local unsigned int *string_id = nullptr; - - inline thread_local int *thread_id = nullptr; - - typedef std::map line_result; - typedef std::map function_result; - typedef std::map filename_result; - - struct ctrack_result_settings - { - unsigned int non_center_percent = 1; - double min_percent_active_exclusive = 0.0; // between 0-100 - double percent_exclude_fastest_active_exclusive = 0.0; // between 0-100 - }; - - struct summary_row - { - std::string filename; - std::string function_name; - int line{}; - int calls{}; - double percent_ae_bracket{}; // ae[center]% by configuration - double percent_ae_all{}; // ae[0-100]% - std::chrono::nanoseconds time_ae_all{}; - std::chrono::nanoseconds time_a_all{}; - }; - - struct summary_table - { - std::vector rows; - }; - - struct detail_stats - { - // Info fields - std::string filename; - std::string function_name; - int line{}; - std::chrono::nanoseconds time_acc{}; // Simple sum of all execution times (can exceed wall clock in MT) - std::chrono::nanoseconds sd{}; // Standard deviation - double cv{}; // Coefficient of variation (sd/mean) - int calls{}; // Total number of calls - int threads{}; // Number of different threads that called this function - - // Summary-like fields (for unified access) - double percent_ae_bracket{}; // ae[center]% as percentage of total time - double percent_ae_all{}; // ae[0-100]% as percentage of total time - std::chrono::nanoseconds time_ae_all{}; // Active exclusive time (wall clock minus child functions) - std::chrono::nanoseconds time_a_all{}; // Active time (actual wall clock time, handles MT overlap) - - // Fastest/Center/Slowest stats - std::chrono::nanoseconds fastest_min{}; - std::chrono::nanoseconds fastest_mean{}; - std::chrono::nanoseconds center_min{}; - std::chrono::nanoseconds center_mean{}; - std::chrono::nanoseconds center_med{}; - std::chrono::nanoseconds center_time_a{}; // Active time for center range - std::chrono::nanoseconds center_time_ae{}; // Active exclusive time for center range - std::chrono::nanoseconds center_max{}; - std::chrono::nanoseconds slowest_mean{}; - std::chrono::nanoseconds slowest_max{}; - - // Percentile ranges for reference - unsigned int fastest_range{}; - unsigned int slowest_range{}; - }; - - struct detail_table - { - std::vector rows; - }; - - struct ctrack_result_tables - { - // Meta information - std::chrono::high_resolution_clock::time_point start_time; - std::chrono::high_resolution_clock::time_point end_time; - std::chrono::nanoseconds time_total{}; - std::chrono::nanoseconds time_ctracked{}; - - // Table data - summary_table summary; - detail_table details; - - // Settings used - ctrack_result_settings settings; - }; - - class ctrack_result - { - public: - ctrack_result(const ctrack_result_settings &settings, const std::chrono::high_resolution_clock::time_point &track_start_time, const std::chrono::high_resolution_clock::time_point &track_end_time) : settings(settings), track_start_time(track_start_time), track_end_time(track_end_time) - { - time_total = std::chrono::duration_cast( - track_end_time - track_start_time) - .count(); - center_intervall_str = "[" + std::to_string(settings.non_center_percent) + "-" + std::to_string(100 - settings.non_center_percent) + "]"; - } - - template - void get_summary_table(StreamType &stream, bool use_color = false) - { - BeautifulTable info({ - "Start", - "End", - "time total", - "time ctracked", - "time ctracked %", - }, - use_color, alternate_colors); - info.addRow({BeautifulTable::table_timepoint(tables.start_time), BeautifulTable::table_timepoint(tables.end_time), - BeautifulTable::table_time(static_cast(tables.time_total.count())), BeautifulTable::table_time(static_cast(tables.time_ctracked.count())), - BeautifulTable::table_percentage(static_cast(tables.time_ctracked.count()), static_cast(tables.time_total.count()))}); - - info.print(stream); - BeautifulTable table({"filename", "function", "line", "calls", "ae" + center_intervall_str + "%", "ae[0-100]%", - "time ae[0-100]", "time a[0-100]"}, - use_color, alternate_colors); - for (const auto &row : tables.summary.rows) - { - table.addRow({BeautifulTable::stable_shortenPath(row.filename), row.function_name, BeautifulTable::table_string(row.line), - BeautifulTable::table_string(row.calls), - BeautifulTable::table_percentage(static_cast(row.percent_ae_bracket * tables.time_total.count() / 100.0), static_cast(tables.time_total.count())), - BeautifulTable::table_percentage(static_cast(row.percent_ae_all * tables.time_total.count() / 100.0), static_cast(tables.time_total.count())), - BeautifulTable::table_time(static_cast(row.time_ae_all.count())), - BeautifulTable::table_time(static_cast(row.time_a_all.count()))}); - } - - table.print(stream); - } - - template - void get_detail_table(StreamType &stream, bool use_color = false, bool reverse_vector = false) - { - auto details_copy = tables.details.rows; - if (reverse_vector) - { - std::reverse(details_copy.begin(), details_copy.end()); - } - for (int i = static_cast(details_copy.size()) - 1; i >= 0; i--) - { - const auto &detail = details_copy[i]; - - BeautifulTable info({"filename", "function", "line", "time acc", "sd", "cv", "calls", "threads"}, use_color, default_colors); - info.addRow({BeautifulTable::stable_shortenPath(detail.filename), detail.function_name, BeautifulTable::table_string(detail.line), - BeautifulTable::table_time(static_cast(detail.time_acc.count())), - BeautifulTable::table_time(static_cast(detail.sd.count())), BeautifulTable::table_string(detail.cv), - BeautifulTable::table_string(detail.calls), BeautifulTable::table_string(detail.threads)}); - - BeautifulTable table({"min", "mean", "min", "mean", "med", "time a", "time ae", "max", "mean", "max"}, use_color, default_colors, - {{"fastest[0-" + std::to_string(detail.fastest_range) + "]%", 2}, {"center" + center_intervall_str + "%", 6}, {"slowest[" + std::to_string(detail.slowest_range) + "-100]%", 2}}); - - table.addRow({BeautifulTable::table_time(static_cast(detail.fastest_min.count())), BeautifulTable::table_time(static_cast(detail.fastest_mean.count())), - BeautifulTable::table_time(static_cast(detail.center_min.count())), BeautifulTable::table_time(static_cast(detail.center_mean.count())), - BeautifulTable::table_time(static_cast(detail.center_med.count())), BeautifulTable::table_time(static_cast(detail.center_time_a.count())), - BeautifulTable::table_time(static_cast(detail.center_time_ae.count())), - BeautifulTable::table_time(static_cast(detail.center_max.count())), - BeautifulTable::table_time(static_cast(detail.slowest_mean.count())), BeautifulTable::table_time(static_cast(detail.slowest_max.count()))}); - - info.print(stream); - table.print(stream); - - stream << std::endl; - } - } - - void calculate_stats() - { - std::vector grouped_events{}; - for (auto &[filename, filename_entry] : f_res) - { - ctracked_files++; - for (auto &[function, function_entry] : filename_entry) - { - ctracked_functions++; - for (auto &[line, line_entry] : function_entry) - { - ctracked_uses++; - line_entry.filename = filename; - line_entry.function_name = function; - line_entry.line = line; - line_entry.calculateStats(settings.non_center_percent, a_events, child_graph); - sorted_events.push_back(&line_entry); - grouped_events.insert(grouped_events.end(), line_entry.all_grouped.begin(), line_entry.all_grouped.end()); - } - } - } - - std::sort(OPT_EXEC_POLICY grouped_events.begin(), grouped_events.end(), cmp_simple_event_by_start_time_asc); - auto all_grouped = sorted_create_grouped_simple_events(grouped_events); - sum_time_active_exclusive = sum_field(all_grouped, &Simple_Event::duration); - - order_pointer_vector_by_field(sorted_events, &EventGroup::all_time_active_exclusive, false); - - int fastest_events = static_cast(sorted_events.size() * settings.percent_exclude_fastest_active_exclusive / 100); - // remove fastest keep in mind fastest elements are at the back - if (fastest_events > 0) - sorted_events.erase(sorted_events.end() - fastest_events, sorted_events.end()); - - uint_fast64_t min_time_active_exclusive = static_cast(time_total * settings.min_percent_active_exclusive / 100); - // remove fastest keep in mind fastest elements are at the back - if (min_time_active_exclusive > 0) - sorted_events.erase(std::remove_if(sorted_events.begin(), sorted_events.end(), [min_time_active_exclusive](EventGroup *e) - { return e->all_time_active_exclusive < min_time_active_exclusive; }), - sorted_events.end()); - - // Build the structured result tables - build_result_tables(); - } - - void move_events_from_store(std::deque &events) - { - m_events_storage = std::move(events); - } - - void populate_maps() - { - size_t total_events = 0; - for (const auto &event_vec : m_events_storage) - { - total_events += event_vec.size(); - } - a_events.reserve(total_events); - - for (const auto &event_vec : m_events_storage) - { - for (const auto &event : event_vec) - { - f_res[event.filename][event.function][event.line].all_events.push_back(&event); - a_events.insert({get_unique_event_id(event.thread_id, event.event_id), &event}); - } - } - } - - void add_sub_events(const sub_events &s_events, const unsigned int thread_id_) - { - - for (auto const &[key, val] : s_events) - { - int_fast64_t parent_id = get_unique_event_id(thread_id_, key); - for (const auto &child : val) - { - child_graph[parent_id].push_back(get_unique_event_id(thread_id_, child)); - } - } - } - - std::unordered_map a_events{}; - filename_result f_res{}; - - std::unordered_map> child_graph{}; - ctrack_result_settings settings; - std::chrono::high_resolution_clock::time_point track_start_time, track_end_time; - uint_fast64_t time_total; - uint_fast64_t sum_time_active_exclusive = 0; - - uint_fast64_t ctracked_files = 0; - uint_fast64_t ctracked_functions = 0; - uint_fast64_t ctracked_uses = 0; - - std::vector sorted_events{}; - std::string center_intervall_str; - ctrack_result_tables tables{}; - - private: - std::deque m_events_storage; - - void build_result_tables() - { - // Populate meta information - tables.start_time = track_start_time; - tables.end_time = track_end_time; - tables.time_total = std::chrono::nanoseconds(time_total); - tables.time_ctracked = std::chrono::nanoseconds(sum_time_active_exclusive); - tables.settings = settings; - - // Clear existing data - tables.summary.rows.clear(); - tables.details.rows.clear(); - - // Reserve space for efficiency - tables.summary.rows.reserve(sorted_events.size()); - tables.details.rows.reserve(sorted_events.size()); - - // Build summary and detail rows from sorted_events - for (const auto &entry : sorted_events) - { - // Build summary row - summary_row sum_row; - sum_row.filename = std::string(entry->filename); - sum_row.function_name = std::string(entry->function_name); - sum_row.line = entry->line; - sum_row.calls = entry->all_cnt; - sum_row.percent_ae_bracket = (time_total > 0) ? (static_cast(entry->center_time_active_exclusive) / time_total * 100.0) : 0.0; - sum_row.percent_ae_all = (time_total > 0) ? (static_cast(entry->all_time_active_exclusive) / time_total * 100.0) : 0.0; - sum_row.time_ae_all = std::chrono::nanoseconds(entry->all_time_active_exclusive); - sum_row.time_a_all = std::chrono::nanoseconds(entry->all_time_active); - tables.summary.rows.push_back(sum_row); - - // Build detail row - detail_stats detail_row; - detail_row.filename = std::string(entry->filename); - detail_row.function_name = std::string(entry->function_name); - detail_row.line = entry->line; - detail_row.time_acc = std::chrono::nanoseconds(entry->all_time_acc); - detail_row.sd = std::chrono::nanoseconds(static_cast(entry->all_st)); - detail_row.cv = entry->all_cv; - detail_row.calls = entry->all_cnt; - detail_row.threads = entry->all_thread_cnt; - - // Summary-like fields (same calculations as summary row) - detail_row.percent_ae_bracket = (time_total > 0) ? (static_cast(entry->center_time_active_exclusive) / time_total * 100.0) : 0.0; - detail_row.percent_ae_all = (time_total > 0) ? (static_cast(entry->all_time_active_exclusive) / time_total * 100.0) : 0.0; - detail_row.time_ae_all = std::chrono::nanoseconds(entry->all_time_active_exclusive); - detail_row.time_a_all = std::chrono::nanoseconds(entry->all_time_active); - - // Fastest/Center/Slowest stats - detail_row.fastest_min = std::chrono::nanoseconds(entry->fastest_min); - detail_row.fastest_mean = std::chrono::nanoseconds(static_cast(entry->fastest_mean)); - detail_row.center_min = std::chrono::nanoseconds(entry->center_min); - detail_row.center_mean = std::chrono::nanoseconds(static_cast(entry->center_mean)); - detail_row.center_med = std::chrono::nanoseconds(entry->center_med); - detail_row.center_time_a = std::chrono::nanoseconds(entry->center_time_active); - detail_row.center_time_ae = std::chrono::nanoseconds(entry->center_time_active_exclusive); - detail_row.center_max = std::chrono::nanoseconds(entry->center_max); - detail_row.slowest_mean = std::chrono::nanoseconds(static_cast(entry->slowest_mean)); - detail_row.slowest_max = std::chrono::nanoseconds(entry->slowest_max); - - detail_row.fastest_range = entry->fastest_range; - detail_row.slowest_range = entry->slowest_range; - - tables.details.rows.push_back(detail_row); - } - } - - public: - const ctrack_result_tables &get_tables() const { return tables; } - }; - - inline int fetch_event_t_id() - { - if (thread_id == nullptr || *thread_id == -1) - { - std::scoped_lock lock(store::event_mutex); - - if (thread_id == nullptr) - { - store::a_thread_ids.emplace_back(++store::thread_cnt); - thread_id = &store::a_thread_ids[store::a_thread_ids.size() - 1]; - } - else - { - *thread_id = ++store::thread_cnt; - } - - store::a_events.emplace_back(t_events{}); - store::a_sub_events.emplace_back(sub_events{}); - store::a_current_event_id.emplace_back(0); - store::a_current_event_cnt.emplace_back(0); - store::a_string_id.emplace_back(0); - - event_ptr = &store::a_events[*thread_id]; - sub_events_ptr = &store::a_sub_events[*thread_id]; - - current_event_id = &store::a_current_event_id[*thread_id]; - current_event_cnt = &store::a_current_event_cnt[*thread_id]; - string_id = &store::a_string_id[*thread_id]; - - event_ptr->reserve(100); - } - return *thread_id; - } - - class EventHandler - { - public: - EventHandler(int line = __builtin_LINE(), const char *filename = __builtin_FILE(), const char *function = __builtin_FUNCTION(), std::chrono::high_resolution_clock::time_point start_time = std::chrono::high_resolution_clock::now()) : line(line) - - { - - previous_store_clear_cnt = store::store_clear_cnt; - this->filename = filename; - this->function = function; - while (store::write_events_locked) - { - } - - register_event(); - this->start_time = start_time; - } - ~EventHandler() - { - auto end_time = std::chrono::high_resolution_clock::now(); - while (store::write_events_locked) - { - } - - if (store::store_clear_cnt != previous_store_clear_cnt) - { - register_event(); - } - - if (event_ptr->capacity() - event_ptr->size() < 1) - event_ptr->reserve(event_ptr->capacity() * 4); - - event_ptr->emplace_back(Event{start_time, end_time, filename, line, function, t_id, event_id}); - - *current_event_id = previous_event_id; - if (previous_event_id > 0) - { - if ((*sub_events_ptr)[previous_event_id].capacity() - (*sub_events_ptr)[previous_event_id].size() < 1) - (*sub_events_ptr)[previous_event_id].reserve((*sub_events_ptr)[previous_event_id].capacity() * 4); - (*sub_events_ptr)[previous_event_id].push_back(event_id); - } - } - - private: - void register_event() - { - t_id = fetch_event_t_id(); - previous_event_id = *current_event_id; - event_id = ++(*current_event_cnt); - *current_event_id = event_id; - } - std::chrono::high_resolution_clock::time_point start_time; - int line; - unsigned int previous_store_clear_cnt; - - std::string_view filename, function; - - int t_id; - unsigned int event_id; - unsigned int previous_event_id; - }; - - inline void clear_a_store() - { - store::a_current_event_id.clear(); - store::a_current_event_id.shrink_to_fit(); - - store::a_current_event_cnt.clear(); - store::a_current_event_cnt.shrink_to_fit(); - - store::a_string_id.clear(); - store::a_string_id.shrink_to_fit(); - - store::a_events.clear(); - store::a_events.shrink_to_fit(); - - store::a_sub_events.clear(); - store::a_sub_events.shrink_to_fit(); - - store::thread_cnt = -1; - for (auto &entry : store::a_thread_ids) - { - entry = -1; - } - - event_ptr = nullptr; - sub_events_ptr = nullptr; - current_event_id = nullptr; - current_event_cnt = nullptr; - string_id = nullptr; - thread_id = nullptr; - - store::store_clear_cnt++; - store::track_start_time = std::chrono::high_resolution_clock::now(); - } - - inline ctrack_result calc_stats_and_clear(ctrack_result_settings settings = {}) - { - auto end = std::chrono::high_resolution_clock::now(); - ctrack_result res{settings, store::track_start_time, end}; - - // copy data - { - store::write_events_locked = true; - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - std::scoped_lock lock(store::event_mutex); - - res.move_events_from_store(store::a_events); - res.populate_maps(); - - for (int thread_id_ = 0; thread_id_ <= store::thread_cnt; thread_id_++) - { - auto &t_sub_events = store::a_sub_events[thread_id_]; - res.add_sub_events(t_sub_events, thread_id_); - } - clear_a_store(); - store::write_events_locked = false; - } - - res.calculate_stats(); - store::track_start_time = std::chrono::high_resolution_clock::now(); - - return res; - } - - inline void result_print(ctrack_result_settings settings = {}) - { - auto res = calc_stats_and_clear(settings); - std::cout << "Details" << std::endl; - res.get_detail_table(std::cout, true); - std::cout << "Summary" << std::endl; - res.get_summary_table(std::cout, true); - } - - inline std::string result_as_string(ctrack_result_settings settings = {}) - { - auto res = calc_stats_and_clear(settings); - std::stringstream ss; - ss << "Summary\n"; - res.get_summary_table(ss, false); - ss << "Details\n"; - res.get_detail_table(ss, false, true); - - return ss.str(); - } - - inline ctrack_result_tables result_get_tables(ctrack_result_settings settings = {}) - { - auto res = calc_stats_and_clear(settings); - return res.get_tables(); - } - - inline summary_table result_get_summary_table(ctrack_result_settings settings = {}) - { - auto res = calc_stats_and_clear(settings); - return res.get_tables().summary; - } - - inline detail_table result_get_detail_table(ctrack_result_settings settings = {}) - { - auto res = calc_stats_and_clear(settings); - return res.get_tables().details; - } - } + return ss.str(); +} + +inline ctrack_result_tables result_get_tables(ctrack_result_settings settings = {}) +{ + auto res = calc_stats_and_clear(settings); + return res.get_tables(); +} + +inline summary_table result_get_summary_table(ctrack_result_settings settings = {}) +{ + auto res = calc_stats_and_clear(settings); + return res.get_tables().summary; +} + +inline detail_table result_get_detail_table(ctrack_result_settings settings = {}) +{ + auto res = calc_stats_and_clear(settings); + return res.get_tables().details; +} +} } #ifndef CTRACK_DISABLE @@ -1260,9 +1533,9 @@ namespace ctrack #define CTRACK_UNIQUE_NAME(prefix) CTRACK_CONCAT(prefix, __COUNTER__) #define CTRACK_IMPL \ - ctrack::EventHandler CTRACK_UNIQUE_NAME(ctrack_instance_) { __builtin_LINE(), __builtin_FILE(), __builtin_FUNCTION() } +ctrack::EventHandler CTRACK_UNIQUE_NAME(ctrack_instance_) { __builtin_LINE(), __builtin_FILE(), __builtin_FUNCTION() } #define CTRACK_IMPL_NAME(name) \ - ctrack::EventHandler CTRACK_UNIQUE_NAME(ctrack_instance_) { __builtin_LINE(), __builtin_FILE(), name } +ctrack::EventHandler CTRACK_UNIQUE_NAME(ctrack_instance_) { __builtin_LINE(), __builtin_FILE(), name } #if defined(CTRACK_DISABLE_DEV) #define CTRACK_PROD CTRACK_IMPL #define CTRACK_PROD_NAME(name) CTRACK_IMPL_NAME(name) @@ -1293,4 +1566,4 @@ namespace ctrack #define CTRACK_NAME(name) #endif // CTRACK_DISABLE -#endif \ No newline at end of file +#endif From 6b789318b532344fd3c311dc00476ebb87e79dd0 Mon Sep 17 00:00:00 2001 From: MoonFlowww <161968556+MoonFlowww@users.noreply.github.com> Date: Wed, 29 Apr 2026 12:16:26 +0200 Subject: [PATCH 3/4] Update basic_singlethreaded.cpp From 46d5a2722e5770e78dae09d7d404872489b0792f Mon Sep 17 00:00:00 2001 From: MoonFlowww <161968556+MoonFlowww@users.noreply.github.com> Date: Wed, 29 Apr 2026 12:17:47 +0200 Subject: [PATCH 4/4] Delete .cache/clangd/index directory --- ...sic_singlethreaded.cpp.6CA9B4237835C3CB.idx | Bin 1196 -> 0 bytes .../index/clock_cost.cpp.0A9FC84477B4560E.idx | Bin 838 -> 0 bytes ...ltithreaded_puzzle.cpp.92648E33232ED012.idx | Bin 2184 -> 0 bytes .../index/ctrack.hpp.86BBC3D34EC5CF54.idx | Bin 49120 -> 0 bytes .../ctrack_benchmark.cpp.1B072944B92EFF44.idx | Bin 17412 -> 0 bytes ...rack_overhead_test.cpp.1F9B120F33519D8A.idx | Bin 1336 -> 0 bytes .../index/doctest.h.5D29A7DF3C0BE014.idx | Bin 157934 -> 0 bytes ...ance_pi_estimation.cpp.69135500BA762CCA.idx | Bin 1204 -> 0 bytes ...aded_prime_counter.cpp.945D5C7CA8FB4018.idx | Bin 1176 -> 0 bytes .../index/test_basic.cpp.6C564E4D86FAA374.idx | Bin 31454 -> 0 bytes .../test_edge_cases.cpp.430D24178F6560A5.idx | Bin 28422 -> 0 bytes .../test_helpers.hpp.8EE7A294C8F4FAE1.idx | Bin 7620 -> 0 bytes ...test_multithreaded.cpp.BB194F093FD2E201.idx | Bin 20680 -> 0 bytes .../index/test_nested.cpp.4DE5913E0B0DABB9.idx | Bin 30480 -> 0 bytes .../test_results.cpp.9360315F40455069.idx | Bin 33300 -> 0 bytes .../test_statistics.cpp.0708F3BF20A7210B.idx | Bin 33838 -> 0 bytes 16 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .cache/clangd/index/basic_singlethreaded.cpp.6CA9B4237835C3CB.idx delete mode 100644 .cache/clangd/index/clock_cost.cpp.0A9FC84477B4560E.idx delete mode 100644 .cache/clangd/index/complex_multithreaded_puzzle.cpp.92648E33232ED012.idx delete mode 100644 .cache/clangd/index/ctrack.hpp.86BBC3D34EC5CF54.idx delete mode 100644 .cache/clangd/index/ctrack_benchmark.cpp.1B072944B92EFF44.idx delete mode 100644 .cache/clangd/index/ctrack_overhead_test.cpp.1F9B120F33519D8A.idx delete mode 100644 .cache/clangd/index/doctest.h.5D29A7DF3C0BE014.idx delete mode 100644 .cache/clangd/index/high_variance_pi_estimation.cpp.69135500BA762CCA.idx delete mode 100644 .cache/clangd/index/multithreaded_prime_counter.cpp.945D5C7CA8FB4018.idx delete mode 100644 .cache/clangd/index/test_basic.cpp.6C564E4D86FAA374.idx delete mode 100644 .cache/clangd/index/test_edge_cases.cpp.430D24178F6560A5.idx delete mode 100644 .cache/clangd/index/test_helpers.hpp.8EE7A294C8F4FAE1.idx delete mode 100644 .cache/clangd/index/test_multithreaded.cpp.BB194F093FD2E201.idx delete mode 100644 .cache/clangd/index/test_nested.cpp.4DE5913E0B0DABB9.idx delete mode 100644 .cache/clangd/index/test_results.cpp.9360315F40455069.idx delete mode 100644 .cache/clangd/index/test_statistics.cpp.0708F3BF20A7210B.idx diff --git a/.cache/clangd/index/basic_singlethreaded.cpp.6CA9B4237835C3CB.idx b/.cache/clangd/index/basic_singlethreaded.cpp.6CA9B4237835C3CB.idx deleted file mode 100644 index f75eb99fa547f662f88ea57c4891f69076d8e445..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1196 zcmWIYbaPw6!oc91;#rZKT9OE4GKc_iaY<380wV*%1||lEiaBe8ZhIXu5IB4ON64gw ztbr}HfdVxGV)YArCTCjbO>-BT#LQ%mME+>VVXDr)|#g}fqbW7DP=#rz%+hxlF ze=(+UvN)>r#rdhU_R^w~MLOA=mdGx@>%Z?~(naTa zhJr_w**RvY9tvtLShVV;q2Ifjud&%t#k}*{`{iFmEiEqGt+~$ka@GjVEf-|#oQmECp)Arih1_L z_1bv2WbfQ(bC=;y|4sXjx$TvFXaDs6jr$n>Ytint?6h zT0B~OFfAf{+C17wJRKe#IIo>`;_V5iq%>G~_}H1)IbfdS;S*#MMB+&>Ng(l*Sd_S6 zDq)r|N?{FK7Acf4mEn`(loEmkJdh_NrHbIGbEyl%%=^K9YT>Mpf|D3!`1HB-#bCmE zN42GvJ$pBak%v#7NuCQPeD~BVm-e;I3s_jd-hjmk3)ma5h-Bddc>`u03m?cEFauy} zn59r6S%y!TS6B=tDZ{76ttJA~a{T42hPf}yE;5Sn>B#EH!-QAwOEnE=dU6dYtfi!- z0u$!3cyRgIv@bV-!rHRhaMiyRKlANZUiOYf1jXSZC=M4vakvPI!x@TFa}q(3QCyT< zYz<-vfd~i?fH4@D`Alb3FWG$Wr6r4?kN`h}AY6ulAHht{P00Z!b_NbEE+%GnR&EwH GMos`OM0+#< diff --git a/.cache/clangd/index/clock_cost.cpp.0A9FC84477B4560E.idx b/.cache/clangd/index/clock_cost.cpp.0A9FC84477B4560E.idx deleted file mode 100644 index 93807b259a500dfe6ebc6f0318008dcc44460ce8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 838 zcmWIYbaS&~W?*nm@vO*AElFfyU|m8}c0goLXab zsepYENA-<4=Niu$Uc7#B>)qJB+a%xK{q}Wjo{yxRPm9xRwVzMtvj{K-y6-j>w9PhN z(aluw$Dk&1AFsT6_sg6)XK((<`(nj7C+P6K3F&;<$9Kz~Ro*XsRdtrW&`Le8tCM(7 zeZ9qC7v8|Nfi2}ghS2vw$tz}jeujrOPU;I%Uc7L_)_Hq;WHKgKZZea6o3i5T!>F*O z8b?hnci;LS5X!X7kN?#Lao0-L=O*wn?B3G&UHvcaeD_p6xZzx&xy%1czuAu^nz9F**l)6zw%Db=D$p(@uFGpm zO7YT+CI3y!v}0v+PwbwU_g{#&B9pm>f#>$c+TzOGBza(%8Hitzc>Jy?k_Qxm0z51{ z9AE+{0|7;;X~k8*Fx?n)!)Q?tzYrsjfE2qFH%wcpskDfzy^t^ykAQ%(fF?{AkANtP zC>M-ZDbsSz_1+3eUOU0urJ>iP!hynqT!KWd`0lA!F70cZ7cjAa zoeL9Y0XrAQyD@9SbMsTnDB4K&wTrpm%U>WL9s~$#U?AckEgQP5C^Ik!Bbb5+W^!&yjsTF$%g4vW%*w{W!p+Ig I&c(-EaTh@BerAy;!D4 zN3Z1*#CxgJ^Rv?O7Lf!&$nY;WFK1~Iiy#^}1d+ezSYmQ4XT122$vufzg64{&dcP^? zDx5XUnWk&)xHP6UWn10t1=$xY`Nic6Qa#Gnx%l=F*9Qit;DR?oUzf z>bd-4&9@od(?Y_#2fZtf5mT6bikjffA8qb551eBJ|(_vby4Qs zD^8T(;LMqEyk}v2RnqAhZSyOazscZz7j$U*<4=myYSM!jHV+Nn`zgxMJ8nhHN&oDH z`qf8^bh3TP9_#8xx6OF)x-~K7fZ&Ao*N!Ot?c-&uey&RTXKan(#gUwbXQR3|OkL7g z^Lb2lNgS``Rz|h>-{qx~i}zY4XO;DHhSIML^|wAhr^~!nmUgqUnc1_uP``iK{cv+* zz@3DP%wJ2Mt|2yV+PP% zn*+8!5cP%Z7E7A6UEuaa8AP~)^Wp;rP`}2Ij zbD%S<)JOw2yQ1xCBubD)p)gi{!9q6cG>+0hDIXl=}5< znZ(6rv%oBZbHZ(L)lRp>AQ>rhg^Ubx=exTBJqG#mecj+D805$Ib7;-JtBMOE6GdzW znIcUlNX{Tjq{Rd|FY40OJI3(*1Bl8h^gthb2QgH=Pp96;}VUtG7;!VKFFH z9Lqo^&DO8?A@_0O7$`!BOKES5(Fv0Z2eK3>oXiM+m=b9 zlYtpRv(!#awa0U=!DsV?WE{jOG`fNJ$z9CLnAKD|4q|H+XrAuA=$Q@HOacEJg-;PLig$%nP$rJrsZklES<3q>6%eBat`hO#xLB1(JajgnPfacwew4sTy;#O)}I7V7A(6 z{BV6Wu{vOQ;44vJ{+XwzxU`)Lj1g_8GNRe2jA%A0Bbtp0Xix_ZB6?zQDcg zXPF2L;Dop~wqb`z3}X0<3P1+wX}zO1;qjeC51$TP!UslP$QSOfv|*j~+PJPJY&L3* z{&4Ar>D4p8rox~uyi(CaD)_mpTM>GR%Py^Mg59ezR-*)N5 zaYL98$9XF4eh$tlH93YCYokq$X}}DSMGOpb(lQs>%9opylAB>$NNnQm;|dG>X>u%C zXw#!4)t%v(dcIVykV(X@B0}sy2}duy{rm7gAR2Lyk1SKNQZw<_hTu~ao5SO}kfT_F F{{UehyyXA@ diff --git a/.cache/clangd/index/ctrack.hpp.86BBC3D34EC5CF54.idx b/.cache/clangd/index/ctrack.hpp.86BBC3D34EC5CF54.idx deleted file mode 100644 index daae42bbfd4d9c08c67a12ba3bcccedcfa3fd76d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49120 zcmb@PcUTq2_weuCUf|wKhf7DXQtZ7e_TG)gu1SoV#1f5~h#~@ls3={esemBX*c*zd z1Qiv3PwsO|#5B3Ys`=n)PmF^Qres2ls2za_XZWr{rHE zCX{PdjF{c|V}eM3`se+2n^w~oTHX5d;L;u^j|@HJX6+w1>3mhBxpm(04&FOjFCOd| z-L+wmr^@_?9?$>&ysppswyEhqHy@X0O<#|!iGQWxCQJ$MQ%BY}@!wGKaQUh>mu_?% zzoC3(IoFn9kB!G{*@ zriM`?T26J3dR8A|w}*;fY2AK!qvHeOJCh=sor{8XHou)eeWTIO zhc|A^U-|Ra!ql<<`LviRj4ALCvt~7UGPvmXoA*tgPj|0hnzOR(N!P@wTUU3@eXui5 z{b2132>iX!fo~HwA&6dT#R^RM0rR(R|wFBZO zx-LmGxpm$)+N<4Owjp6!{sE`ZvN5&4+s5CV6wy3)DOErHhgZL^>NPF=^x9tQFYdMN zvFl{1{q$CgCYNNG_FvHI(egLFx2?C`+Ni)T_FPI!k4;zR%zip}=veE&-6C@X-OBo( zJ1}0ZQ(P$?8=+KQAGNS2{sncy!Zv5G+BDR3@Nr^wQVYPYB8_9=KlArf<+S8 z{nsvhHYLsO*qf*p$0x@8dv3%J+tRiqRMi&8rU?bl|xaxjTM8fcT-OBSut*Ovmq8Hhy1F|-_yg|ZWs_TDxrN`I2|=&Uhae` zE!tT`m1v6k=8qy=FShotxaHR`J1k|1=a>cjbhn$QzkBPN zvhg>bRUR%#%4dIXl~U~P{kZ)=tx1-DcK;uIhWED|-l21HTlE0T^3j|By-E9gX0ul` ziuEX+Vi%pza`@h+=CKosp7#vS$b0yPKq@AG3MOhTd5J=9RwtrMU%Ta(_yl z+c_oS=lmmMpFXVH^z`Gr6-zHQsoYmw9M-DX;zLnWn|8Nt-?Z%HtiQJ6cGj?nNP)36 zODMi~jQ;GHC7yOH;_no(shpn~TPopNa z`**#M%QdgzIlha6teKJ{34;RGh1?oia9riv>CDwTpKiO2%6)gKGW?4$*E;ogvj+$M z?6+gqzs%pU@0tnfpJeu-o*whPi6O+IG{%r5yPd0~s`?ZFB zW8Rn9ntPz(UD49$#;5Kcx!c$AsK$Ijhek`dW<;C!u8aQY)H&nlUgYL9TdvW@g(G~) zIc5QY^pfCTXIEK_oLG3RZE6RbfR(rQ*9ElQwots%e1_TXBY(HZA67B?&c)KD`;TAz z(czzCPNfYgx6k$pt!P=e``F&q30*Fj+}#^m5xB;s=~aghX*L1xf1lRw-c^@=eitfM z^7gZ@xu0wFSEud|?$vvbzR>siGPhG%THd)+R8~Xh`e|mDUzPvj&}C)ni0R9-#Nfl# zGdEb6mUEMT&zpH*=8>z7_r|Q#Xc~tBlr%m+7 z=ari;wO{nhDrc+N@9#ABz3RU1ZgSgbu@g7B7$t!KAh@=u$MA-B3O-rF-Mp&;=` zB1`qlm%P;*FI6Wz)Up;cezHiiPa`wJ=h+_q0{>n0b$%OX7lylU79VV{5n#Gcq z9}cQsS5I5{(5BsxH*IoCoX&0b^Ba1H$zT2BYu5u&i!F0kE=uirv&B}8YUk;hVJ$|# zP``0;IqUM<=pj#;LBC|@Y+5{!UAlVg=LUzRec!%QJzaD>k(u4rYxxP?Y_Fk*KLi|! zO&~5^DE&R!eP-0`NnIw~ThZNN`r5I5P3dtarGJK*SY#er66H7gbD#1VJAJ3UI(zrt z&#m@fzXslbEcY$s9Q^)CRcLwNt zdv==m?61=&3VhmrIeKVX$#0!j^yp+CvVMx^!9Fo_ZU*0-9TZYK^2F36n>j?}v8n4u z2K4g&d*EyGN9XhR#X8*smw)$;@tzmxm9=t9u19Iwt2tiLf3uUDt-b5`A<_TOG@Iy+ zkDb>25*?TnpWbW3E1x?JB|Y|4CoDOd(_`CSoBST)6z$K=$Lt7PG4gg$i%W&%v&$_m zZ}p^>sArfT3A}bh_0xSDZT6?peizz=>uiSYop}D9PwCnE*Vc_prj-p33`^VZ9Nw(O z1@Xv&-9K!)+Bj`Sr`Cq{ZRAP5yEn-=^i#~Gi1@_VruxCbo=5YO3TI_puqv6i&m!t` zlY*N1u2)l2(p*|r2`wLzCYjL7pvWM_e-z#UTYn8c-Yu4gU4v6|N3(J@ZOK6 zwO)HFr|2)o>EX9c;(j=_%dc=>?Jrk1O}{z#SHGSASXV7eW+t_dX`FxDF~(#{Os`85 z`K@JnO+)9FcmJ>Y*iy0l+_{2JxtDKo^}ff4x6A%?^Zq|Uhf8LDzBgw>N#~_M5wUGM ztT^+k-`TspFAQIN^{v^NjnhtcTsHpnv8^u(O}eJ8zU$Uw)7lM_d(Pgzxy`2D<%5=6 ztvmDZQR?ORQ(w1^W9s%Mj!WO#G>7}S{MVPIpI6t_t#)7h*Mgb5+*GP1eP1o|?yXg6 zh&c5sRjN9k*2dE|AXOYP6VZR^$&0-n&GkcC$!b3}QmbO^tJo$WL2XLJo(D6lHmFTh zkJZbOR=Mad*uoH!pV~?OjVl=#dd~uJHxg~ zRZG(F?h}X!_(7Y^{^>+LvC2Y21QCX6_kv|!u%@YMNkW3}{`)WR;{$(d4bcl{?F++y zVYDDYDKKL6+J1R;)(qi+OE;2cBWV+mhMTHX_@4C8bv^BiEp5z+b;Mst@iygfn?i*q zNl49WIeXtPbgZq0xT#))UqLRb&1GFdg4)y(_gj{AIDyn&sBzXdvHT_$y?9B2*4Z_? zADTrxw!`n!@R*gXeI)DT%}LlwHoYHqSfO_HEieW}|h`*71n8e*;?V>PUO z4U29mNzf7wH=ogd)mWsJBvrHzto;YJX{uV1pw`*!(YRLQ%aK}~A!nOK?Pd{mHIf9a zcIS51ro4}DVokJMi5@bJB;rW)#w7_#UG08<$F92E#ERHP_~YVFW1FS1oj`)x>~4t* z)tfdp(-3)v;*VpQI95Q386;>eD45aqQX{UpiRw>WGj7tZH|h2uRlF^ydaoXXtHzq! zt@r%cxn~PgRk)$zrjjnHBf zs=uMK{ii8NX|sG~ONNLrD3-8n32Tw6mZYp!)=<4#%{!&?)DWRk$Mu}oJ?9-$)sloq zsT@c*P6_RZ)Vks7*1%{R7}N<$5|lU1lu9hCiDi+NBtgq@^VMIQG+E?n zstPk?ZMbGQsvh`Xm7Pk}Hd_4ye$tNh)0^5|RC{ZPdxm!!ENX*A^yVcAY5hw5IDh5S z%dIrTPdHm!S>0Av4-%B#m9A=@LUw9xqWTTLhQqYUVHy>#BvrhbS~Xx2zU7W44=-(t zYTOo&ML4w}Ru_b8t|TF~OKq+;51lgtX+2frdK61)Vo6llBnetQ#{Ro{rF|sQs+We1 zEu3x(htwnqY76!bn$Yy(ln&o&NEYpyg=>f;RlEfWHKgIJ$^3C|e?f{-1b&DFwI)H0 z8nPr+b~;`2Zv~fK^ML46^|k|QGlp*F49T7$QKuzIxbYJG+~+RCyL8kLn+U^r^_bT^ z=26i}64Z#jjn_3?{t>BlFlZI=ZHo9VscK1r)(YRGRW6UVAg%cZtzy1MF+V6(ElJRF z346RM_}$fx4Dr?Q-XE~+1J*KCElF9G^f<2yI6SYaW-Hn@XyK0CSH6A!pXh z*6tDXJ;EtfElCw`$A4>9)oZqfc6Z;^T|;a)7&S4pK8AKnRZ9|*`^#b79iK<%dzz?9 z49R^EEkB4YQLkl?25Ti!Jpxy`-?IL^H(;7eZw-+swZ4bE`9mI66G=jXQ-1F;dfbKa zNUa~Pm}^q{yjSTh^mhU&1AMqGTSdzElF9D2U*VRS>5>oxL6D$eF&!y z;ZV6q5^~7I%`coE`VOh(8QSy)k=Y=kUQ?2w_59=f3x5A;2BSesDw8r^SH`2aAxTgR zUvoS!-sz7a8e)qyHk7k`IV&QY&>%tW>0K|65ozm&Ylz#D+H017ja#)OLG8%V-l_Ra z{BRvH*iePv^6XpO93%-^%{z?W?b0Sj&TKrcd)pfyotdLVyB#0U-X z($J4=WVIWyjVDRadYyWs>B{G)kk&S-1(x#qQocp1T9TkP{MwF3Plu{UnW$n74gYV= z-)NY`|Kdj95)uoXysjwb(3eqGL`TEmwx1op zpPiAamLzDsc&gr*n6+=Ljz~20Am>T;Jc;Z@NrKj??M*i1-R?5ZL^Tapw@Uz*@xJ+ZhG>Bm*AVO)0*yqHlvSc0W(#(WyQ80AqAE7jwj$A@NNj}q z8iO>nns@3^xYf+G$QYinb{f)Lic_p6*lGe*Hc1)=!E&|1I=0_&*T3-HtBEYp2rC{X znWH4?aU?0bb*R^-(cAMpIfvCYAD7LUKtvk4-*TGx{fFVB%LA z&g#OkWgtmVdfDmK{D_W=el}GF8XDJm*6uuu-l!xE1@fPIJT8#c7DcxI?fdkLj<_hj z{3MP|;?T>IBqX@hda}op;$`!!2@gEyO{9rLngt0;8y1de{pW$$`6jAshS%WBxcV}k zQ`M4G@m4g9`lfDsTuu9@&esuL4ZYHJp1sZ^D_@e3UjFR1t`o+8SY$GVGa^*t3G>a=&gbd%XCDM8rP*Y6uX8(_J|}w>sQ}i zz59l2US_I_FuaKoo+Emss`0;u8@^SK#&6+HPwn>ALuM`45W&)X<{4}Mj75EfBq6bU z)uJztXAk=eS%rqlMKx<*jVBk91g)i$Zkd)28MIPEtRe8MXOqZm!lRKSL2J&1gjel9 zeqPBC8w{m(nPo4t$UK&$tTYnmtiGEvmH)>?wacJ*L=cY%s4+;=Fw4%BdZo=}%liyl z(Ec9{aYvfs<*|Go+d5S(Nw{<7%)Gg0pATB2A$s5%?9V#-}ohSGh?YMx>>NrGD1>W`b_^~2X$5$(SXHO=?4UGY$ZC1@?*xNEfI zsyKg9b=6R4*{oYOi#i%f%1U>8TI-j;b^m+4hUkN{=F94Q@sKJ>NR1j+xy!8gGo*Ca zU|(zzwOd3NWOExNX#GO&7B+VJ6o3oE&~4pdH8=1yMUtRKABes)O7sb4h+sq30y#F2 zLysv*S=M|8+)PaFF(kx9H61sXf7K@cs?lgENjykDd##;+-|7j8`PQ& zYGf8l5^Fa7He`-|)T(K}j};+0;-TR|){5*}5w&|sLJoU9ym{zFA12g_=wvA3Otxtz zHsmA;TF#d9O!sZ>AF3fLCEF~R(+6{n(M-x9L2XKW6VuT0K%^E(;EJ@JX13F)nMxA0 zKAh+{U-LD56HW{dS!uLBjYern6114z?svK+p4lR*&KrvEBHQXB+cQ-yNm&Kz4OOmo1kD58~!Lr!Zks4wSu1*mwAAzSLl7!Tb{XDP5gMpur(sskc zrqlX#Z0t)CwA}TkD_U$!iZ&!$>(eAk zN|K;7dhE#;&Qad6CaOR~_Q#lvL4|?;RoOY3H2YQ*y=(2ZKex=b;re@5VD1X2 z7nh{0%*upDlgfRTBx{IY4ekCjYyTO~LL>>P&CGWuuf6uz$r3?^+(mIr6n+JglqdJ= zhWN@cJ$Gw}U+^o4WOb2v=#?a-_JSH`vTS9K6cg1eLuyZG*C#ZZfk;wiXGuL$fAgUn zUhLm|h>v?JLwqr)UT4|sEP4(}%5MCj>)h%tKEqSZiB@>j@*|r25y;;tNw_id$GxA` zk4~oB5W5Y7Lxn(82qdzn4HC58eQXihDmOPnLv+W_P|xu7*gq&qP^wY2PrtCga<8c> z!H}^8LYqK1qp7<=8Zx$c2p-+;`K_E@Jn=>*Hk1q<(;b$-gAFA~LV85x3BMj|+8#s` zAH!QcLAE?WBBy~QLCZ$9Fr(O|@gW`21y{HO6nlU&1qn*WO;7IVU2*!5iE5$2=AupZ z)2Jx+8>GxLvcWZO!MMnR!=|cg!y}wy-OjP7j!V+;2;ZiRCH<+CM?=#7MV>4}A2(7r z(lu3$|21gENnY#UYqIw)7=G}mj<|2I2~JV$DGHe)l7!qnol#IV`oyQB1hLGpR-i)9 z;VpRUzP(FTkDh-X&0OVj9J`@$@rSayP&^Px5>jDJxMNSYL?W#XlFjgzwSSAP0ZD?| zw$4Ror_HK8Zbj^njHpzU6n2$L64c74^)tENFZrZ~2qUofCx+C-kZ9T?Nzj`7Vp+xT zj3(jhYGW9y_Z}jIJ{5cnpkYHcWAHCxu z51+Ln+I<^Md+ujP77(vfvNXg@ zTx!v*Lo|z~ostA4wTIQhTQBw54ABzTj0lpAAW>tI+EOhV*Nke9%iH2iJ?=d zV3`U$JCP)$R`%n;n%pUaE{nt{OK` zsFBxHHU8#)NUct?#GmlGCwQtWNl=@)ck@of!{P{uN4__mUS^j>Uoy;e~DVrfy@<|f39y}k~wb*>mbqz5P z*N!Ms6Gfs~ha^F1pZea#WIrchsG)fZGMo^7Ne%tpJc3l_>!gpwqvC4U}2+SWR$ zz(f^o=nUp)=AaV8|6*gO@i${9V&0*Ro9d4uttGgs1(IwaiEJH7s(5ok^=&qPC_Cks zXy;D_qN>60N|RXoBy9XkQua#c&RiD)lOEttSLsfgh zYhGYKi6lYm)u&!VlB$Hq8e+XPkAKPAyu>9TNl?3b-Sg<7qOvD=2?%#r8(4k=Ug(k} zXpPJc{>7xtyr<^GX2Vo8h;RrZPe*HLPw8i$--xf>N*dpZfo2%fHYN zmkmjsB<)XF` zCd@#}+Gd?=mF8@t-EXW3FWikj5Qql?a_&nK5}Wig|EJ2r8*i+L&W7RcAnS4vuL(;M zw6t?hb)G%Rv(g%wnudxN%Mr00vcDt=YKK~s9tmC6>@9ws0eFag$l5=|uS$}j_O#E; zJ9E30za@xdR2qi=&;*$fXe22?BaAlN|Y$;w^kt8HkysO49Fgo%b zUYa$uk~-GD4$s^r32L-DyePCfw@O3&Y|#3|+J9n^aV|;F%JW@b7%;z4wTY_M(B~Z? z=pzK`XeFuQt(k8t6L${{j_@chs?iWv49il{q$U~g$ zudO6y>xZOHU0r*!ORYKa#!zt^D2E0LEt*LZk_*13Ik)j^crEIta2wdh>b7AgnNt(cOp+?zMGJ8e8*_K`H_w0AU`0eqwe~P;e;ChJBnb(s7R{Nv_}CU> zvk3i{ip4v3iUck;lD3kVg_d(q#&>eJM9un+BLI;ak2)rcNmxK;pdjGEJJ1gC8tJNs^)$D35EG@hrf4pwska;A5 zGUmy7x=58>r9x`o>i;(au{9J@l;UY17fAK0KwTBgzk9*ZSS8ri3Qb`mg)}lmB16Y_W6-iJVCD8>4~TosknRgt+WT0ut)K|c(7P$|v_yg?|{8=UhEu8Hhb z)$w8-Zw{{tX*BR+g92m@i=8rY}Vss7>g(--)L0L>pMMK%ho6 ztr2Y?XJdz(H!a`NjrKrKl|txK2$$~>2)GY&J3=)3-b3NFpT?Jn7T*_!@cLUw~AeIEjkMzEYE-``vnk_(=7{L?TM0D6ZB<#e3>CK;K$7MW9G|%Kg0SnrZSMg>_%-eL*6FOF#H)t3zZcWz&e&)$C|=| z8v_0;>(82kvm1eEmW^gjVU~(O5^I{oT7dPBKr-7nnQZ~9(+E6d*@vtt4D<;2bF4pS z3X^LDf_Xle*FqP7Kr!E}nD>Id0f7pht>8^zAvLk|*Nyk)bz*Rn#H$dnK7sxhIXu&7 zckqNFfSiKqbR+NK&^SZ{W(OpAGF@)4XdxS_uJTOVoiQu(4+PD2* zJ^yURU2tR+wuPYC=8!4h620%t}3tY``4aIMkGz_mTbXh~E; z{=AhxZwIvwfjgq>9nl@!@d(@%UGEyf`F4l9%t|=yd$7N!C?Fy(HWq!6t+_Bh@V z**l^L4~{^g=ujxS$iQ8Zy{pi;Cpz8}T|ol^Q*i^3qEcb`6rxeF5g|pOLLEi7xh_!G z6)&qsplbvxnYH9E+WCvkVI>G%5+Kq6qLmEn6^Xr~IWz?bX~lI?iei=3$)}vhQ?4z% zaFkfIU=}TWuSVOugnsH)-pLZbv~;yDU2OsHw_W#a;qG5QSX!cMstHv!!N|tyKvES* zGSC$ujZl&bB?TEcO=?b)ma=g+o8+@et!$jlBOB$B&1ImF-2!kmE9^)$dFGKyy z2+#l!IKr47VJrZk*Db{*%UVQ)Fe*Zr0QG%VK*gIjE26CNVt*j%8b~&gy`jCV)m~N) z%WFs@leNlZ^{}>xz<$W{o@XNE0s7L<4;=%&|217em~%tcgg$6QF`p&7ucp(ZghxQ7&zot1zZ+(!+1k zV`PTV1KRX~!ggBA^jgdKKry34{TWMt#!dzjnAr);FHpKj;}|pk7&BQ0{8>wX)=p-z zB(auBtewn2DdL+K@m|oqp){%mhibtUS~o<3o1s2KivET`B~%eIIqOW$1$ul0_Howx z6d;GQ&Eec+8kacROA1iJ*_Lo_(A-fPrJQZ40@QG}H45;Fv;Cw1pE=vl3Q)`0)+#_9 zXIrNL^_*?J0({|YzbL?0&i1PUG;p>J3gFAz`tski4$<&JF~+4sHl| zfec{r4$faKBT>9(6yFo9iIA#^Q>PZpvZYapM2HR%qAPTs2tE101%Q-qMSTnmMZ zO|?~_+7?!M5!go9Y$NpG;zS^yvdO3Pu)2%DQ_AKkr3W7_0v{-w50o9O2f;P~Ji(VD z|7AnN4#8}P(K;#$0I0Ir2?19u`JFci?f3Yk5Ug1Gy#G=6y6K{uFK@gADyuaq?Wg> z?~<9zD4 z5zxR;j&=%WJB>MleGB+nX{&;B5Y;DXBLZwwKtKx5gP6UaQx<`0Sd zA<+)n4+6(U_v2!FFeMSVCi2%rI{@huJ7{ht-89_Bk2dwA&0wsxI+=`zGz|e-uD2Cx_hg(QVSH zKhvpoawo$B&i#SHxO>BKZ#ZkHVc@Y5(2JG!i9l-T#`_qHeT)O#7=c2@s*rJ#fd`D$ z0|h8$%u5-2nZ`@T?j_?U1C>mtN~X6AR58|7jI#{XFl}m>t}>9wyCm|>p?IOS;PxZ! zSb;2~0`TWF{+wPmx8EW#TZHfaH_JIuBX-uOw``A8FRR(hYD<`-B5*}*bw%wa1M87{ zlyHQ&ZlrOWYI>V$2O~5B6_jTM)djjz1L#vhjgWy~Y%iyZ0KotZ3pStyO@gC+T)FaGKVirkl!uFH88cT8M)~iLPOZHLMnvp%7Th5^Gs4 z>=i&D2nFG=TG-ZtKqyOuvRa6nKwv9NY-P2uiw1#hEU}H%f?pqjaFz&XwGd5w9==4{rwT13k+gzRMnd zfDAn5iO0Ma_Vpl*Cp__l*Fv}i0%bf=#%p1F1p?1_;u!+p;@S~-&J)jhEo=!xAVTOG zAq<2*4S__#Cs7zJ1IdCh9^;_T5i=;PGyY z3Ae?>7RI|pj)gDkgclwZ>h%6U3nxh9BF$c;buwe&4$a;{;G3}kMTY$_+jwCcZv$@z z-B;R42VQvCNyj7AJq)#n5uqDIAf0KS&UBN3z%KuM_f}+0aF;Z1Y-NL zSfGjp2N=o`cq_QQ6}o`gfo>*k6a>2mx;VqN3{}i%pu~`>v~5uKkV!(XBw;W-0_-1T z&;TlJ8idgZRg4s7bPBTs5<{SZnOMQBkb&3C?AOft?@n=~Qq4@QW_;x&o*x>|FN9K^ z`^4eD$5p*rW1Ho!nz^gypa>8MC%AAzfZ2d!*vx**PW;mbds$OaTm-9!K(@xi-Eyuh zzSRal@mj)dEzuF;^$}P{*sdcyArcaS5JDe9ctff%WZ-M>Fw7ms44wy-mb4vGR$2){ zuLNNTlosrd#ACO#Clc&Pl-N#^+DV#%sfoa4s?lZ21L6UvF1fpC-;|%);@0{_1odGG}l}<6x8x!tzrT0D=&UkfKb6SRIwuWPSn2>U11^YUByyj z*{uAw*!_Q<=C2#)2?!L^e6ew!fWUKFd`_FeVhRFZX#NYW1@LC|cxV?l3#u@^r2=Nr5f#o#>9uZcL2wPZ9L*Nx*^@^~C)ieYy z)8b`XBkQH^(c(P>zV%Y@1NK!)TTG!MLxv14dBfIHXs0OE6KdNN>Q>NBTOYjAtx4L6 z4)|$OSgRD)9s;Sp?>t5CNZM@*ZVjYbKyn47PUhBoKynWh;0eh+A$2mh-ZPSWrU2EX zP)(Z4G(M5SCk3b@xjMxqeiY|N>12Ms^%S>W0pckko-&tdBvC?=0_>u=U5ZOGsP-9D zcUb28KIEdOjN_;{P9t+b?BNIP;m1J3Mg=47uZ6(?T~f`ruI9T!>p@_H(0GI3r2vaI z2&-fuSa1mzS}4G;!NO7**e*2PF0@vFrQ3zoG7u*;iW58)U}2oF902&PumduR?;XVt zf@eVB0#9AwO~8wZKrYYa@;U(MDW(0v@RW6r_bvG$;`fd?pyLa{ej!9y-$fvW;Zqn> z=wA>>WB4=$s9^XC1$fQyuN9!0;j0xOp6BCvQ^+zbE8y-diXRfikB46nDC9Y`P63M) zDDTp)WyrgB*XG1q?UFlUGhq***+V$Vn&@#tbDVIJHPI`CMZ}&;U_Jws6E2P756!0&hh2jc5s75=BXl+(jP9sodo=FOjEO;g>z)rz)rvmH}ymtv*WVhWdc<)w#6u~n^aY?G+nW_M3f@hi$ zjGqxcDI@Vg7wj%76HUrQE$sb;UH#ZoDQ)DJ4f8d;Si@UDMqs{ejZ~#w{m>pz`Df6H z=r2tTjRv8Ew0MxV_`c%-1KWeNiwxA#LaicdVjt6UA2R^DCX~j%%z%FtQAl?f&pS+e znMNVwQ^*XHf&0wR`^;Dwc)<8PP-ql0&5Mn`A9R-zW0K(|d}G-(QePG71}fY*%XwE|Q#nra1z=QZ*C_e8-0 z!#%NdLIm{Us6N*ad=23Si=+q~W4w=fVYDV=@+MMW-J z*|qb9XFahQSw(tRksZLUJL@$jzD-$hF98i>i6oOqn!|hnfh3YjB6Tv5Oj60Dr3@&i z80eBLj?3aim>nSSh~pk{8t@AtuwJlRZ(IUFAV6>m5M1H85eO3;!i4VyfxuS5b*pg- z4aaz310#g@2;o~p6G7k#&t2h7WyXa!Qw&S8o^&9Ou^zoU=zu2B2B^Kfvn@WTIoa*r~pVco3+kn zU0@F|0?B-vWW~c|^3yW;Ut~{L!D}jbTZq!?5^&hT`P$(=c%ocJS(j0^vNf=3%Bq^O z0Y5FAdV>8B(n%+>jN}VczF-Bl7-eL=Xt7>w467&zWQs(lXaP$V?cR>Oc*nK4pDC*F zDa?=*W;nbv1k#uxX$nxmjH)mW0Z8LD^W$q~y6lo_W8?-S1tlz~*fSt{RB0fwjYqhuhH@0Mv?9Yu*A;H?iB7dgbYSM8E! z+W6p#kj$DUvpQMGT{df)&FW_D-iYtP2evGXAGgFVC;>OL@0M<9Uc6F~F@yB&cLLJT2Hz=s3p!*Wt3AH)dJcT0@ajbHPsy2)&AYXEN*LZhhdkEp9$w@bg*u- z+40jq-b;pK*KY{z8A5x(nj8WJ36wxD!=pSHkN1&E=tED}` z(S$%8=M={^hjN9Jh;Y?D#ZaddemvS%0)PrvI<-kwxLfaw_Q9ev9QZ#fZK90Kn+ z;hh4!=Y;nPkjvZV@^)YlLFga0rlk|6z-x%Ab0$S)Qr6&UL*N)i9iyxvpdQQ)Tn(gy zr(jS)s{b;k|1ynXP+iHLzpfWvjKkILIB#{Fw}yDNoMR_nb?nt>Jf4jzy;IN>asMG5 zR|WM96-hK<8BMsrwm0b9v7sv+SOqzOsQ~^(I-v@Fac^}xe!N@S1RV6UgR|Sg>7m^s zuwJlPZw$~xAV6>kFh+?W5GLruj3FloY!#fh8Y2>*6dR+=O9x)TeNpD6bD=;5flajO zCfXkMX(Oe!I@=n&N8r$0+e!GsRBIaxW@|cgyWtlz*CNUssJxJ=A|MZH5^x?(D=l0pA_IT z$9-0ST8^t#fI5z=Q-FGot5<+89QQ>5zH;1G1!&;71_kitIbZ&JjEU2$b6dDKPbcB7 zJB)G(qugZ<^;pU#mT~|9TR(7o(|d+`uUO2iVqB`2me6KV&6SQ|lMPZaeD4^3DD;&m zjTnAL3_l+LEN0`3Y~i^rydHi*iAe{wLAMHyRopP8!`YyLz`<;It{@%8rf@A?MXseg za@SH2(>93dCW|2rVY-Jf{Q{3kVcMC4N6(B`$N>N;rDmbMoK$_r`W&|l- z^|krtQ9ok4w?X6@j7yac$K5@vmpm~15@o_g8AI&g{5?D>OK0vujYG9HPoVMyQ`sPV zOQ3EkK(#FCw29TO9Cie0A&vi8>NvznI}+=GLTG}Co8~iO1Im1$;DMuxZ*T& z8g8u*2;Bq14SZ_|R1mrf!VOk8&uqQXN^JV$G+f?|xyEKN&w@h;apRKC9h5b$Y;IsS z_XD&Cl;#FOv%xq-y7%~*duuXxI-cNORTEd$ylh$Is@nak+Cu?)T~!Z|fotlH*VH`# zz%hr|SddOOlub6`1hY6}-I@4zO#G5%ZDwMNBZjw&;hmwAa_)Hix2=sw8h%mQBLCQ* zPo5#nnkh}mbY+y4VoIj1rYvDf22q)~NTfJTSvA|kneQ>iilYZV$u&C3wS_W*(-kGF z|0c5fOO#eWK4TGjP;~VN-ueUoJ(Q&VUlwI!p8hxsXEKCo62dftJ`jOTOw&zFa{z4~ zWDL0VxW}CT$t-H|oMHLB)*PIJ3pAHE%jIprx`e3{z$VsI;Wh zA!Vb@PNCOMV<5<(D2ES&R|!938#06S%3!_WaD?v%Nuorg!y{!yeoSDF30hgpJ|;LH z6Pn4uDSq6V>LO0nZ z`9k}Ap@$6I5ZrGFUNUf75N-<=GO%AH_8WT`s3h1_m(IO}nt;mvp2*x2ZD3mz0;M8T zD%yZy3|?()sw;PPAXVk|h^)cgmUPQ{@+Y?fCQ7}bCAb=PUKn#T`J_4EC@JwzDJPiW-xKaCz+xrmM z&rR6RO_6Er=Ry(Os+OT_?ze1ii2`g@XLC_WkbqxlRr@JV%k6 zOWd$a+-TWFCEV~5ZVVJQ%3diqu#_7n12x>J8l%GnX?)^Ff8r*{G(K}9KXc<`pq3j| ztGJ|&8(F8&sOQGi8~r>e(J$QCFWe+q8eh4QUlo@$aHAU(xAo;m`SRaAL9N3d4?Q=(G^G>9uNMt=a^93vH_#*8TL}ZV~R#J8~VrZyZH+z>h#D z>RH1O1m~|B%tgb|tFp;k?1W^H+pHVdFvx3E0!B(b$LNLz?9x`x2u(}}VWgthOas*xmE(z2n z1-L9wmlfcOKwVLQT!G3}fIPu0PvLa9Dp+3?>}7YkF4$fd9AzM1u**lbpRrfGA(-7z zq){w57YmJLh5J|#9}7AecqNFh1f8t3-wNDYg%K4Y5)mQ`#g7U(QY0c3AX+4%6(B|= zViaJzNNiVtIFX1`fOwIJSAYbONKk+zkw{X2WRXZ#fL$W7O96I^R=bTmlu*_Wio`*M z#vze7qyWc7r{iKH=-1FCr$y?t$jiW4QGZr+mVqqMIZJFT1KDEBY_XLL+&#_b+Rqmb!X$n=$I zJYYILP=HdVZ7I`Jrty+#_mb%)1C`A5N@l(cR54yvOcxobVJ6ftvt(c$t69hD!4-h= z5zT6%S-tGghhSb8%sYTxj5HGYPKkU!01(S+gDQ%2?ld^-kg6Zy6cq(x|0+)>4Dua90GPX>BxZ2S=_U5JPKYXggTYM<9{5 zPo&+!&@q7iiS$SrNTaoBv>hBBfi%)-Z8~iSM@Jx#LAzzp91wJwXO4>8_Qu zkE~v#v5skMQ`l&Q(g^0X!JHkO`-?ybrw!rkV2uocSZ+uxHx9gw2CyoYTmRkCN2HY3 zmhyJ62!Ox?VH5g`R?9lqAW<76+QG?)Fzv$!&q#-R!~7F9^DK(VqBIcai$FF-Wm6_H zaG7E*8#Um(4Lpaz=WoayuNT$m40a1}@S~hvS6f_HH->o_M5W;?rDMTm^RN=mr^IN# zplibgvvAqD4#_(!F2*M>XOJ-K-&X)< zJOa`IX0UY{LfddwrL)OpS^doUd{%5ROcKnJjLwyVRVBfF&Ei&IBl(12bwaR%ff9kU zqSaaBwmCTH9M9>hh0)c*c-eTkPNdd}9ISMsj7Z0y!vZI4x5Z9{%Z8)RWgT)jM}%{> z5VM6+kL9dmIS*OAD&dI|-WCp@L>foL7DvQhFc2VcOSHQsdc(844k1X&QLb8 z%AHL+Wz%jjhM-Gs(@wV$_%=cy@QgNnW{e?6;3e(yl5Py`9DyXpB8jnqP85MXOqV^z z=?ntdOxtXxqfFyI)9b!5pbKe~FkMTGojC%f%%7!--3pHx$H$7GpeIcCCyLE{WlWDU zrjP6{Wz6a_#_xNm8A|mI=Y7YxBN2gJe5YN;zzzhmc$X}`G0f5t_{w{I<=cR#5P=5X zt3d(k1dBSs2CA-V#FZ6oUj_b+?e-M5QwrN1!qA}|;CY>N_&!uwljg1A7y7-KZBm`(Z-yGjWzy}k zu^&YskL;O8_JV#CfmfvaE3ygnqXyvhiu9I&O0r8O*;NLr$bMC%j{;1sBB#kfFl8M~ z*}w}xiH1FP2v6<3rHXi+gKp5o^X7ouT5KCFaQkJqb%4xfDqv?$_ zUejK$X>aI@5vZhpt)%D6Ko#v+MLPk2UAnkd?PI8YMkgZz2N;I~Ofy+4mOf%3tHj|# zw{YXG%UO%lhkB%4SdW*9?~%HDqy@O~aYjhe~$A$$8`jE6H08opjj_iL(_a+n>eUs-t|D-A__RMfHQ~2<6V30_k&H7gYYjw zj6R5Qf)+^p(V~P7q=E(X%TbCyN}0<><#L)YH^z4(jVju-infNAhCn!D6>dxnfy<23 zWu_^-D+KZwr#uD7XB_jHCNhmsK_6<2D?*oK3i?b1_#$Y(7(-+sPz`ry(ziuq4e%vT zyyUInBso+>hXn4B-~eYlB2X@}<)S@UM_?7>HBIRQBw#o@ORp$*MIFxJ$=e&b+ z0W%GO=bZO*t`!t70u`KRg)u(t{)9$%=J(4E`Jede;VUS3c$U6=0$D_5bzE(GT-_d? z0)}aPWZ5%;dS*OO1cCPg^Iouox``5#K8^x45A1XtXf0XpvR?C&AYKw|WS!(y!4d5} zmVqRZPZF(UUZG@>PgZ~&(G6`i21|Af?{j*=99^h4dL?;klRULKjQI!z5mrHjJ&gGX zM3HP1X$ptMBM?op(WEJy;fp{F$;ObT@U;O1Vo5fZG=y zUPH~3fhfu<%DA$KGtdP)k|WQuZ=mLIY*hK-q%}8fi38 zT^gufGO&*3*U?%Th-KMW))dTBbjfy>-Hr~%{PxWz1a7eG4b~KTTm){i>`m4bPS!!- z3CliVP2uo<1fH_&Q`QvB76e}K>%%dYv2xYwTkmgtvM7dLbNb@n~$79S~=)h4Pa{0Eod^fN|!C8ZEDShP# ze3Ur5=)C6)`m8(_8#3Qu+2;Eo)Uej$})7@ayL8;Wz?P}>B08Y(tT$8+Q z=O(<+?asM>Kk^c+Fl?wvA5xNy6FF?79JUR_TElD_j{?%Clt9(%VoUw*XK%vrXg`u2 zsfEwAp#R;irgp1MVD$=tR5g{V0GHKnm(?v~+w=3(&GOW(praf8^W%LVM|RkXGahEb zg_)Sc0?Ce3HGlr_`>JjD+^u_R(|c+iT!TOap^YHSp>sswCZ)YenL~?1;2EWThT;gm zeW3t>8cI_`nLz^s7Y%+xlG8@k)8`0cj$%bKPq0PDPRM%tc#)46&15}&g2*Q*K$h4f z%h=QR9UFgV-%l^M;o03?wdStcTJ|vEgf5)0g@=L9QQ@jCeS!+!11jDyjtJv4aMCma zA4K+pXaQaf_kaZ>1|_nQxHP|t+*i>GN)x_ah21%&3{`3jphBwB7p!EqWU??hS(pp0 z5j>6f`zF$7tQ58R398L6<+b@W?eN;@gg`f}r1h1w8`M<;m|UswTUXM*Rnp638ntx) zT6#Eujc;A-HNDKDaLC69w-FxT=tKXzmgu~e=nI}*=q~ZnuJkP}nL9CqbIssdf$50e z#9q#NFXs*b4xHrCV@jXcf@{%ja!73sX)hbFE|c74(ozQUNG|XHfR=fRF|Lrb{eP{U zc~liwn!x8(-Kx5`3J_#fP(WD?;@U=yMw7Hz+SqoRw8nI2?9!|Pu{9z_ z6E{pmP!S(I5yh|yxbRdAZfO;Q5L{!UC?*C>(CB=Z^5fo`KW5IHnVdsTy`Q(LZdKjo zyWjnmIyDC6aJXoz+6xvu(u8$G9SO@B2`nW&U~PgER%bwb!rN~hTk8Yo=4wi==7&aS z06f}4`1@4;5OejX=ISq?mrc)9FW{~D`oBvhGWFkN>VJ?1woLs~h_}1GTTug7 z$<(*PU#W~vF#QDUiJRk4rjZ3VvS@S&2hhxdn^`nERd<0w&FldLn8l2ntnu7sl6d#J z^12@;g@KPYLzyA}oTbe2!<-cGukR`Eb^lxyzUYsu==9IIp<100S7*eddoln>;ZbkI zp?fj_ND29^5rc|g0FeCRlF=94lL53DacxFCx+epGj8NB&ICM`2aKnhZVZ@_*G62Xs z|AUc$?#TckrDVGihdNvUkP4;4h)4Hi0FcrCrV)qk$p9e1!;eNHx+epG1ZqDS1JFGg z0AzXTG~&=b831ICxMd`udoqCAM%-;99^I1xKvJMI8i(%50G85(r8E)UlW}z7lYyNg z4nGJEu{>pioe~av3B3KiG;A-8!43sr9}U~*0L?V4na1Fv0ZN>sVdos+JPkYV02gT3 z1p)GQjec{?vA?Y6+P9;w*rTpEtSf-U%813v{Wy|N8!-Hpck^O0`Jj8u6@N_3Isnp? z#583n7R3bsA9U>;cG940ry0Q_&~zcGTZ`EPf%4A_kuO}IoW&QGX{wc``k^1&s`NM3 zMc((y?`&bZ)4)|GlP3$Cjk~-*TI^kzwS^+iL zYzAx=CSquc!dHcM>OAQw?EEHJ1kNq8j3N=~89=F}lv+J-ak8ojAX z))RGiP&7j`GPItUG6_JI_Ij2!Q<9^yv^4-X%K0z6Mu^vlMv(+g+HZvHH=8@&+kRu0d(jw9l~cEKqd>#WTR0d ziRusDChW|FcsqDAO@?0+#F4$1uLi&ZQ(s^P;B(`KChxCywnE(Vgxk1{$KA$6+yw-1 z+T00$#ohaLfUcO)SIih(G6N{I5(}*)lzjk{SiMWEKG<#m9I+CQSV;(!hUf=>dw1U! z-eZ^P{g&x5INtzRu177``yu%8E3$CvtdVZsV+&kHfy+YC5`fdR@znPH@pTWcc5_kZ zQy==NPq!QS@#(kzLc2x;L^Ha?9$c3&VofL_H%us1N-=oxCSDSrS z3zZKhfaGrScG5@u<{)6(Zu0113&3`hM-N*7wwpX^g8|rX@)$w|fbAxaLlpqqO&+(K z0N8HwxZMQ6c9X}J4ZwDjmw@diF9F+4UIMn8yaa4Fd2H%ak1Se0sL${7`3}vNu4IZB znyPZsoY1isGV=MidQo|?2THbV?B6Dq9`NMz&%KiMT`BBh0jy&ESFvt4D$JG1`;na< z6MGh1(@P)s3adH*siq&O1hF688nhsF&EO}u@e%u^!cGeJYdAJh04d6#6lExOaR7^z!Hbn)II96zq6}H03`el%%9EdecjD-F-gcY*`@BD> z-{EtKog@_Jd3ZI>d@}$l39TeOaqkkq9um5TL?b}e2$$~cq@s8+sECI$5A7id4OP^q zO8ECciAHKQ(f~y zplk>AlV0YR)cn%%cIPo`9`l!8=6vQepLM@ojPuFItOi|gaCm>(Nm8XT%WaN#izsfN zfBhpk3C=8~(DOEE@?KsScx{9BHcAKpmgzpr^iUl7yFlzRv2_Swxo$4kgQXJ7_5REC zK@w;; z*-i?JO%&S5Mn*QWXdFiCJ(KFwKRUFF&yLG{=rZ9>l6){N>$Urj@8SdO7sTfa(gQo^ z)Tj{ylOI}8$p?omkRMR^^aI$+g0>2Padi3aqMdsdwH8q6<23#_y$>50fLko^mT(dR zaF+$%b%1;`IA0jl7$dyf53gKM#Vb;)M%JqRr17&&8_*`4m(gs--sa?nG}2eAF|8Vh zDd;gX3POQOYMgY7rCSjw%0SK5T5PQV&kWN45%99Un|~X((#!2gWL2W{Dp8_v%0;~r zw_~z1=SrQjfQA&%IH^-s)39oqAOSB8^9q0#ZM+X&*2!hZ2LBbk{}mDW2R?wEgBLp` zwmh!bvJ>xOBY}%KLv#b!0y{fuB!-R#P@o1CsFCOl0-#D&s$fsyUOG?!dE~`B@&+oz zf4Y~-mp6SoeXrER&eNpxbcoav)|dfn#9m$8=O6!cnEYJLzjL-LIomZvlJ?xLWVZmL zCO0qqwynb(46QcD6_w-ak3|6-arHdn3dSLo4+1Q#opncg2hhR7J6LyqBmhgyh$Uj( z1R%|fNOORdX2ePdSY?K+5^WSt$uOfbguDh|y&1LM0W!^~Ob5sUC87gtFrzj&z(zA_ zqXTR*qc%A}w%IS+j76~oZoAp+x7h)5%%~j4DO=2_Ee_x|qudTqX+>2E3*Ys%?+%>0 zdf|R9QdL-y6~asxz#%L0kO02V-F)Tf;8R^iKXgHSQUfjFq3Ar9K2HGj6Xs)*ox~Zt zNaDV49vkuFpAYhgmL7$AMDQ2@<%(6V_+vi<@Qp&hQG9Wf1kkF`R>c=bNdN~l>wqKf zZoOvJi@3Wry~cg`Y3>IH`Qu&I125}AC`s8epJ(@@5K zJ2oS{e%hELe3;2`h2*#*aqIw4X@yh@!}SSsKa4wF*3fm4D)WIVa~w_~r@nPfPwDezicV6@YPW5TsT);8M3-v% ziCo4@U-Z%$QW-Bzffd_QxlB8=+QqJ)Ssnb|w%_YtaXBZ~7?TU8e)kpyI3Mvn0z2P1 zc0+jjI!mv!LU1n(z zy~ctu>lJ|gX7qkxRe~y3F5udk=pCEa@{$V9U9N{NcX)d&*M}_EN8y4AO4P8J8kU60 z=Df;Re=$wDaEi}_7fJF(G8pF!0PSR8I~jy?1{%upirBgCB}x07+4GzkD~*V)X3thL z7Dq(5Z-r%5Sbb3?2;h)q9TEVapR0OH87XB!(krTB(N$~+))`88S+rLGsL(YQdX2?n zCn|Y#<@@>LFV!c&L%3DNtp=cg%f|v$$yI|Skf$nnYM=x>s^W2+vRzfSs{tqz!!>rO z$__P10)?tl=m0xaWvAnm-Rj`o>L|2;foohPzE?>gzFh#>RL`cqIK%BzT)=}aQ4fItBv{KgU2-?_6{aZyu61YYy4Qr)+9H&IKI;!4E<6DLAaMvlxt#pLr zl##9UAqRM*l|JqOziJhUy1TA1rB!&IW|hazi2JqrH6KbdXj}#zgl2YK;MolNiUcmv z5tryVygHOJ!rg!GFobCY^$s>E z-1CS4a8Zl6C`=6iEYSNb5CH@LRO)>z^vjOCtZ%B21OT+K#1=LHBZ~oW=KBTU9QYsoWq|vfYepk~ zX-zD&iG`s^4!{}55Qj=Ws}(b&nDxPt5E{oGi|!HQEbbBW$+Oc4hmB)t^1MSQ+;KP$ z<(L6ELPLgLY<%WR*LtUGF^;K-Y|#8ry9Z-*trkVHxVL9rOX1=at88X`&59cpxk8ZUtq;-5l7q#I_E=u8qX0S|f7L#Ci! z1TMOV^xs1gQL+Y5P5M-m{t`GyA`X&%2(VLd8K{m}btD+=1>w6kkcb8nhtGiK0{k;} z7~x<;AbrM8I-yexHgMmKX23?Vk#Tiac~Rc`@n`v9b5IRFsP>h#Yw0X3U1$-ZL=Brz z!+wq91Fsp2tYZmi>48RneBREWB!hWL<1q8yO5?WDBTeqzv&{ht=)(o{ap{x-I;Vinlh+ItG`zx5 z#cKLoHGM@or<%@%#mGYWBrl!rr7uWjy!3BgSl3A8I1M{a`{IxcPkM!gUJ?Bg9`FVu zH<*d*eE>f&@`D4kGt%w=9gK81z)ePOIzT5Qoepq|ky{RMhmkuDaF>z04zSeJmzq9O z#qv!(-vJ8E(S_!CG$+q`b0YcGZ~uOd4^*eDUZ<>ZTs;A(w|dnJaQNuJ;=;y@=XsZ| z)Ac%`*Mv8;*kFr|U{qs5i7fN?St2GeuJidI_mL9ukrFHIW8WrWw@EY_f1yzi?;Z6< zI9U2fN}B`p;REzZ=~JbderY0R-iEhEuu1>%(nUUtWzeTG=+oGs(VUrIb(fm3OHIPw z2z4zcq?l0DqyyMb!uOL%?AoU1`r$Ea?|jSCH$AO9ZKAak{QRBrJNf5SWvcvhnlerP z`Hb?6{Byc8UHj1~}k;n8=(lmTZ zPdp`3Qo$(=dSZhEH0!a=!fOIboY7;?IKX*5{=D##ff5(>go}EjbeD_zpDyY%Bv4P| z>uCb^R7{M=^=>zGazkWH25?i4x~UJsbDrqky4XQGsmQf?JziHy*YlpIT zn#l7tRJj^nu0~5u$V2*iNQ^Xp*Dc@cBDoQO4$HU0ibh*goD+D5 z+{KJtEC|POD7x38d#zxs(aN&}c8{;zbeZpRHd{us6^Qpm>pI@4E*arqawkn>XX%8q z^fCN2aPBHIV3mk+_a6gOmn84Q=!_});W+8SDIjlsvpFrR(l>gkG} zt^}aI0g85#p`Bzb4p{(h6YDk!kwChpq-(w?bwP=>nzB~&b;J(v%hGyDLRXeHDogvN z1l*e9)_l<%9j=k5DS4VNTJ!?&Xu%#WN(vR=(Z+kUi4v&Q#@A{S9fI4#joKuX)8HCy zT5_8<3XP%wbZWt!T9gFbhQHegM?)hh;Wi#{8;?pLl`5&!7w!C^#1g73p}vmz0}p;i zpTOZ5N_!!!=7D`vTDN@@T;;Tx1AjYYbj1w1Vn*T` z2+Dk9DIY=i_&EB=iT3kH02Epgg;qSO(EyZKz9k~`6M!RD#1ShVo5K2+kN5GEe$vXF zl5UxCx6EX`I)K||zuV>j2N-|bd>p}w*%Q9r`g+t=-p+UEzB`0FH!57Xmda_Qh`|DQ z!@d_j;PjB|Yv(;R3#wLW`c?|he*jfxZ%DH!HS8)gxysS>H(L>#tpt2te8aqdIn4@T z$St+}ORYeBaI{O~6=^cUn~X?IX9V}HpaUu#VJtgYV5eha_znxa;{Z#|;H5&JhXOj^ zbv>&ZXVo4!pu)TQ-$supd;7VundhUvZ7hYq9L^FBibF|-%ik|6G9&Zw_VF7tz}bissXT`4P5WY zvXIYW^Vt9_k#YUOSH5|xuK9JVIpbOuhp|3|(v8%ZO(gO=fE=l%SWqFqw@;)j7}aptVK zUFSY~^2GB$@k>O}sP0QV>V4gOsj==SE>9O}Aw^m!IyGU-;oC5GNyJ@}EcM;pG;B8= zfKoc#t%-&;(E%t6V5(uhkT|20GmgZZD-8b?MsG@UH6BEq#j>&@)~{M z|3LumS1)TG*ZSO3_ub;xEYV4cV{tOy=rJF{I#lGoSoi1c4?&4^vtPQ|oxE#V{J=d<6{FTq`eAh zZwXY-GqqNNdI%r^r2q2yDR?vYr*Yvr= zUqrc1%EfLteA`7vk3~j=^dj=iggg=dA5%|r8MIUjF4YpG7E`OusntI2_N;@i+Nga9 zf1h@H)&YVb?}x+&1%MMQ@&p@-3I_mnEU}J_K`^f0irLQ(&AG#eq}?vI+vSHtF{&SV zliX>9?=%uoxSRRvn=f(m(OENJne}TI9OUu;-TSXdIxdusi>2dS>9{~TE|HFRNyi@P zxKui>kdAjs$J?dja_M-pbi7SE{z5t~la9Aa$2rn*zI41pItJIh>H1@T348wQ&@xw{ vYp1Im;!_s6cDc5?^1(IS?J98fLUj{uSe*W;@`EznJxyi}NIVWM<&_RP< z4A5u>d^~i~=QF>Wfi)V9k^Nuz)q>BKB8_IAR-;+8?Ld5OTy>yL^rPT2md6ioEkz8fH7$_eh5RlNhgs z6K)PT`u^&s#>*uw&u$Oiu=Iz3uucE@ZC>a5kN^5$$Fx1;H(fhBc<*@4nfQxys>}V3 z9P;`0&w;xl%VNJD=omQ8quVDx>kKUuPWf0*yy%FAWrd9D75m4`U&D6xA2lzh=c6a7 zdEQXU>|OmuKEfp0@aphr70{+p_3|^1+MgoiCRE^#sqGT{yJ&tLFFG zm-YQVx;VPy;huZX42=2bpXo0QJ}+WM+&tqR zvv|p)|BWg6?Agdux7Ky8yESv_ki*u*@lVH`)!T}O52>Yp9gF>HeO09AzhWjQ1n&x* zl0@!&H#REr$DV&={}>rFd)DHrlctdY8z0#%_;vHDb0dS*l-_QWmp#9}WZsjE#Ye_I zE3L8iZMZTvbWg;QAKhj5p1*##GF<|M=-OVNc#K7&+s^*jEdxcJ^vF#ocb| z2Uiy_`*K5L<+b*OJuY6fn>=#XjVGb^y^}J28c?A+BsrWOHX^d|Bq@IHfM!Yh(^sE` zKY733$okoT+I~IhyRT1wH0AMjhbeJe{Z{nRtz8*C(Kz;nv~g7O@0x{+KmU+WjV9xQ z-4zS>f9n-ZkVd065~Y#2yty%5ZTb8Z}%O?$CMxarsK;FP6^e;-_eaup0afer~N75ZeVN?aI5F9!!yei3ey0*tcFl zyrfg&@v9p`!WE4x6VG&>*}nAx;#c`0?=;uE(@&53*=W=ux*^8a3yA;wa7okf6(a^I znm+95M{>JI@}M_2DDn@_c(u@}Xt1K`#)@o`$R^3*%?*ldm~m+Fh%R(c|^VjfscrhMQV1AbxLPmylzwwc`~{clHHGCFi43 z(3=|+$(!|bVf+WbeV|7}SrdC}dpovXKs@Wvhi4uz0D_yNeY~2rIH(a^5a=d2@pz5}tWjlKceI{jlIMcOL3_x5aIz9*tyAkJOEHXuW{g z`L3MhF~=%Rk4&r=`)K<(wO&B{M7wAHe+O%K>(M*x>A||eF0B_3m(BkZ4ZQH>Zfi{! z_T3X~COEfVKs?#S4tf< zUO?P#;-ut*IsGmvnm|@VHBqXG^P3wKS+HP#;(H7BU)G~RtcEfAF^;Vl5JydZXlcKE zM82YlU^Q%%+ijFX-rS(b?z8KUPP-j=g^eT|s$RNY4y_ju*N+^R>(MjpilXVwYREvY z8OZ<54T_9NygK{U!^79~s6T7NP~A|q^#bC%b7#Bn%?ZD)Xxv#1CkQz~T;JTFNWZg_ zOV5v*e@D@DWkn`wCpooVK-@_D?#*9*MZ=sC zHHMNHYIt*lBANv=KUp}7)i5Z0f7+kkS0zbN?_updY=HXn+!o!?Ez%QYRO@7qIynHk z&!}FLJ+8_Az!OH$dr(<{@n!vTo}&HA%Kgl5HDx);Ig>PApT@ zW3u*`Yz-ADYK81vA*-C@ur3Z8z@C>K8*6&CWRsO-RJS76t;hsl1S=YH{eSD2NiCsn zCDaeJudv;c*p(6E4bCR@AnI`t^@66E)H2kw425%UL}MD!1kTN9WHTDeIYwR;WE$w7NzEobvq?DT4B9<|hJoss)NkOHFPxRTKY~c9mKhgj;W&)fX{V1*6X7kM+`_& zQ*gf&JOW;YsRbT%437i;X-Y+K%J&Al0EG>j_8_u?K3CYF>B>a?x`V9mAX_ePMpn(p zz&S?N#mIs_#>?7x*$T!?Q5$7lqo|K}W!+ton`Emd*}%)+mv#3=`D0o8Shj+OD{2(h zMPX~ssaTgPavIj9iJXpg=^|gix(g!bVqLDt4OrWNtze85Hm2HaVg+NWs5wNNBXSPEAC`CO(wP!>=OSNZ3&Z62Zk+Z2bTjX-8Ef=|h zYAZypq}oc6tEje0RGTTpRGp)L$j^t7O6XlBB&PS#!Q3d0dfv z+7@`VQbLuI1?Or>TP<00ZjexeWC2!JQJW;xByx*{T10*-p{F8mmMu2RdOm#;Wt1pe za88!3lEvlWrHo$67JT|F$7negcrDhg<;#PjZo_DsC{MyDN#uQ4zYiOEeTT98VcgEN zOYdweC0$a~pRoH+B0t9TF=pY>n*~>Wg6R{HUt;=F z=QYG{4e7#p0}0+hLOE|HA)AR%UlIvSB0ab~l?0}Wyq9#^OMs!IT zNzIWRa%8WCJx;E33JaKTQqRi{=Q-bPIk-D6s&4@E>-J&Ceb@^+;**=E%Qss31u;Pj zAuU7;j$T{(!1ArMfx;qemwfEQ7sN(v--tb+y$bWRy-tt-z5t#g=oHa&{*9vFs2+y4 z{V4B?mll=;Gtc%@)2BggSqXKnX|6!A*fSP)hej*v7R-J^IG?~?CvXqWr?AH<+zt5H zw_R^~x-AH?GO9_)kc4buw2f*qGA1KO&O4EDr^uL3(3`dPsbqR8dBQM4@`_rvCapk~ z6}1ZcRpAh>yK9Km8sf-xw}gb3kU?BmOUU~rWG3f)YRIRqpu1UJ#wQ0itm((*&PL?6 z5qZJ)*J$3KFmZ5xf7Y-TiT$)$myBHjr^ZeH*E=38c91+8xPbLHwtj?dp(!l3!OoAd ziSrZe{6ysE*zP%QYdSMy*!iU>{~J61E%FLtw}QW_NnJ&pR}rE9DB>I?atyJH5zDV8 z&Z|Xv9C3~lc`dP9E0$kJoY#r+^~8C-$Qy~>MzMT6agG<|3B)-;0QLUh^71RVe)$PAya?8A~4P>fQCA(M2p0MVopSREb zqtZGOnbcTh8H)^{Z00r5ay4f#dMr|ZotK4tgh|b%p}F(}_^P;#;eC2++di1tfN9D! zCvYBMcCr=bb<&nUe_6tpnXxvxWokO}nXPQ`NdRNdc@P=TBSXY>n%lt*wOL)Cx1iJ)zX02swewlkgg;*`b zow&Iu!efi@RL%`JqyhKid=Ik(PbZkOike9xGs!q;9dn+kVH-8UYru1?b+41xynQz* zzDaH2H6RwjmaW-qZqBabj@NN_s7Fx`5vxPQiGP1FH55}fsKzpC${ed0>+!5V<78c& zYzYGgX>evP%{g#he=QEI#RGW#NyI9Nu>21=+hwGC85zRguZ)Z<6V2uC)bKm?hVOr8 z$G6@OHg6x#R6E=!JPdqKu;#2AUZ>c3H`GeFR&s|mF2eTn^mof#Cs~-(pOEEG$Q9ae zQhz}%zo3qs56YGYWmlLwCiSpvd06Bu*(QrmEt7gt_Pi(u^77AQ%V%<%vuILJVwaP+ zBPgm*;F;u!-g_sp$y`ERO8A0cR7Q)JDmF!@OnojuyJo>8oA6QWrp+(lvafmcw*&nIIOq#3FwXJUF|% zY|6dOpR=k{@JA_l77U7sS&xsi@Mpjm{a$R2KB9iXw0$eG-HPm?h8>%NhR=F;**qpF z#5RT42>J~>F)SD|Z^Q7>Dn*7;)Ev|hmMn{fK$eqihWka+ql)o(-Zp)6K zU5dIA8&+aRXsDv@z=jF3+qOeXcXgpNyYFr~qjh zs6}LI5n0SRj~eo*KTI@fTE+Fcr1eW!__$m4+%31~Z=8TF60ibqY*No)+cVe!c;UX{ z%pYQ>FJ)S|0arH9rOuw?e`GoH8>Z@} z8o+O8Ki#!y{gBNoTQ@Vz`x#KNc{9Vjp8>q)<>r?&o-A6`8nll~k>3S@IcOi3Ch|HQ zxegD3K7u_+rWNK5NUjxiIIvD!r&5Vks<=*-lkVl>I#o`_m5b}t6>7M`*C}{UrrxhN zGP%}PBd2QA8D=_~?|+@d;x)`jeUGfa=V2mjb+U$<_c?h(%W+6K9?I4CDYklwy6BDr$r_!W#S^MIEgjZ4JAfiaJI+#v1nf6xJ7hH>57mIc6Ss zLmI~UmgIVihhU0&Uvj!HxpVnL$>pKcrbLSROmccA%3n&_my)otwF23%Kra0GRYB(&Zupq{0+7O|*YuYu?w7aM&Z@ ziW);gVt5`$QP+|_Ysmm!ej|z4NCtA=Lc+I@{+yFZc(Tapq+2@a#pU}+xBViYBYx+& zYpbZg602W{?Yyt(>B{)>KNa;iV)dKI)r3?NtF|p%=BANGVg)|9qOPI3HPisB$o_k) z7Ei9<_8+!2v{5D-WlNZZ3X2-ZBiRxr-Jf}(mi67=|3S~zJ<0o))RucQkFdvm9>OZ> zL&@u*JT|>TLF<4lS zIy^@HoC`?50x|$*IGeb{x0rMkd3Z4y#kquZDIq~3k18Q!fx%~CiC^;x3NT!XIzcnR z0H+)#`FHzh{{Hqm*o!uiPEDj6yl8FS-GMO&R_(yJ)t!X24sLZPA(q1GYj+ZyRII*s zC&4F$Z4?%)m``bN+jk9jye0-Kdx_OvF<2?0h9VxUz=00tI-5^(z>6tr8a1R*4^U&K zl+r+GUBHP5rWIAeU#;e%W*g=OU^WQD4r*R4o>{p3-`rB{!=% zy~X)SF^-wIFmx}Q!d0?W72hxK9J?#)+KZd}Waj!}T@kkCJ(fvynZ%m+PzJTi;Ohab z`fR?L4>)oCug8A%IEYtMLJcL<85(~4Xt>j$Jp~!8Awej}0O2BRUo*%5^?4|;L@bn` zbRD&Y`D;=SPC*f$sTEPC``)}QNG_z`eyUVHyJo6cJg}2hOhsfc9N~l zE0LBt)L^s}=85YPxSzSMh!n1JdwH5YKix3h89Z^Hf4%UMKfCY?OO!mt9iQR=m?q}U ztS+x`Fz0B}E}C@UyoRW2h&SgA#BT%X%y~2ExS0s`B@y2w;?L!a{Qgmks7h2Wk)Y&!pDN?)5x_ zWBsXX&(HRove^dD9prk4Z*UsbX5`$=gLNaD7Li4GFzB;Ut;e4A*qieW>~RBoac;mJ z8gNI>nItTepXo8GdBi4<*uk`7F*)%rAniq-Qb4A1&Y->-)DQIk#b13c8vh-b&Gfwm z>szn`bR|qM$@Tvo;fvbrkgD2_x?t|Ae!+vGtESrz55J6J%)j1;wfp!^4;=Yp3!C}8 zAD`GYIHX35MK%+w%|wVru99w7$uMZRqFyBvu9DfD3#p-y$0A{)uf^Q@^MAQ4`kUo4 z%LMb&$POBX9ph)RzAXA?>^+}F7g@0fvhD$QJB{jZSoa%lb32ps=LbyO9CMK^kjG-Pa4%mWZ8%mk-IjcAkHyz=NP$*$fIK9F`OIafJUAI zGpcvxfV(0$$(~KJH;fJ2@{rk2+infBJ2GwN2XD;m*({b%!(M6JVKS=e*f$;fK@S?$ z3pn5c?#ekAcgy8F+(xw=cPhsLpnPl_2?thi2g#^bVxLOffy=9~XO(E@soThOh~y(Dt}g|M6o_1i zNTJBT5*ERGK={tg9brELUm^Bah!5|tB4S^}!+#@-E9{Gj2bY%+`x4TDb1AVeC7n56 zCH7Z&AZb*~hd5(_l6;jVEk+Z2!Hthi8z30C}c1~Tjw~FnIgu92ggS{q&9glWOlHDOms;F_; zAr8C2G*i?ASbKmko}NP|ljXnIR5L@_B$=9cdQ0Cu_fT5GiE6gW@+to!oX?!OsY=qbRaRlI#mjVJoHVc#Nl@&Fp(j4&oLj4!g(U_R!S% zyT{F;Ei`=n_K>W0^)&noq zv-HXVtUrKF@P<3*4#&gBes{y!$POiUIfw$`4Vf~du4SSzZ$v{H(J(G=Mv={EFy|Qg z>lk?v=XkkGJm2p#vV-Ji}17}JcBEH1Mc6z6WGk9A>%X2yU_JUcIdckHqZJP)eIVtLA&zF zSWW}VX;)BwvvFNiNx$J-O@pfW@@iCT=ztm;$>p`QS1s+$xsDF0qr-rA&>^FDzSne% zjnF-8a}OIqXP|*>oqqji7JQw)L-8HH&sTKo+`Q9$OK-F3!j8#oMBWh57}b{L<;@A!^?tU0Y!a39UdjITxXVdPo$#I`(?-P6Q ze4cx?=(F1GYG#{f<{eWA@QiPzxY+)9>y9a;xY!0r>y9a;xZw5KYrp+RAtv=S(Viwo z=ohf|7DkrYw__F_1S||8cFe+aE+%%&!gDSmcFe+aE+ux%!gIb#?3jh;Tt@7eh38yO z?3jfIKK;c%`s}#r`Ji>z)F*|jwt3gIeHIP^)$FA{$eTlFJov&q=ahpyBW0d*`Z8q0 z=g=KwcSl?h@1Tx%P$yA7`VRkV4zok%-iSQ7yb<+lMDK8JMmEhn<7E!qIyCb=eWMy9 z>tkf$`(xzD82PO^{$Y&#F|RLPR^oZai+#VWZKApT95b?~BjhmxJ%i-MGA2c4(HJL=J0~!#O{emB(^h#?8E7>Z8Ok zCklr~@zjRdMtMYw3u-FXr;6oMad;}v=$UPnK24OT;elzQO-sl6bWxs;!_s-G#O#pj zFNpFBIN}2C2a01=BL7X4zeRpUlvg4zr^<3FeBTPH ztPpu6RaT0;iYlu_&Y(6K)Q+#|nN-Q-ex#B8;f-=eQqS{ zpTFPr`={*Jg;-mN4KQQA{n55%nQP25<~4m`^MxH`#9)A#^YHqwMxi2hoRVr!@Kb-y z&D&`4vYXFYLt2Pi3uzBN%=|?Wznk)kU$TnxP*5HUhBa@&%(*knwJlum(ZVeA2XFJ` z^}mkrL8I~GAHDd;winW9eE4rW@sGazqd))Hx$UE*t~@&Q>bAQZ{xEoW`*-s4^X=H7 vou^Ox&H96a`YzSCTIF7PGutp%}$EKbb{0uzO%uke(R{(ZmhWrTKn zX4pgnnYHfgh1g@XJbXiD`n8^1bN#~BO;fMGc=K;@b1b(~>Sh0hCcf3I(a&y+zvj8r z{i%ELmXn_}<6bvr>lkYqr+7uaN@dj1d~}cPis|y*?xhQ=tFHx2w(y?B^JMxTs~*)C zIhF?^9L+oa8$Xv%cx}IK>74yL?@#|*weLmV>x18d$~L*$y7TRE&9r>#aVr1fvz=OJ z#hz|lcTjN8CdMSr!{-fz_b~qN{CByyGB+s}7+MD6S0o<4D~jY{5N2TD6=V_Q024qN zFi;M2b#Oahx`Bs*2Pnuvc)QS z!6ts7NoqD~9xz24V{RBN>fsk+=HV6N6yt>n^YDsuiX-tfI5ptBg>yA#pSiL@jZubI zPC!lurbWe1>DbBQ%SKE*ywb|j7BFERUR6a^GZ>FCbz0<(OUt|%MR?VM)k0vxP7CUl zK2Dz(3^Y<$OV|!345JyPP{Q`(zU9|qUQf>js@5>mu!gIOzwzMS+zHh{VI_VgVVLj_ z_EQUIeH5Go6xQO=l7I;>Ul;wiF7xILpi4BgG<0CXcTc@?Xt+y^T@cr1)-UU>@` z55h{q8Zbq`1SBdc4deAJnRYk7=H+dm?fOwLWo0cKnV4lXVxW_DI?7B)ss0My#SIsgCw diff --git a/.cache/clangd/index/doctest.h.5D29A7DF3C0BE014.idx b/.cache/clangd/index/doctest.h.5D29A7DF3C0BE014.idx deleted file mode 100644 index 0802c8e7480d535617b3d2ae558dd7ac24003218..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157934 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

Oj&`E1- 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 diff --git a/.cache/clangd/index/high_variance_pi_estimation.cpp.69135500BA762CCA.idx b/.cache/clangd/index/high_variance_pi_estimation.cpp.69135500BA762CCA.idx deleted file mode 100644 index b44fb39af173b7151cf628af2b286562ea315bab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1204 zcmWIYbaPw7!oc91;#rZKT9OE4GKc_iaY<3893un6dnN{kiaBd1Ui3O*AmIAh*lub{ zhNDPgya93I)cZT4$b4boc!i))mGo!tYZFoyVrA>Y`s)jwA=1nXz2Zwx}QsptJ%La zCVrV>9=Y$RL4o}iZna|>D`j^swJAK%sVZgN$MtN^g2x=&*1Ucx+W+Ou^_o=u>pR@8 zL|K?$U1%WB@UQffy}@<Uit<99`oJPg7N47_qIavWd+C<6xO z|5oWNop~{x2Nblt608y;U;-xnafa5THJvtlc^G(r(roN(LSOMthRurl)Ss&K0C!z?|gT;0)R7tGHn!>bpd7XlOB7<0pDQ4hZmP_-VX9xqH-Z`CCs z|J?_a7)5wF#W^Klb}yW(G5gGw4QfC`)CJUKV5&o>RzB97Xrm8Q&85nv0aHD-)m8FK zV74XDYz|HiF_^H^f_kNo)8_>P4N=rmw1XKkce_Bb(jUzbkd=a*A~4l3X+|lmfyE?+ z5=cOI$*SwX^~B$JaBuE}YM@Qp{My1WVa{t>;r)3V+JNrj;^b0-*>rE(QAII}1zkV~ zaENnA!i0aYpISKUqu?Zw#@;@zayMJpk&=5{eP63$eyQf~cw6ASmz{tYO z&ce>|)zdUARS zFbAyo;IS~SdF3r89$rNyMGcrRFxEv?q+z_CCDZQa*Sx$9)T<(^q5>0MnB&dj71;I& zWTc0l7fkrK;%C17%FEsXg^?X^CHL`EHe2FHCZK9QJpq_%AkSFO6vo>#Pc^;#@3y}{ zMSNm>;xM0y@bZiC!+AxiIf)=o78fNKyMq|~AOZ{+dH05EA5L5P-=r jFu((bfq@SpDu`ev=ceQUa|Htj7Z(#VJ1aK}8zUzGbTgQD diff --git a/.cache/clangd/index/multithreaded_prime_counter.cpp.945D5C7CA8FB4018.idx b/.cache/clangd/index/multithreaded_prime_counter.cpp.945D5C7CA8FB4018.idx deleted file mode 100644 index 76c5d3ca7481bba2d7dccd8812309bb6910b7578..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1176 zcmWIYbaR`)!oc91;#rZKT9OE4GKc_iaY<38E+Yej5;Frs#hkSh?|LyC3bZ~?-4it_ zQQSqaYO%r>Cym<1NotqxZuCs^+_bho|JULU^H@iYmXvdrPih#KI%rP+;o!+yxaGxc zwktyHoGp$j@Ak;_@9_HMw=E@Rt?{i%J$IGeU#q(>(9vL=s&RUXj^^>qkGI$Fjd*Ox zuO@hmnVmPgN$2!*iNjC0rz=h@d}5aT$U#~=SZB%>S@#2)>UWAI?NF^|~M0&%Cye@2~pt&@S+Y-2Kw?rHR$+t?w?<6uNOP@K(Yp z1NRe?ymdvMW$0ghuED=`y~=}{Hok)eEynAo3+w%0nW7_Z&QM&Ln^Xe~z3G0R;dH%e|!UBUy330_WC zP987;llGYOw!3<5?-pJLF`zWNAiFe}fJqmnrWLy~F))Pq38}xBXv50L!>hoizyq`M zoN{$XlU*=BqYST(wT?YZcw@{BqeVUZLO|6zY&u*pVVFmlq)cN;stHrHaIVJe zGgmgK0gY7UQWb*ZyvsM^E*7ZFBj+lc2;(7m@s4f zjR*JUPN)W&t;wm$3p4Wv`>BPqJ_=3(3hQy|iNb{Mo_gidzP5P*6ALdFBNsa?AX#{Y z8HL$leu0Ss{R9eISh&gXin59F!W6;mXXZi)TpnIAW-+)TU|4DB7{M%G*2u3@vE%(# zCLXZmFmrjpmcw|dOE#u`SIamCbU2SRk37sR$6wBBnES%)A}~;NRCUy0My~kau`sTA zd&eY# z5-1`lfnp{1@l-Zj;zy8PZXI|yGZdxfB!b*tT$EfK3}Og^2ryve{kHSM+_|#xl5B#) sLi_@J4E!)D1_l8HQy9VILokI9%;emZ98ffHaB(p)v$JxuurYE10Qs$R;{X5v diff --git a/.cache/clangd/index/test_basic.cpp.6C564E4D86FAA374.idx b/.cache/clangd/index/test_basic.cpp.6C564E4D86FAA374.idx deleted file mode 100644 index c18ad25e9c1d8f9abfcfa095e997b0a348cb1d98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31454 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 KYjFd*(e~dW(W6cP diff --git a/.cache/clangd/index/test_helpers.hpp.8EE7A294C8F4FAE1.idx b/.cache/clangd/index/test_helpers.hpp.8EE7A294C8F4FAE1.idx deleted file mode 100644 index df4607c0c699c1dec7acb08d179f3ac25ee34c5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7620 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 diff --git a/.cache/clangd/index/test_nested.cpp.4DE5913E0B0DABB9.idx b/.cache/clangd/index/test_nested.cpp.4DE5913E0B0DABB9.idx deleted file mode 100644 index 35fb60858166a07eed6c3ecc2beb8ffe19bbe4e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30480 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 G+Vk&At>f7M diff --git a/.cache/clangd/index/test_statistics.cpp.0708F3BF20A7210B.idx b/.cache/clangd/index/test_statistics.cpp.0708F3BF20A7210B.idx deleted file mode 100644 index bf1eedc5b5f60f1c8e643ec13d697fe3e8e640cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33838 zcmeI53wTt;-T!wk%C4M{WpjWfIb=7MDTqG#e8x)mrNkRcbR4m$ePEKZjGe@g0kJ|VD?-QS= z37^i{?CzX7Gr#%HZ@x2X=-|OAa~+NWcMN@C^2FbaqYj5d=l`4jn`x7Zki)U$3Wwu? zKdmepKC&`X>sx7*FhX*L4kLQ!DQnb={lApZsFZUm9*Im@wo0ZBG~9(J8Ban-w)P z@Br=EPOZj#v!H&)#s9iz(Z1xfyH8a7W#)-D8!Bf$SiiL_qh0iZn$IU@J@eKC?J=+J z&3XM;d)zbSlj8gdiG>9{Qar`i+@3hA;I%)WYWOTT67B4!}|`6zkr{QrxPB{>@ven>4t|P~%%=EwV z*U92BneZtTjUVh1H;#f^wO~1q?8ME)~b4zk|2hGurUvdFEE?`&FFL6m# z-$OH>AKN8fGn)o`0z01Imsr2VC0~wae}DPq!Cf?mn_n{3G1b-hLln=yJ?Yoabx+ID z95KB3OXT>He^l$2xa3ILr;9&1cwtDC!_P1I&Tn(`zAcm2-ZWyE=4iz)>F((6YWyMo z!j@&dTKoHU84=}3<(Z^Qa?_x|)88OJ@BxoH~cPXGS>^_$A-@MQq>UafpHW_>#4 zu_#A?U-B+?yvuKy^-H|bp29a*CtT6@CC$;EU$U1t_VTu2{Sud)o_l2a#%n6eqZ|gm z2sw=MQ(Dhrer%D1OPe+6H>% z$>TRYcJOn}(Uuo~XNCW9ZT+V4NuPcdA1zFXKtu;+@rJhw0%qQsdeU~J{ORm`Xx%B2@(Zp zK%!)tEKv$gktj%m5~a~Ji85%0L|HUTqE57vM4f48iMr4(67{3~T8hVBXG7=^7tk;| zOrnu=q(r0WD2YbX(GrcJVEvl&6Q{pog~o|Iz^%xbVf_j2kLAV zqO*_-crK!IWzIu1Pv(3?^JOkTv_R&Ch%S_Q5u%G^E=06Y<`U#ALD8a7>ufD@u0>J6 z>yUGu%ugfd(=u;F&W$pcBWJn%_qHPER=Io|a&D7(J92K9c?WXtka<6H?w9{w6>?U| z+&DGUpMRM_P(VMrR8M zT|ivGg@hK$yqM6%GA|``sm#j>T`qGmp~W(8yfi6{I!r zPU752qJS%jvr^_=#JNl6-NdnRfkL9gFjyXr&BGz_K=Z$cW7pu2cmNHy6~}JHA@RT%>^P1+jzgkB z8*DC#ol8QZ0rK}J@ta9l+;D?^O5#5yVNt;bTTWw_(~zjpAvI-d+COkN^=qtsO#4_- z0UC?-#ijuDi|H3DszYP_ef?8_#>I?_6_um0@xJjXKr>=y#EPoY*i7Hd6rd8+t^~!4 ziqlvrN-9NZz~!i2xm>;lC2f(*_oH_Et(%W+RNfdJu#fpm7*eT>Yg;Id$;h1?i zR#d#k=40P{oB~{eV@hzWxDovGVP7du0p5mVw&7TDV>DKQeHAzbxEjY)<5+Q{GxNxO0qFK(p9wvePPBn|jDX?L8&iyN!4YLZk<(twL; zOfiiWH(FyWsBZ;L5jwUSrfVv83w5R}$JxpB>122nz`BiQE=_{$mo<{o9 zC;?jHR-|v0xeDo3GVdh%PLd$*On#eQ_x{)X7^hQXhR5(h%?|Vo^g+!&c~f#Ix=;<lwjgp{wy@Xo7B=cU> zdaumYD5@Iy#68v6r#R|U?1Sg#CDQsOk|dg6b?+&kPWp33`=HK#j@i}!e75s_^P3-< zrCjbT&)xQJ_8Q`=Kb!9)&6bBIxyzpzOxjC6P^^MJBZQxpQ;yPcoyap!(d0)H%nV}ldK zW2~{!V@FSb&Uz6Vy9iBy?s_jCyBAM@?zxzZEhZDh$JbabxwDo`72Wgnk8i(+79L6e z6;-4W%4BJTGFcj-%EL>UER9emOCyxY(g6SWuflL7CdsQl<(Nl&Jy*A7&MS zg4zTL%2YvuGF6bEOcf+3Qw0fX6Cfy41qjO2uAeehfS^njAo%@I1PE#q94J!-2g=l; zfihKapiC7Us7+wt?NJdJC{qOnUZ0Aq8L`czaX?1l}GM0fDzKML?iT9l9t}1q5mn3@B5FHp*1NfVUq-FyQS+ z5ez6(1%vAgZr;}-W=v)R*Su5P2gP{7HSe}QFOWap?*~foCPZe|I_sC(FDOP9t~0kC z;sqL)IxZ-tTRNMOIwL5?9G%C@p%RoX!bY8UG>K260PseXxKZYE6e^dm--;5q%H`Wo z;x?K0qtJf&`YM!IC6^yWi3epqiBeCZpa@HK9*?Ka!$C2HF_p@;4`VNI2~I7+K`~OB zN@Lrnuorkej$4mA0B^v?1{@E(4X19yK{4j)Jf2Uj#z7GV>pY%M%_BiE2J1YY50#U2 z5sT=&;U?}R0pLoKSSj;y5;{)O#h9)0ct5q62E~-hRHE8GLA?>~l$F)>j@6x7>5U6C zVmVK5T)GmAS$gC0k64A%8&?6vx}e^)@Fdox>{BtlX-Q8k^VuU8y=nPNtVroiD?ws8 z&K@G!V=cXD0ZuHN@d|8QWfUuqqT%t7%3QpJNK7X6E8TpxgqKO&2ulDZ69Yqr{ zcwg<^Cvz2VZ!#AXZ!zg8nvB8wLhlNhR}$|^nZG9fuSuq8A_nhEyrs0GXc7kROS~I^ zYkQaak~f|2X=pr1xn?dJExw4xgOqFXWX?ySeAErf3s9&)=CvqeE$S(rb&Urd8S7-; zj>6kfFDT!E!aHO>gswY;Zi4c|=(@u)*P>7@e?PIx&x3-rI@A^TEE;+ijRCGlJTB-C zd;#&eK;j0(;{u77;Gs+K7;&RCK1imW#$Cm;tMNfHtw!cEc<32C2FlOjq32{ikB6R@ zxsZekNjGsLH9jbY7Ry{gZm1x?6wkiK2Zf=l=ooS1G~Vf7Q$|MvZ=%<10)BnxEeC#A zw<7yWon^&kbr9`ZXPt~r@jyF}ZwJUiIt4F()q~f+XXU_&PPW7ZjvZIl&Bp3 zyftMjM5Zt*+dGCQ>mRG!{p{S{$lzn)fZ6mK(LOs5S=p!R@ec;K(yY{iroX3InG6v! zSE$9)ttrpCCf3Fy*IKy}aJBl$G~47$6D#zQ*T37C9RROaXLVc}X-pe|@}?Yt$m^{x zN|X!L3S*nBMQyT{=wEoG&UwYCJShidy+>C?HZrOxMv{`Jn)4mT!^xOi?F*0dqkVic$Dm3DswRo z7vn4_e+Ijs!5%SKYCOtyS7MLo2{qmmhWFtt;3^!hl6e7fFCZRxfL4(33X%o9l7v^v zTt_<85ua#j8aqoe&yr5S4aD0(Vu8OV-M=P1flFz)lxD#Lw}FN?0E^iMIl=Bq+|Cx-d3agx_@Ka6ARn=D3@h)eguByFi zp2EL>+HO~y)jWmEpT^tO>K{9;x2xShcA9Tj%hf!EpMKhJSL4+@g&!{i*wuYCPvOVQ z0`}DcHBaHEmkI2v5o(^okCzSXs~c*b!oOceu&=JDiuI3|73`}uKex=Ft_J3z#oRop^x>3PV86r~A*{GaR z1A!(6CuWGag(t0LPwWen8_bo;a&vO~LD^gsoQpCrKBcuwZ?ICx&>YZX%jD6J^qCAR;okZw-mW<~pB( z1Xs}v5drCZ3KA@nc@qt80&Y9!gBRZ3m~}&QuBDVuDK9VR%JPD)tUNd8TAB&Rx@{?f zD`d^Nmd&}AQZA;t)S=s!I&|AohpE6e=UO)BTFOJ%_vKpteQa*&o1cF?rlpy*9y1H+ zFxKZIBOi4DUWa_^kRQhWA{Ox`^k`BO2N$aJce&}3B3(lsIRJ!=UV_Uw+P5(vn*xNkzHf`Q%-sjM~&!KsrgS-zx zO+(OaX$a(&RdNZIQTLu{$NEfdjysy;j^?8>VG`I{NCdVP{(vn}3)osn1GW~jfUSimV5@=!i)=bR z(5tyCJW*Xqw>#jN_Vp)s41ZA5SRfqeDS|DHWx2B=$)g&Z7@pWu1WjgIS$Hn$DS{@A z=cemxrhk-lB#L#Xp1bhXe`cr1wAwel9p_1L{$-tu@FyHCqo7m=VQKDGP(by+g`vfNn0Y_sm z68DQFMJ%p}lt^BwY623qJT>ju75Q`lHh40t|11f@IJua%UrZClI4OSf zWMVa>^VrzFqeAR*R^)yQk4i;1yVUK6b&8FkDy?~DYn?#J1M?1w$aB?>>smFXcK}-&yWA)-je^=JKlBp7sE$C_~Ck|&J4d1 z+0mx6f&PJ!J#0FA$p27e2b<0oVgDl7v8HpM7yowHk*2eJ;?IX2XF5Ac0w)O*ZHaFJ zrT!AwVYYTwG<%@@?2G)VG~1RC9mM5)gi<%qcx-In11R<_^2b@;C!;pXNtLDDwesFu zTJW7QIcdE`SHSnXf_S*05j&|E9?UlOz4ldyhZ+*ETCBziQf7#kH5bc4AXwBW_+? zZHntBIq&pO?H}>>(%87TaX!)Oa{H>(@e!vljm?OgA$j!7Or06={nGg4-&Z2Lw3MPy zDfoP8TnzA)%jH{8Xp3CFANlsnh%na1sPe8*)6qiPbWhVe$@LSD=WZafi%@P@hAnKa?LveGbc9i{fkf`$e*!>rjU}Ba?YYY!1c&i4+0zC z8;pDxWNtvd2AP-OoF%xAs5mpDs>5mQ7t#~YX2u!eh%lHlleT(IWKb| zi7zAx;_27`sxKU=dbaol^4m#hZpS=lqXyUB*Qv4}z zwKG`28;Eqx221uPOO)bGk!X~6RHWNB*hKHdj-p#ISgto$qPfUBSKfx4hrD?*FGSvj zG9N<5A;iSZGfHpq;P&b# zCoHMj*R1_DYk$q!U$getto?P+Z7x0L_||L#EZhF7E~@ZybY9{)!{@_}FR zXp(!^i+L1Z2;<)MK&C+(km;@nWE!*qnFeh@ra>E!Y0w5_8ngkK25ms5K^u^1&<120 zv;mpBz=2GIHXzfW4ahWT12T6|0htDEK<2)0Ak&}?$TVmJG7Z{*texJ#mO&e^WzYs} z8MFag25rEWK^w4T&<1Q7v;kW?yMZl(Hek!34cIbh1GaW@16u}dz?MN9uw~E&Z0+0z zwhY>UErT{-%b*R|+Nlj}Wm*GU25rEWK^w4T&<1Q7v;kW?vw zfS+n~j0axd=ok-d8MFag25rDrMia2L^BVY#Mu&J{%b*R|+O-618MFag25rFBPHSMx zpbgkEXalwk+JG&CHehRKHLzvS25fcxz*dG5u$37NY#FoxTLx{wmO&e^wUZjyGH3&~ z4BCJ#gEnBxpbgmCISp(Xv;kWNZNQd68?e>216y4?u;u6uY#FoxTLx{wmO&e^WzYs} z8MFyrWho#2E4;f2nP}^NHe~3IEg252aNk*QFC|*q34fZGO`4c#( z8SDk@c>%`@3C>`Lu;&nthk0ZJ_B7ylF)26Lv!v~_U{J*Ew1{UPIF1|aBhvOGk|-*e z=d)1HJQ^=1=?kBH?8rScPk%^s_8xBYo~#zUPrUDg*2AshXq$&=f_ULoJLeXinD)*` zJQXTAoGhh6bxQ6O2Bjyrf9`dnCQV1JaGsnBwGQd)~ttZqixIp}9FZ4R3-}C{f2;fo(dZsHuH=Y;1RN6KXnF zU{&eXF1OFm+uZj3&!Ud`G?o%hi6k>=Ed93hyP%S?0$Ea(b#ix#gRcQL5bBaBeTC>bo=V&IZay?tJbOE)M15N|?Jq=7lJ{5cPucvnYI)bHr+F z2@Ws8y+otcc%uJp%kf>n>v3Scd?Pks_XZpXH)a>k+=a76g=<_a3GczZfY0FY8SpLV zx-@YYk~q=GO{*~XVwoQ$nU9ieC|^#(%SkWb3evrT^oJY2i*(#2H-z0p-%Wf_UPC(9 zklx}U(fG!JE*D83;8irdiuMw1pXcz=%(XOIa6;{`6W;bZKW?G3&T*Y1Nm)AU64NE3 zdh%riWkO34OmCaq4?8ETb_GA)Nx9i_ zNj@6t+s@0)mP_){P(SR{+-$id9}V@>J3Fge7k+NbB{4y09jhDwX|OiVHW6=UgI(>s z+Ao4AgWcx5%`ZYDgWd1E-!B3m9*raIPp|}Nu;-BWoXl?^?G2faA?Gnz(lgjBtj&_M z#aCgv3KDz_wgo%4V7~}_40aSdk3!JRUr(H~h+hOU{QZgc9QYp_>=@CGk${K+47QXy zmr}n7M5<2gyyxXU@1FGNEH)I&L=>sB{-OR%RDjOLhsHBe0Xmx*n#n{3==^}Ea4E_Z z(;J=frx1f6#$4XUOhktK@8M7>W+D>gN1x$P1!kfGbbjDc=mcgW zcHsuqBs7mOQ33q@Nq7q^gX!!j$vjH3L&HnW|-V{IqohhgFDz_cbRMex*KQg#+jlrG;WPNU@sm7TtqU8NT#R^zT8d* z6q7-~wIruj4qLw>oxUPn#Fys|#57|a%@ki=m{9Y;P@V7Cvy8+S;u9lzH-SeX)izr+ z82%D9==9jw?x-y)oxf1tWb08#weS8%LVc@Olh*zn=}NNJl~;7wbN{60KjQ&$Eir0I zS5XhuxAYq^?r$gRd)tpd{W*@_kx%I0HuB1GrSd5p+`;WKPk63+gft6;&fY-F7sTZaeeB^oslbLp#+oE==os^^i^V%nH6~PC1i;XJIKv zP4R35+aZ{$nWX7G_tPF~sh%NWde>dvp_MAV)`6&;96e9%h zC)6ZXkB#jX`+csjOL*(6`@YJ$oFk9rGkCazxNc*+ram5l8lE>g-99^dv;yJb8_THW4NyL!BRF+4%s(THJS!IID

5SfoM&)J_}S{*C%?~Kd=pw$%y%-CbgeiYc`V_QyfwX3 ze`Qhn$o)tI?YzXjDo|cU8faV+vJI6>=+CmI><439{L*-ZUp#W-#ii?|hN`c}@7%Lr z!8wMP*d0D~2VM5ylCi`>Ka4RAopfuz8a$w!F11YpX%mXagiG??z})EpLtmRz@5x<) z#flAaK^x+Ffp38_s6g3^kbNYcU(=+#UXMJ?{z1&zac*d7>9m>#1?O+vyrlwaDPrEZ zWHc}Nqf4vD%{$bf=HBY&^cp!zYmU+&r{+niJgF;q?Y6LZ;mLca8wA`m+%0Paerp79 zQpF|dmb+)meu{tFcmQ07@R4B)pW1>>0=RUNIgbq4?Q`Ch-nBR4d*PWNe;yD<9}vR# z;*xxC!LYrX!ah%Ilyf`qy}>4da+3fAUtAKh70d3Z4{Q(~1cyZ&Qodemsn z5%m{iYvvT2qkF4p6I6M$yVIEHu~hmP`HT#_#y_w(qq zi{g(C%emE<_v8yj`N+Q!mxL_*t=7;3kAFX`F{Q;}=Opnn9-zG@;ugr@XpD>a{}(svKOB3fKRuq2$Gw zv?B`61w0_}0xBNeZsC$KAYaYyJ|#P)>WG~C7&}QcXe|v|cr`9bg^dP9Ew3i&I8xBV znb7$M`<~o8LGFqXt5{igAi*c+xBw!*I(7XGa(#mwHd|bhxjdmQC2oJ}3lmiRhl2lxF?bojUr$S0|9lVi#t7 zJ*$O%5#vK8`G(PhkC#|J=bS`VDbBvzBK6uLg~7ljAyYRD9a8nzvy%ciIy$$3Eh4`y zBIsgVlFu0TRY%9VO`Rvv;oRwZ)dcxS6|f|6=_GT8TpH?mYgyP+`zf^4oUh#__1cB} z$8bqr`#b-O^TT$IIxXjBWBEK;NF}3?v$!N=!j_sXzjcd@|uOVTN`eSiOL)cNaYJh@9Tw_P8nSRV&!mwaVVzOo-W#2rM3 zI9{J4naWRs&%&mGZ)oNTMf1?sjZ5;eo+C!QP#csAWHtEMl^~QQpwN7{BxHY9zPS3G zwfoLWIraEjW2ch0Q;AeZ&XOa_>^2#TtYbqCw+=mg`K*vz%Fxp;<_Q)v^t7iFxzHQqsb~ z@hV01k(zT7?gq^E)+)qn70}JNB;8k1Ea=lf?LX(*(+&%yhtZyfOHx~}!`_y!M4a;w zO#;Vn+@tl`gZyrANyx@c?6Efc<9X+m+!ieS=ICTO$Q+`TCu(JwL(C|+dHMGjnz3;m z8f+x=&*cf{f`x-{T8WGs$L z@}>0E@pPjv)uQB<;K}~q?PlsvoxkRN*&oQBhwZACtE*AiE?kn@u5O)~5Ti{1vRo|q zOx22~BEbijgsgv72X(r1MT>&-4DZRi_|z_R*vF-Njx;YC)Mx6IRZw3w)>x!#6zRyp z440%n|9A6-2kZ{IAmCobwhIZAB!L2n0hg{F>Sz1)s$TE@d;yN$_`TJ9sv1Q@z@_`W z0UvA`v@~z#1*B$h3UG6@)Eq6S8E{G7+j48fcfsABU4V#Jc#$m1TaU zjp134axN7yVqQ&y0R!?pQ<^W}Jer0iRgj=ulTd#~FwH>|o zP~3TKbt{C8#AoU~63rfD8jVZ0X>|Sm1xF*dbhOI3H}UD>uvBqa3KADCNqv8><4*kS zbKWI6cPCa`6e~2v3J}V1NyrX&PyFeAr1TO5g~dx^w_dYb54?RIUp|lTN-pECdCfC@ z$KXo}&H>EruJWm?$OH$MjO}yHWszT7%~PN}h$)i=R5B6>amk=;ID2*1%tGm90SJW7 z-7!b1&yhmM;F9#;DQ}I>LyP({I1gc8fVDc=S{;l=8&A~6bHyV3wr&6TE&Se>U8`&_ zCESZ_ws6T2fxRPMW@}V-pH1|$%W`fj-hQ@8y|$s_87@iBWOaLQfc|8UHe{gq534)k zxZ_X%@ORr#ZFA99TP#o(BWWL(q_$Oic0Ao5dlPCa`KQ|It}iibDsHy9oJ;oVsJ+O! z#_K8PoZHE4e4Ijb)BenPY@bZW2kGL@u}fMvrNa*4Hlrvhsg=>F?hy zdU7!D)ho!zsnKJ84*#J^<{1$Zk;RM%TKPdh($yVPqt z5@&Hq$PU>nTSnZ0D#ZL&G1|`LE^P?{~wseC|`i`)K*#(rxmX=DAoBBi{fu*5dVjn@`~&Mh$-vh8YbnWEWKDug zj%bu0Ub!Ehd-g10@0y!x2qo-Xk`KkyLos{}E=lLuKG^Z|u;|8{3eG*eA5`$E3M8xG z(!C$p|Cm1i!GNZl0!SU>9J|{BzuN+s3%Dd4sF&f^zVU*OZ=nxy-({!q^l3bZpFTjs z*#y({ukbCg8~537!*s#dFx6U9wHA(3xFl`c@vx}zHLCD7gto-frCs6Ij)I=ylDzVZ z!uO6GOrY=l52jNYJ%6w-ObECm=kDM+FFH5N#hX!P7F?2-ZphaOs{j5D$d2GiRVDSR zlEM`sE(zJCcLu)l@%hVlkim)bgkB^y7fGRQxFlp!z4mp}#QV^;^*FdknSxh_v}(8{ zWZUwxdPKbP^Ig}Bnr;+MM`F(<%I^{qd*1fPqZ+!=;}+MFcUQ?hk9Vphhdc?zYOhm> z>fFXPw=Q=-G^TnB)b~6F>KQ%%4ARoA;QOp#YUzenoc=7cDf*s*vk4!Q8u?Tsa+Jd* znxW5+Nk3)wy;bM++C4Q`JvbfP{>?x1`AJ#%=k!-DO1{4bPAGWHHdDgQ6jX>y*J8__ zJ$8lvy~+1r%f(0FB%v$`$ql$99n-VvzCe61_P#3`*bzB(1etc>l8{xEZ5n*!(Y^1>^oO{r!Uw|*1!<0F^H zO|g+*j5O@HbZglAWLV4mAupYTn}&HxxkgZ~0YY4ob(X*M)YZnw+DCG3J?|29bkFUhjm;x%PlOOj(aE6ZI%IPlAjIL4e8uYV zcl|$|wGt|9#T8!XQ`gbG2rd~F{_A}Y-JTsspU63WtGd@Y zT`o71OH$8ENM6MyA>;h;+2@nCo$SV0KXUyrFFyyTn;2v%A8MwL8v54xcW}u1!NNZM zoWJCDr*gYPkK#X)@zV>q6;AR=(nrDRxLzDwFAgD*yq!RJz1YS8rfU05)%GXHMCdl0 zFqBb8o8Grg??(dDLLF`TfHr*~1K46zZ!!9iL@q$F#TdKA7{>r=jW5<3hme4kKv8QP zQ)_&c1x%%fy-#8{)WBiXFxMJ`&QJ5; zrFnQ0LXw`gI}qZ`v_umOr02Bib6PD44i3P@SjELyFEUX`&RQ-E3(iza>`!5Sw8Yw4 zV*3(OlDZbX24}4$VQZn*N7_D*w68N>b0})Sp{TdNZvFhL3s>H|Go*LH>Ko>x-MRs3 zoxiNk-k{J}_!yimjgSC<4M|ymdWTp~3{Qaqd*LxCc8Zld#XiJq4=5_dRHax!!lXI@x>6j> z0II}Pl~_SCWdcQ&SX(7FGXTirwM(pIyyclm^vt9r$$Q|DM4FdKOGq9#Cx9}*F&-(P zc?GnDWD5fdND@{+dow5+X z4_gnwQln(4(UbUn!tmn+#iWi`pC=|ps}ScRCaxU%CDj{$Z_4JPo$98Nx~Zhe(jZxi z(Hg3BCMYIuyYMwlW?hpxQ2s{4pfT5K%_L8;8V$2EH8EqDcT1_=QV(J-0MFJ)sT!#V zF>(UnnDnJ%($U1@6M$P%+bwAviHr_BWu}5NQ{hYENB{ti`tb^15;X<@@Ssmn_>$Br z0AOZA*be~U(mhMzOCpv40N&O~3SSZ?2mo+!o~`gD5w!qF25&rtFHyPxFh{|eqwpnG zfzZ-Sg@2~PN|H?g1rDK43{ipNuF>PJQ9~#IxM$SeGX^q%6EyDxEn{@h30iT2_GJKP z>6g#aZ!$Wl%wJpPA3!>Yoe#W##GIu^_eW7gjSc(R>o8w z;C!s&d~6_LW{0|@-bXHt=bpY0(BmnDlvUNH&Q9}YyuA|Cz9z;e4piU>P(|MD~(f}OO36JTN z#2o~HIeO_Fy*F`s1z?$8xJ<7kxljSf)(f-sN)lfafVFzzTD_7)Ki?R9kazgUyUy=E zp`=bIgUEN2JlEa0FlS`EWSNP~|9#qDE{J}S^SQ8xCfIr<*j}yQs~`UQq)mg+rfTbz zYI`-QyY7n@|0tMEvS4$ei*Vv=QVFyqRpv;Q#gSODufO6M^!NNed^Jp`xf(E&MHimm_4ELE| z<8vwA{N)q?F4$xjY^wgi(RJOkUIAcwjA?p|rM<*A^wf|(RRG*`i0(NQWWEEiBv!N} z)&-C>$T*NhOaq|U*t6I;kQ}1{SZ^G&-uN1c z^#VYNaZHKvHDW$Xa+xDWjMJAhq^*SpYN1=&BFW4VpT~L3iHeuxFXzGjf>V|=7T`9W zc$-d1!u-Pg!^zDV6cu_&h2DcCeVbe``_l56AM(*UU!$VdsNf0}|B?LXsI55VIiszK z1}f3r*59|C_?G*1nX{73p44VfEvY2&)3vXiI(gRlOJAz555ZeYmVMhT!Y)9st@EMk ze3axDl1v>%LdW^j86#3JR@RGY#!;zW99b_O$N)Md#tup3rRRx9(GbaW#jTcXFa8 zncR`Eh?BPyqg$AXCHCkNdk*dX3Y<;-BuvpxGh5o~NQ0IYBKiVQXEoMYX$ElEYCOyWj#`yRt)2{uQ&!JY zRxbu{#ya?n^+g6y9$_etFpZw`@Y(RT(>Co&?}ll=@bbF9TQ}tzRB(oL84s)$vhaiuc`Q)A95xLUgQM=1?zl zXg_|Qh3S<6Q zl(3O0EQ-{y9;qyfd10~h!g?_tNe_EDJ!}jExE2|9Ei&SQV*k%WW=5IdEsr9@9J8^r()M-4n2^*TAe0mad%{zs!;B|!Cs z?_a+132I}450&8KswA{A=}25m4~ZB2GTTJWHieL9pppf&aseI1 z0G86qr7WP5R#virT3T95GgU3c7OL37thCf3EwwNyDlAk5i(-p~+QI@lEYc3vBWr@F zH9^cuZ#t-(4knNhOJ&3|f$g!%?Xk>nX^EA##4_74EzWCNoP+VTsc~MZEFe8jnjXh| zBs-4Ej$^)MO&qnx4V<4fIiv54Hzhpi+>D)&UXV#sJP& zgU|fooCtNAF?E`^Ns8+5%8k>1|7EQN?O&@zl2sxV*@NIUMIvdD$cvmwlblKoR zqBlH#*)QgufVEOI@z%*T>*QvVWSN}L(JxhEk1DYrIZHR?tUWSgLz5I)itd(acguQ_ z_W|$w5A_&Z8wM=zjzxOM5=L~3uy1x*L|v9(MjdQz7{~sr>Uzr~XA|S)RJ@!fVYC{* zO>5R3jgxhQO702_cLibOc2jf2C#fvudl_0An|RbFp6loUJ=3^519F40+c~av;BDFWg+|IeUwOEEM zfC~9Og?uApNBe)UgSYGX?Rpuh!`!palKuN0$cls0JTTGQ%XD<@eh&yPUtYtEqOiOQ||8 z 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�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 z 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�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