From 2920a996dc8f93f8826c070bfa562c17743429e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sun, 23 Jun 2024 17:20:05 +0800 Subject: [PATCH 01/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97=E4=B8=8E=E6=A0=BC=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" | 4 ++-- "md/03\345\205\261\344\272\253\346\225\260\346\215\256.md" | 2 +- "md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git "a/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" "b/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" index abcae16f..a778795f 100644 --- "a/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" +++ "b/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" @@ -91,7 +91,7 @@ auto sum(ForwardIt first, ForwardIt last){ std::size_t remainder = distance % num_threads; // 存储每个线程的结果 - std::vectorresults(num_threads); + std::vector results { num_threads }; // 存储关联线程的线程对象 std::vector threads; @@ -120,7 +120,7 @@ auto sum(ForwardIt first, ForwardIt last){ } ``` -> [运行](https://godbolt.org/z/8oq3MnvT5)测试。 +> [运行](https://godbolt.org/z/MdrP98o13)测试。 我们写了这样一个求和函数 `sum`,接受两个迭代器计算它们范围中对象的和。 diff --git "a/md/03\345\205\261\344\272\253\346\225\260\346\215\256.md" "b/md/03\345\205\261\344\272\253\346\225\260\346\215\256.md" index a2b6cc60..f1633a48 100644 --- "a/md/03\345\205\261\344\272\253\346\225\260\346\215\256.md" +++ "b/md/03\345\205\261\344\272\253\346\225\260\346\215\256.md" @@ -371,7 +371,7 @@ std::size_t n{}; void f(){ std::lock_guard lc1{ m1 }; - std::lock_guard lc2{ m2 };; + std::lock_guard lc2{ m2 }; ++n; } void f2() { diff --git "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" index 8c5d14c1..4914b1ce 100644 --- "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" +++ "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" @@ -12,7 +12,7 @@ - Qt 实现异步任务的示例 -- 其它 C++20 同步设施:信号两、闩与屏障 +- 其它 C++20 同步设施:信号量、闩与屏障 本章将讨论如何使用条件变量等待事件,介绍 future 等标准库设施用作同步操作,使用Qt+CMake 构建一个项目展示多线程的必要性,介绍 C++20 引入的新的同步设施。 From 8db42b3a62c8a0aa5db012652ab12f90912d7d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Mon, 24 Jun 2024 21:20:49 +0800 Subject: [PATCH 02/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=AC=AC=E5=9B=9B?= =?UTF-8?q?=E7=AB=A0=E6=9D=A1=E4=BB=B6=E5=8F=98=E9=87=8F=E7=9A=84=20`wait`?= =?UTF-8?q?=20=E6=88=90=E5=91=98=E5=87=BD=E6=95=B0=E4=B8=8E=20`latch`=20?= =?UTF-8?q?=E7=9A=84=E9=83=A8=E5=88=86=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\346\255\245\346\223\215\344\275\234.md" | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" index 4914b1ce..1bcd6ece 100644 --- "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" +++ "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" @@ -125,10 +125,25 @@ while (!pred()) wait(lock); ``` -这可以避免“[虚假唤醒(spurious wakeup)](https://en.wikipedia.org/wiki/Spurious_wakeup)”。 +第二个版本只是对第一个版本的**包装**,等待并判断谓词,会调用第一个版本的重载。这可以避免“[虚假唤醒(spurious wakeup)](https://en.wikipedia.org/wiki/Spurious_wakeup)”。 > 条件变量虚假唤醒是指在使用条件变量进行线程同步时,有时候线程可能会在没有收到通知的情况下被唤醒。问题取决于程序和系统的具体实现。解决方法很简单,在循环中等待并判断条件可一并解决。使用 C++ 标准库则没有这个烦恼了。 +我们也可以简单看一下 MSVC STL 的[源码实现](https://github.com/microsoft/STL/blob/22a8826/stl/inc/mutex#L555-L565): + +```cpp +void wait(unique_lock& _Lck) noexcept { + _Cnd_wait(_Mycnd(), _Lck.mutex()->_Mymtx()); +} + +template +void wait(unique_lock& _Lck, _Predicate _Pred) { + while (!_Pred()) { + wait(_Lck); + } +} +``` + ## 线程安全的队列 在本节中,我们介绍了一个更为复杂的示例,以巩固我们对条件变量的学习。为了实现一个线程安全的队列,我们需要考虑以下两个关键点: @@ -1328,7 +1343,7 @@ int main() { ### `std::latch` -“闩”,这个字其实个人觉得是不常见,“**门闩**” 是指门背后用来关门的棍子。好了好了,不用在意,在 C++ 中就是先前说的:*单次使用的线程屏障*。 +“*闩*” ,中文语境一般说“*门闩*” 是指门背后用来关门的棍子。不过不用在意,在 C++ 中的意思就是先前说的:***单次使用的线程屏障***。 `latch` 类维护着一个 [`std::ptrdiff_t`](https://zh.cppreference.com/w/cpp/types/ptrdiff_t) 类型的计数[^6],且只能**减少**计数,**无法增加计数**。在创建对象的时候初始化计数器的值。线程可以阻塞,直到 latch 对象的计数减少到零。由于无法增加计数,这使得 `latch` 成为一种**单次使用的屏障**。 From bd41c9608e6b7d29ca440dceb5e48fd9e5c50fbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Thu, 27 Jun 2024 13:01:00 +0800 Subject: [PATCH 03/62] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20`std::thread`=20?= =?UTF-8?q?=E6=BA=90=E7=A0=81=E8=A7=A3=E6=9E=90=E7=9A=84=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\347\224\250\347\272\277\347\250\213.md" | 2 +- ...20\347\240\201\350\247\243\346\236\220.md" | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git "a/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" "b/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" index a778795f..b0c38841 100644 --- "a/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" +++ "b/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" @@ -757,7 +757,7 @@ int main(){ 了解其实现,才能更好的使用它,同时也能解释其使用与学习中的各种问题。如: -- 为什么默认按值复制? +- 如何做到的默认按值复制? - 为什么需要 `std::ref` ? - 如何支持只能移动的对象? - 如何做到接受任意[可调用](https://zh.cppreference.com/w/cpp/named_req/Callable)对象? diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/01thread\347\232\204\346\236\204\351\200\240\344\270\216\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/01thread\347\232\204\346\236\204\351\200\240\344\270\216\346\272\220\347\240\201\350\247\243\346\236\220.md" index 89785d3a..7a56a2fa 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/01thread\347\232\204\346\236\204\351\200\240\344\270\216\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/01thread\347\232\204\346\236\204\351\200\240\344\270\216\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -202,3 +202,40 @@ void _Start(_Fn&& _Fx, _Args&&... _Ax) { 我们这里的源码解析涉及到的 C++ 技术很多,我们也没办法每一个都单独讲,那会显得文章很冗长,而且也不是重点。 相信你也感受到了,**不会模板,你阅读标准库源码,是无稽之谈**,市面上很多教程教学,教导一些实现容器,过度简化了,真要去出错了去看标准库的代码,那是不现实的。不需要模板的水平有多高,也不需要会什么元编程,但是基本的需求得能做到,得会,这里推荐一下:[**现代C++模板教程**](https://github.com/Mq-b/Modern-Cpp-templates-tutorial)。 + +--- + +学习完了也不要忘记了回答最初的问题: + +1. **如何做到的默认按值复制?** + + `_Start` 的第一行代码展示了这一点。我们将传入的所有参数包装成一个元组类型,这些类型先经过 `decay_t` 处理,去除了引用与 cv 限定,自然就实现了默认复制。 + + ```cpp + using _Tuple = tuple, decay_t<_Args>...>; + ``` + +2. **为什么需要 `std::ref` ?** + + 实现中将类型先经过 `decay` 处理,如果要传递引用,则必须用类包装一下才行,使用 `std::ref` 函数就会返回一个包装对象。 + +3. **如何支持只能移动的对象?** + + 参数通过完美转发,最终调用时使用 `std::move`,这在线程实际执行的函数 `_Invoke` 中体现出来: + + ```cpp + _STD invoke(_STD move(_STD get<_Indices>(_Tup))...); + ``` + +4. 如何做到接受任意[可调用](https://zh.cppreference.com/w/cpp/named_req/Callable)对象? + + 源码的实现很简单,主要是通过两层包装,最终将 `void*` 指针转换到原类型,然后使用 `std::invoke` 进行调用。 + +5. **如何创建的线程?** + + MSVC STL 调用 Win32 API `_beginthreadex` 创建线程;libstdc++ 调用 `__gthread_create` 函数创建线程,在 Windows 上实际上就是调用 `CreateThread`。 + `_beginthreadex` 和 `CreateThread` 都是微软提供的用于创建线程的 C 风格接口,它们的主要区别在于前者依赖于 C 运行时库,而后者更适合纯 Windows API 的情况。使用 `_beginthreadex` 可以确保正确初始化和清理 C 运行时库资源,而 `CreateThread` 则适用于不依赖于 C 运行时库的环境。 + +6. **传递参数一节中的:“*`std::thread` 内部会将保有的参数副本转换为右值表达式进行传递*”到底是如何做到的?** + + 这就是第三个问题,差不多,无非是最后调用 `std::invoke` 函数之前,先 `std::move` 了。 From 2fae07284f0da08e5ea74c815112dfe036403780 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Fri, 28 Jun 2024 21:22:29 +0800 Subject: [PATCH 04/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=83=A8=E5=88=86=20as?= =?UTF-8?q?ync=20=E7=9A=84=E6=BA=90=E7=A0=81=E8=A7=A3=E6=9E=90=20#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\347\240\201\350\247\243\346\236\220.md" | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" index 82dcb6dd..f9705922 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -1,2 +1,106 @@ # `st::async` 与 `std::future` 源码解析 +## 前言 + +和之前一样的,我们以 MSVC STL 的实现进行讲解。 + +`std::future`,即未来体,是用来管理一个共享状态的类模板,用于等待关联任务的完成并获取其返回值。它自身不包含状态,需要通过如 `std::async` 之类的函数进行初始化。`std::async` 函数模板返回一个已经初始化且具有共享状态的 `std::future` 对象。因此,所有操作的开始应从 `std::async` 开始讲述。 + +> MSVC STL 很早之前就不支持 C++11 了,它的实现完全基于 **C++14**,出于某些原因 **C++17** 的一些库(如 [`invoke`](https://zh.cppreference.com/w/cpp/utility/functional/invoke), _v 变量模板)被向后移植到了 **C++14** 模式,所以即使是 C++11 标准库设施,实现中可能也是使用到了 C++14、17 的东西。 +> +> 注意,不用感到奇怪。 + +## 正式 + +```cpp +_EXPORT_STD template +_NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> async( + launch _Policy, _Fty&& _Fnarg, _ArgTypes&&... _Args) { + // manages a callable object launched with supplied policy + using _Ret = _Invoke_result_t, decay_t<_ArgTypes>...>; + using _Ptype = typename _P_arg_type<_Ret>::type; + _Promise<_Ptype> _Pr( + _Get_associated_state<_Ret>(_Policy, _Fake_no_copy_callable_adapter<_Fty, _ArgTypes...>( + _STD forward<_Fty>(_Fnarg), _STD forward<_ArgTypes>(_Args)...))); + + return future<_Ret>(_From_raw_state_tag{}, _Pr._Get_state_for_future()); +} + +_EXPORT_STD template +_NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> async( + _Fty&& _Fnarg, _ArgTypes&&... _Args) { + // manages a callable object launched with default policy + return _STD async(launch::async | launch::deferred, _STD forward<_Fty>(_Fnarg), _STD forward<_ArgTypes>(_Args)...); +} +``` + +这段代码最直观的信息是,函数模板 `std::async` 有两个重载,其中第二个重载只是给了一个执行策略并将参数全部转发,调用第一个重载。也就是不指明执行策略的时候就会匹配到第二个重载版本。因此我们也只需要关注第二个版本了。 + +1. **模板参数和函数体外部信息**: + + - `_Fty` 表示可调用对象的类型。 + - `_ArgTypes` 是一个类型形参包,表示调用该可调用对象所需的参数类型。 + - `_NODISCARD_ASYNC` 是一个宏,表示属性 `[[nodiscard]]`,用于标记此函数的返回值不应被忽略。 + +2. 函数返回类型: + + ```cpp + future<_Invoke_result_t, decay_t<_ArgTypes>...>> + ``` + + 虽然看起来复杂,但实际上是通过 `_Invoke_result_t` 获取可调用对象的返回类型。与标准库中的 [`std::invoke_result_t`](https://zh.cppreference.com/w/cpp/types/result_of) 基本相同。 + + 可以举一个使用 `std::invoke_result_t` 的例子: + + ```cpp + template + std::future,std::decay_t...>> + test_fun(Fty&& f,ArgTypes&&... args){ + return std::async(std::launch::async, std::forward(f), std::forward(args)...); + } + + auto result = test_fun([](int) {return 1; }, 1); // std::future + ``` + + 值得注意的是,所有类型在传递前都进行了 [`decay`](https://zh.cppreference.com/w/cpp/types/decay) 处理,也就是说不存在引用类型,是默认按值传递与 `std::thread` 的行为一致。 + +3. 函数形参: + + ```cpp + async(launch _Policy, _Fty&& _Fnarg, _ArgTypes&&... _Args) + ``` + + `launch _Policy`: 表示任务的执行策略,可以是 `launch::async`(表示异步执行)或 `launch::deferred`(表示延迟执行),或者两者的组合。 + + `_Fty&& _Fnarg`: 可调用对象,通过完美转发机制将其转发给实际的异步任务。 + + `_ArgTypes&&... _Args`: 调用该可调用对象时所需的参数,同样通过完美转发机制进行转发。 + +4. `using _Ret = _Invoke_result_t, decay_t<_ArgTypes>...>;` + + `using _Ptype = typename _P_arg_type<_Ret>::type;` + + - 定义 `_Ret` 类型别名,它是使用 `_ArgTypes` 类型参数调用 `_Fty` 类型的可调用对象后得到的结果类型。也就是我们传入的可调用对象的返回类型;同样使用了 `_Invoke_result_t` 与 `decay_t`。 + + - 其实 `_Ptype` 的定义确实在大多数情况下和 `_Ret` 是相同的,类模板 _P_arg_type 只是为了处理引用类型以及 void 的情况,参见 `_P_arg_type` 的实现: + + ```cpp + template + struct _P_arg_type { // type for functions returning T + using type = _Fret; + }; + + template + struct _P_arg_type<_Fret&> { // type for functions returning reference to T + using type = _Fret*; + }; + + template <> + struct _P_arg_type { // type for functions returning void + using type = int; + }; + ``` + + `_Ptype`:处理异步任务返回值的方式类型,它在语义上强调了异步任务返回值的处理方式,具有不同的实现逻辑和使用场景。在当前我们难以直接展示它的作用,将在后文详细探讨 `_Promise` 类型的内部实现,展示此别名的意义。 + +5. From 566e3b292bb43c7fba07d70042839a013bf5a4f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sat, 29 Jun 2024 21:40:02 +0800 Subject: [PATCH 05/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20async=20=E6=BA=90?= =?UTF-8?q?=E7=A0=81=E8=A7=A3=E6=9E=90=E9=83=A8=E5=88=86=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\347\240\201\350\247\243\346\236\220.md" | 78 ++++++++++++++++++- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" index f9705922..604fd7fb 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -38,6 +38,8 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> 1. **模板参数和函数体外部信息**: + - `_EXPOPT_STD` 是一个宏,当 `_BUILD_STD_MODULE` 宏定义且启用了 C++20 时,会被定义为 `export`,以便导出模块;否则它为空。 + - `_Fty` 表示可调用对象的类型。 - `_ArgTypes` 是一个类型形参包,表示调用该可调用对象所需的参数类型。 - `_NODISCARD_ASYNC` 是一个宏,表示属性 `[[nodiscard]]`,用于标记此函数的返回值不应被忽略。 @@ -80,7 +82,7 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> `using _Ptype = typename _P_arg_type<_Ret>::type;` - - 定义 `_Ret` 类型别名,它是使用 `_ArgTypes` 类型参数调用 `_Fty` 类型的可调用对象后得到的结果类型。也就是我们传入的可调用对象的返回类型;同样使用了 `_Invoke_result_t` 与 `decay_t`。 + - 定义 `_Ret` 类型别名,它是使用 `_ArgTypes` 类型参数调用 `_Fty` 类型的可调用对象后得到的结果类型。也就是我们传入的可调用对象的返回类型;同样使用了 `_Invoke_result_t`(等价于 [`std::invoke_result_t`](https://zh.cppreference.com/w/cpp/types/result_of) ) 与 `decay_t`。 - 其实 `_Ptype` 的定义确实在大多数情况下和 `_Ret` 是相同的,类模板 _P_arg_type 只是为了处理引用类型以及 void 的情况,参见 `_P_arg_type` 的实现: @@ -101,6 +103,76 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> }; ``` - `_Ptype`:处理异步任务返回值的方式类型,它在语义上强调了异步任务返回值的处理方式,具有不同的实现逻辑和使用场景。在当前我们难以直接展示它的作用,将在后文详细探讨 `_Promise` 类型的内部实现,展示此别名的意义。 + `_Ptype`:处理异步任务返回值的方式类型,它在语义上强调了异步任务返回值的处理方式,具有不同的实现逻辑和使用场景。在当前我们难以直接展示它的作用,不过可以推测,这个“`P`” 表示的是后文将使用的 `_Promise` 类模板。也就是说,定义 `_Ptype` 是为了配合 `_Promise` 的使用。我们将会在后文详细探讨 `_Promise` 类型的内部实现,并进一步解释 `_Ptype` 的具体作用。 + +5. `_Promise<_Ptype> _Pr` + + `_Promise` 类型本身不重要,很简单,关键还在于其存储的数据成员。 + + ```cpp + template + class _Promise { + public: + _Promise(_Associated_state<_Ty>* _State_ptr) noexcept : _State(_State_ptr, false), _Future_retrieved(false) {} + + _Promise(_Promise&&) = default; + + _Promise& operator=(_Promise&&) = default; + + void _Swap(_Promise& _Other) noexcept { + _State._Swap(_Other._State); + _STD swap(_Future_retrieved, _Other._Future_retrieved); + } + + const _State_manager<_Ty>& _Get_state() const noexcept { + return _State; + } + _State_manager<_Ty>& _Get_state() noexcept { + return _State; + } + + _State_manager<_Ty>& _Get_state_for_set() { + if (!_State.valid()) { + _Throw_future_error2(future_errc::no_state); + } + + return _State; + } + + _State_manager<_Ty>& _Get_state_for_future() { + if (!_State.valid()) { + _Throw_future_error2(future_errc::no_state); + } + + if (_Future_retrieved) { + _Throw_future_error2(future_errc::future_already_retrieved); + } + + _Future_retrieved = true; + return _State; + } + + bool _Is_valid() const noexcept { + return _State.valid(); + } + + bool _Is_ready() const noexcept { + return _State._Is_ready(); + } + + _Promise(const _Promise&) = delete; + _Promise& operator=(const _Promise&) = delete; + + private: + _State_manager<_Ty> _State; + bool _Future_retrieved; + }; + ``` + + `_Promise` 类是对 `_State_manager` 类型的**包装**,并增加了一个表示状态的成员 `_Future_retrieved`。 -5. + 状态成员用于跟踪 `_Promise` 是否已经调用过 `_Get_state_for_future()` 成员函数;它默认为 `false`,在**第一次**调用 `_Get_state_for_future()` 成员函数时被置为 `true`,如果二次调用,就会抛出 [`future_errc::future_already_retrieved`](https://zh.cppreference.com/w/cpp/thread/future_errc) 异常。 + + > 这类似于 `std::promise` 调用 [`get_future()`](https://zh.cppreference.com/w/cpp/thread/promise/get_future) 成员函数。[测试](https://godbolt.org/z/8anc9b3PT)。 + + `_Promise` 的构造函数 \ No newline at end of file From 1a1e8ebb7f5300e11e627cc66bf027a056cab06d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sun, 30 Jun 2024 15:43:14 +0800 Subject: [PATCH 06/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20async=20=E4=B8=8E=20?= =?UTF-8?q?future=20=E6=BA=90=E7=A0=81=E8=A7=A3=E6=9E=90=E7=9A=84=E5=86=85?= =?UTF-8?q?=E5=AE=B9=20#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\347\240\201\350\247\243\346\236\220.md" | 105 +++++++++++++++++- 1 file changed, 100 insertions(+), 5 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" index 604fd7fb..d649f7fd 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -4,13 +4,17 @@ 和之前一样的,我们以 MSVC STL 的实现进行讲解。 -`std::future`,即未来体,是用来管理一个共享状态的类模板,用于等待关联任务的完成并获取其返回值。它自身不包含状态,需要通过如 `std::async` 之类的函数进行初始化。`std::async` 函数模板返回一个已经初始化且具有共享状态的 `std::future` 对象。因此,所有操作的开始应从 `std::async` 开始讲述。 +`std::future`,即未来体,是用来管理一个共享状态的类模板,用于等待关联任务的完成并获取其返回值。它自身不包含状态,需要通过如 `std::async` 之类的函数进行初始化。`std::async` 函数模板返回一个已经初始化且具有共享状态的 `std::future` 对象。 + +因此,所有操作的开始应从 `std::async` 开始讲述。 + +需要注意的是,它们的实现彼此之间会共用不少设施,在讲述 `std::async` 源码的时候,对于 `std::future` 的内容同样重要。 > MSVC STL 很早之前就不支持 C++11 了,它的实现完全基于 **C++14**,出于某些原因 **C++17** 的一些库(如 [`invoke`](https://zh.cppreference.com/w/cpp/utility/functional/invoke), _v 变量模板)被向后移植到了 **C++14** 模式,所以即使是 C++11 标准库设施,实现中可能也是使用到了 C++14、17 的东西。 > > 注意,不用感到奇怪。 -## 正式 +## `std::async` ```cpp _EXPORT_STD template @@ -107,7 +111,7 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> 5. `_Promise<_Ptype> _Pr` - `_Promise` 类型本身不重要,很简单,关键还在于其存储的数据成员。 + [`_Promise`](https://github.com/microsoft/STL/blob/f54203f/stl/inc/future#L999-L1055) 类型本身不重要,很简单,关键还在于其存储的数据成员。 ```cpp template @@ -169,10 +173,101 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> }; ``` - `_Promise` 类是对 `_State_manager` 类型的**包装**,并增加了一个表示状态的成员 `_Future_retrieved`。 + `_Promise` 类模板是对 **[`_State_manager`](https://github.com/microsoft/STL/blob/f54203f/stl/inc/future#L688-L825) 类模板的包装**,并增加了一个表示状态的成员 `_Future_retrieved`。 状态成员用于跟踪 `_Promise` 是否已经调用过 `_Get_state_for_future()` 成员函数;它默认为 `false`,在**第一次**调用 `_Get_state_for_future()` 成员函数时被置为 `true`,如果二次调用,就会抛出 [`future_errc::future_already_retrieved`](https://zh.cppreference.com/w/cpp/thread/future_errc) 异常。 > 这类似于 `std::promise` 调用 [`get_future()`](https://zh.cppreference.com/w/cpp/thread/promise/get_future) 成员函数。[测试](https://godbolt.org/z/8anc9b3PT)。 + + `_Promise` 的构造函数接受的却不是 `_State_manager` 类型的对象,而是 `_Associated_state` 类型的指针,用来初始化数据成员 `_State`。 + + ```cpp + _State(_State_ptr, false) + ``` + + 这是因为实际上 `_State_manager` 类型的[实现](https://github.com/microsoft/STL/blob/f54203f/stl/inc/future#L822-L824)就是保有了 [`Associated_state`](https://github.com/microsoft/STL/blob/f54203f/stl/inc/future#L198-L445) 指针,以及一个状态成员: + + ```cpp + private: + _Associated_state<_Ty>* _Assoc_state = nullptr; + bool _Get_only_once = false; + ``` + + 也可以简单理解 `_State_manager` 又是对 `Associated_state` 的包装,其中的大部分接口实际上是调用 `_Assoc_state` 的成员函数,如: + + ```cpp + void wait() const { // wait for signal + if (!valid()) { + _Throw_future_error2(future_errc::no_state); + } + + _Assoc_state->_Wait(); + } + ``` + + - **一切的重点,最终在 `Associated_state` 上**。 + + 然而它也是最为复杂的,我们在讲 `std::thread`-构造源码解析 中提到过一句话: + + > - **了解一个庞大的类,最简单的方式就是先看它的数据成员有什么**。 + + ```cpp + public: + conditional_t, _Ty, _Result_holder<_Ty>> _Result; + exception_ptr _Exception; + mutex _Mtx; + condition_variable _Cond; + bool _Retrieved; + int _Ready; + bool _Ready_at_thread_exit; // TRANSITION, ABI + bool _Has_stored_result; + bool _Running; + ``` + + 这是 `Associated_state` 的数据成员,其中有许多的 `bool` 类型的状态成员,同时最为明显重要的三个设施是:**异常指针**、**互斥量**、**条件变量**。 + + 根据这些数据成员我们就能很轻松的猜测出 `Associated_state` 模板类的作用和工作方式。 + + - **异常指针**:用于存储异步任务中可能发生的异常,以便在调用 `future::get` 时能够重新抛出异常。 + - **互斥量和条件变量**:用于在异步任务和等待任务之间进行同步。当异步任务完成时,条件变量会通知等待的任务。 + + `_Associated_state` 模板类负责管理异步任务的状态,包括结果的存储、异常的处理以及任务完成的通知。它是实现 `std::future` 和 `std::promise` 的核心组件之一,通过 `_State_manager` 和 `_Promise` 类模板对其进行封装和管理,提供更高级别的接口和功能。 + + ```plaintext + +---------------------+ + | _Promise<_Ty> | + |---------------------| + | - _State | -----> +---------------------+ + | - _Future_retrieved | | _State_manager<_Ty> | + +---------------------+ |----------------------| + | - _Assoc_state | -----> +-------------------------+ + | - _Get_only_once | | _Associated_state<_Ty> | + +----------------------+ +-------------------------+ - `_Promise` 的构造函数 \ No newline at end of file + ``` + + 上图是 `_Promise`、_`State_manager`、`_Associated_state` 之间的**包含关系示意图**,理解这个关系对我们后面**非常重要**。 + + 到此就可以了,我们不需要在此处就详细介绍这三个类,但是你需要大概的看一下,这非常重要。 + +6. 初始化 `_Promie` 对象: + + `_Get_associated_state<_Ret>(_Policy, _Fake_no_copy_callable_adapter<_Fty, _ArgTypes...>(_STD forward<_Fty>(_Fnarg), _STD forward<_ArgTypes>(_Args)...))` + + 很明显,这是一个函数调用,将我们 `std::async` 的参数全部转发给它,它是重要而直观的,代码如下: + + ```cpp + template + _Associated_state::type>* _Get_associated_state(launch _Psync, _Fty&& _Fnarg) { + // construct associated asynchronous state object for the launch type + switch (_Psync) { // select launch type + case launch::deferred: + return new _Deferred_async_state<_Ret>(_STD forward<_Fty>(_Fnarg)); + case launch::async: // TRANSITION, fixed in vMajorNext, should create a new thread here + default: + return new _Task_async_state<_Ret>(_STD forward<_Fty>(_Fnarg)); + } + } + ``` + + 在 MSVC STL 的实现中,`launch::async | launch::deferred` 与 `launch::async` 执行策略**毫无区别**。这段代码的 `switch` 语句有两个 `case` 和一个 `default`,如你所见,`case launch::async` 是为空的,除了 `launch::deferred` 最终都会进入 `default`,即都执行 `launch::async` 策略。 From fd2710d667daf185faa7642d511c46558dfffb2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sun, 30 Jun 2024 20:16:01 +0800 Subject: [PATCH 07/62] =?UTF-8?q?1.=20=E5=88=A0=E9=99=A4=20async=20?= =?UTF-8?q?=E6=BA=90=E7=A0=81=E8=A7=A3=E6=9E=90=E4=B8=AD=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=A9=BA=E8=A1=8C=20#12=202.=20=E4=B8=BA=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E7=AB=A0=E5=9F=BA=E6=9C=AC=E6=A6=82=E5=BF=B5=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E8=A1=8C=E6=96=B0=E5=A2=9E=20mermaid=20=E7=A4=BA=E6=84=8F?= =?UTF-8?q?=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\346\234\254\346\246\202\345\277\265.md" | 38 +++++++++++++++++++ ...20\347\240\201\350\247\243\346\236\220.md" | 1 - 2 files changed, 38 insertions(+), 1 deletion(-) diff --git "a/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" index 1773eb2d..8784b59e 100644 --- "a/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -24,6 +24,44 @@   在现在,我们日常使用的机器,基本上是二者都有。我们现在的 CPU 基本都是多核,而操作系统调度基本也一样有任务切换,因为要执行的任务非常之多,CPU 是很快的,但是核心却没有那么多,不可能每一个任务都单独给一个核心。大家可以打开自己电脑的任务管理器看一眼,进程至少上百个,线程更是上千。这基本不可能每一个任务分配一个核心,都并行,而且也没必要。正是任务切换使得这些后台任务可以运行,这样系统使用者就可以同时运行文字处理器、编译器、编辑器和 Web 浏览器。 +```mermaid +graph TD; + subgraph "多核机器的真正并行" + MultiCore[多核机器的真正并行] + CPU1[CPU1] + CPU2[CPU2] + CPU3[CPU3] + + MultiCore --> CPU1 + MultiCore --> CPU2 + MultiCore --> CPU3 + + CPU1 --> Task1[任务1] + CPU2 --> Task2[任务2] + CPU3 --> Task3[任务3] + end + + style MultiCore, CPU1, CPU2, CPU3, Task1, Task2, Task3 fill:#fff,stroke:#333,stroke-width:2px; + +``` + +```mermaid +graph TD; + subgraph "单核机器的任务切换" + SingleCore[单核机器的任务切换] + SingleCore --> OS[操作系统调度] + OS --> TaskSwitching[任务切换] + TaskSwitching --> Task1[任务1执行片段] + TaskSwitching --> Task2[任务2执行片段] + TaskSwitching --> Task3[任务3执行片段] + end + + style SingleCore, OS, TaskSwitching, Task1, Task2, Task3 fill:#fff,stroke:#333,stroke-width:2px; + +``` + + + ## 并发与并行 事实上,对于这两个术语,并没有非常公认的说法。 diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" index d649f7fd..3a1eb5c3 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -243,7 +243,6 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> | - _Assoc_state | -----> +-------------------------+ | - _Get_only_once | | _Associated_state<_Ty> | +----------------------+ +-------------------------+ - ``` 上图是 `_Promise`、_`State_manager`、`_Associated_state` 之间的**包含关系示意图**,理解这个关系对我们后面**非常重要**。 From 51f97901bf8db72ae70ec324102720e14b4b42bc Mon Sep 17 00:00:00 2001 From: suzukaze <1027743497@qq.com> Date: Sun, 30 Jun 2024 21:42:17 +0800 Subject: [PATCH 08/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20page=20=E5=8C=85?= =?UTF-8?q?=E7=89=88=E6=9C=AC,=E6=B7=BB=E5=8A=A0=20mdEnhance=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE,=E4=BF=AE=E6=94=B9=E7=AC=AC=201=20=E7=AB=A0=20mermaid?= =?UTF-8?q?=20=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vuepress/config.js | 26 +- ...72\346\234\254\346\246\202\345\277\265.md" | 6 +- package-lock.json | 4297 +++++++++++------ package.json | 19 +- 4 files changed, 2971 insertions(+), 1377 deletions(-) diff --git a/.vuepress/config.js b/.vuepress/config.js index 4efb8f0e..d5c2ea5d 100644 --- a/.vuepress/config.js +++ b/.vuepress/config.js @@ -41,8 +41,32 @@ export default defineUserConfig({ pageInfo: ['ReadingTime'], plugins: { mdEnhance: { + gfm: true, + hint: true, + vPre: true, + alert: true, + tabs: true, + codetabs: true, + align: true, + attrs: true, + sup: true, + sub: true, footnote: true, - imgLazyload: true + mark: true, + figure: true, + imgLazyload: true, + imgMark: true, + imgSize: true, + obsidianImgSize: true, + tasklist: true, + include: true, + katex: true, + component: true, + chart: true, + echarts: true, + flowchart: true, + mermaid: true, + plantuml: true, }, searchPro: true } diff --git "a/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" index 8784b59e..0146aadc 100644 --- "a/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -27,7 +27,7 @@ ```mermaid graph TD; subgraph "多核机器的真正并行" - MultiCore[多核机器的真正并行] + MultiCore[多核机器] CPU1[CPU1] CPU2[CPU2] CPU3[CPU3] @@ -48,7 +48,7 @@ graph TD; ```mermaid graph TD; subgraph "单核机器的任务切换" - SingleCore[单核机器的任务切换] + SingleCore[单核机器] SingleCore --> OS[操作系统调度] OS --> TaskSwitching[任务切换] TaskSwitching --> Task1[任务1执行片段] @@ -60,8 +60,6 @@ graph TD; ``` - - ## 并发与并行 事实上,对于这两个术语,并没有非常公认的说法。 diff --git a/package-lock.json b/package-lock.json index 0285aea6..77a76001 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,19 +4,27 @@ "requires": true, "packages": { "": { + "dependencies": { + "chart.js": "^4.4.3", + "echarts": "^5.5.1", + "flowchart": "^1.2.0", + "flowchart.ts": "^3.0.0", + "katex": "^0.16.10", + "mermaid": "^10.9.1", + "vuepress-plugin-search-pro": "^2.0.0-rc.50" + }, "devDependencies": { - "@vuepress/bundler-vite": "2.0.0-rc.9", - "vue": "^3.4.23", - "vuepress": "2.0.0-rc.9", - "vuepress-plugin-search-pro": "^2.0.0-rc.39", - "vuepress-theme-hope": "2.0.0-rc.40" + "@vuepress/bundler-vite": "2.0.0-rc.14", + "@vuepress/plugin-search": "^2.0.0-rc.37", + "vue": "^3.4.27", + "vuepress": "2.0.0-rc.14", + "vuepress-theme-hope": "2.0.0-rc.50" } }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", - "dev": true, + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -24,68 +32,348 @@ "node": ">=6.0.0" } }, - "node_modules/@docsearch/css": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", - "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==", - "dev": true, + "node_modules/@braintree/sanitize-url": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", + "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], "optional": true, - "peer": true + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@docsearch/js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.0.tgz", - "integrity": "sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==", - "dev": true, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], "optional": true, - "peer": true, - "dependencies": { - "@docsearch/react": "3.6.0", - "preact": "^10.0.0" + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@docsearch/react": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", - "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", - "dev": true, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], "optional": true, - "peer": true, - "dependencies": { - "@algolia/autocomplete-core": "1.9.3", - "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.6.0", - "algoliasearch": "^4.19.1" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0", - "search-insights": ">= 1 < 3" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "search-insights": { - "optional": true - } + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -97,8 +385,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" }, "node_modules/@lit-labs/ssr-dom-shim": { "version": "1.2.0", @@ -116,171 +408,93 @@ } }, "node_modules/@mdit-vue/plugin-component": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-2.1.2.tgz", - "integrity": "sha512-n1HcAC82l912HhtiMSxl5pQLKBYbPok/IcdGRD49rTt53NXBqct68qo58+7jvsj+f8Lmo7kjD+em3tP4BSgl0A==", - "dev": true, + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-2.1.3.tgz", + "integrity": "sha512-9AG17beCgpEw/4ldo/M6Y/1Rh4E1bqMmr/rCkWKmCAxy9tJz3lzY7HQJanyHMJufwsb3WL5Lp7Om/aPcQTZ9SA==", "dependencies": { - "@types/markdown-it": "^14.0.1", + "@types/markdown-it": "^14.1.1", "markdown-it": "^14.1.0" } }, - "node_modules/@mdit-vue/plugin-component/node_modules/@types/markdown-it": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.0.1.tgz", - "integrity": "sha512-6WfOG3jXR78DW8L5cTYCVVGAsIFZskRHCDo5tbqa+qtKVt4oDRVH7hyIWu1SpDQJlmIoEivNQZ5h+AGAOrgOtQ==", - "dev": true, - "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, "node_modules/@mdit-vue/plugin-frontmatter": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-frontmatter/-/plugin-frontmatter-2.1.2.tgz", - "integrity": "sha512-2YOVOsMRtf11bZ6mEB4xoWD6RG5X0Ex+g/1c1iXoYUMUahlZnz9flXUM6WAE++HsLR3Wkvd5FNhGUArrcxn0dA==", - "dev": true, + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-frontmatter/-/plugin-frontmatter-2.1.3.tgz", + "integrity": "sha512-KxsSCUVBEmn6sJcchSTiI5v9bWaoRxe68RBYRDGcSEY1GTnfQ5gQPMIsM48P4q1luLEIWurVGGrRu7u93//LDQ==", "dependencies": { "@mdit-vue/types": "2.1.0", - "@types/markdown-it": "^14.0.1", + "@types/markdown-it": "^14.1.1", "gray-matter": "^4.0.3", "markdown-it": "^14.1.0" } }, - "node_modules/@mdit-vue/plugin-frontmatter/node_modules/@types/markdown-it": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.0.1.tgz", - "integrity": "sha512-6WfOG3jXR78DW8L5cTYCVVGAsIFZskRHCDo5tbqa+qtKVt4oDRVH7hyIWu1SpDQJlmIoEivNQZ5h+AGAOrgOtQ==", - "dev": true, - "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, "node_modules/@mdit-vue/plugin-headers": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-headers/-/plugin-headers-2.1.2.tgz", - "integrity": "sha512-YkBTlHeG4seTcXqrVPvPY6utvkHd2qs7QGU5aM3S5CxUH5l0/SzIRv+irhFMfIRsXQ7zwx2vJVSwJz+n2TFhSA==", - "dev": true, + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-headers/-/plugin-headers-2.1.3.tgz", + "integrity": "sha512-AcL7a7LHQR3ISINhfjGJNE/bHyM0dcl6MYm1Sr//zF7ZgokPGwD/HhD7TzwmrKA9YNYCcO9P3QmF/RN9XyA6CA==", "dependencies": { - "@mdit-vue/shared": "2.1.2", + "@mdit-vue/shared": "2.1.3", "@mdit-vue/types": "2.1.0", - "@types/markdown-it": "^14.0.1", + "@types/markdown-it": "^14.1.1", "markdown-it": "^14.1.0" } }, - "node_modules/@mdit-vue/plugin-headers/node_modules/@types/markdown-it": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.0.1.tgz", - "integrity": "sha512-6WfOG3jXR78DW8L5cTYCVVGAsIFZskRHCDo5tbqa+qtKVt4oDRVH7hyIWu1SpDQJlmIoEivNQZ5h+AGAOrgOtQ==", - "dev": true, + "node_modules/@mdit-vue/plugin-sfc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-sfc/-/plugin-sfc-2.1.3.tgz", + "integrity": "sha512-Ezl0dNvQNS639Yl4siXm+cnWtQvlqHrg+u+lnau/OHpj9Xh3LVap/BSQVugKIV37eR13jXXYf3VaAOP1fXPN+w==", "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" + "@mdit-vue/types": "2.1.0", + "@types/markdown-it": "^14.1.1", + "markdown-it": "^14.1.0" } }, - "node_modules/@mdit-vue/plugin-sfc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-sfc/-/plugin-sfc-2.1.2.tgz", - "integrity": "sha512-wjbFvkUcCcfxc1x33SwqbWSM3WYPJOdlmX9IJQd9y6C7ALujy6Orx1gWn5j0hfke1kIuohvjeJ/K0LqF4oYO4g==", - "dev": true, + "node_modules/@mdit-vue/plugin-title": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-title/-/plugin-title-2.1.3.tgz", + "integrity": "sha512-XWVOQoZqczoN97xCDrnQicmXKoqwOjIymIm9HQnRXhHnYKOgJPW1CxSGhkcOGzvDU1v0mD/adojVyyj/s6ggWw==", "dependencies": { + "@mdit-vue/shared": "2.1.3", "@mdit-vue/types": "2.1.0", - "@types/markdown-it": "^14.0.1", + "@types/markdown-it": "^14.1.1", "markdown-it": "^14.1.0" } }, - "node_modules/@mdit-vue/plugin-sfc/node_modules/@types/markdown-it": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.0.1.tgz", - "integrity": "sha512-6WfOG3jXR78DW8L5cTYCVVGAsIFZskRHCDo5tbqa+qtKVt4oDRVH7hyIWu1SpDQJlmIoEivNQZ5h+AGAOrgOtQ==", - "dev": true, + "node_modules/@mdit-vue/plugin-toc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-toc/-/plugin-toc-2.1.3.tgz", + "integrity": "sha512-41Q+iXpLHZt0zJdApVwoVt7WF6za/xUjtjEPf90Z3KLzQO01TXsv48Xp9BsrFHPcPcm8tiZ0+O1/ICJO80V/MQ==", "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" + "@mdit-vue/shared": "2.1.3", + "@mdit-vue/types": "2.1.0", + "@types/markdown-it": "^14.1.1", + "markdown-it": "^14.1.0" } }, - "node_modules/@mdit-vue/plugin-title": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-title/-/plugin-title-2.1.2.tgz", - "integrity": "sha512-BXgrpuRp6aI/CV/V3jH3zailG9rZH8f094RSky7PE2wTx3c2hnavz3SB3y3TVDv5UC7BGk/uPfBjdYh8/ejsSg==", - "dev": true, + "node_modules/@mdit-vue/shared": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/shared/-/shared-2.1.3.tgz", + "integrity": "sha512-27YI8b0VVZsAlNwaWoaOCWbr4eL8B04HxiYk/y2ktblO/nMcOEOLt4p0RjuobvdyUyjHvGOS09RKhq7qHm1CHQ==", "dependencies": { - "@mdit-vue/shared": "2.1.2", "@mdit-vue/types": "2.1.0", - "@types/markdown-it": "^14.0.1", + "@types/markdown-it": "^14.1.1", "markdown-it": "^14.1.0" } }, - "node_modules/@mdit-vue/plugin-title/node_modules/@types/markdown-it": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.0.1.tgz", - "integrity": "sha512-6WfOG3jXR78DW8L5cTYCVVGAsIFZskRHCDo5tbqa+qtKVt4oDRVH7hyIWu1SpDQJlmIoEivNQZ5h+AGAOrgOtQ==", - "dev": true, - "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, - "node_modules/@mdit-vue/plugin-toc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-toc/-/plugin-toc-2.1.2.tgz", - "integrity": "sha512-G3t9NjhTvl5cYZ9VSsMzVkYjdUrC9nOZE+oxIzpUTtHRH8NtRvoynUDzEDzRnoRDe29cdWDKTAYaeiHUF+TAvQ==", - "dev": true, - "dependencies": { - "@mdit-vue/shared": "2.1.2", - "@mdit-vue/types": "2.1.0", - "@types/markdown-it": "^14.0.1", - "markdown-it": "^14.1.0" - } - }, - "node_modules/@mdit-vue/plugin-toc/node_modules/@types/markdown-it": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.0.1.tgz", - "integrity": "sha512-6WfOG3jXR78DW8L5cTYCVVGAsIFZskRHCDo5tbqa+qtKVt4oDRVH7hyIWu1SpDQJlmIoEivNQZ5h+AGAOrgOtQ==", - "dev": true, - "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, - "node_modules/@mdit-vue/shared": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@mdit-vue/shared/-/shared-2.1.2.tgz", - "integrity": "sha512-5+YHKRyULDqMZsYq+8Ttev0P/osgAoNm2OPYrJtvxLfc1jyrZNiDUCjO2jec7Nk3qyGVZe6FKtXTNLVE+ZRhZw==", - "dev": true, - "dependencies": { - "@mdit-vue/types": "2.1.0", - "@types/markdown-it": "^14.0.1", - "markdown-it": "^14.1.0" - } - }, - "node_modules/@mdit-vue/shared/node_modules/@types/markdown-it": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.0.1.tgz", - "integrity": "sha512-6WfOG3jXR78DW8L5cTYCVVGAsIFZskRHCDo5tbqa+qtKVt4oDRVH7hyIWu1SpDQJlmIoEivNQZ5h+AGAOrgOtQ==", - "dev": true, - "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, "node_modules/@mdit-vue/types": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@mdit-vue/types/-/types-2.1.0.tgz", - "integrity": "sha512-TMBB/BQWVvwtpBdWD75rkZx4ZphQ6MN0O4QB2Bc0oI5PC2uE57QerhNxdRZ7cvBHE2iY2C+BUNUziCfJbjIRRA==", - "dev": true + "integrity": "sha512-TMBB/BQWVvwtpBdWD75rkZx4ZphQ6MN0O4QB2Bc0oI5PC2uE57QerhNxdRZ7cvBHE2iY2C+BUNUziCfJbjIRRA==" }, "node_modules/@mdit/plugin-alert": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-alert/-/plugin-alert-0.8.0.tgz", - "integrity": "sha512-mxA/lhOyDDR6/qSAegGG/XZRjUbr1wjwdULudbpkA/CCQi6piW9D0Z8crDQGYz4KPQM9Bgx4Ac81QFSzHOV66Q==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-alert/-/plugin-alert-0.12.0.tgz", + "integrity": "sha512-4OyGK1PZrJbmEF/kS6GKmmG1nlN5h/CyIPZV8lRgnlWLFB37JiEz3EHusPAXAoMtw7VGNFaIcl7OT/I5yyz1JQ==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -289,19 +503,19 @@ } }, "node_modules/@mdit/plugin-align": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-align/-/plugin-align-0.8.0.tgz", - "integrity": "sha512-OJPYzSdmT0UZj/QTvnKYE4GelAL0OD8bNIPxpidXbFd3IqYv/8+xMjT6XeR+R3oZEvtbYSc2e1MmO5fo3DopJA==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-align/-/plugin-align-0.12.0.tgz", + "integrity": "sha512-rvA+xzaVrlsr44s7XD/xadO3lF0QYWCbeSrOS2dhOroNCIOy4RotVP/1tQPr84eqm4oXcxXF0cbjFuwUgE1jYw==", "dev": true, "dependencies": { - "@mdit/plugin-container": "0.8.0", - "@types/markdown-it": "^13.0.7" + "@mdit/plugin-container": "0.12.0", + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -310,18 +524,18 @@ } }, "node_modules/@mdit/plugin-attrs": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-attrs/-/plugin-attrs-0.8.0.tgz", - "integrity": "sha512-ewmx5i+b3M4CRJNDpDNBA0YTHa1snn+adDsDDpDtPPSzCH1NhtWXdzwI0TrcCQUnueeSEEWX/wY4ESo+NRkBNQ==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-attrs/-/plugin-attrs-0.12.0.tgz", + "integrity": "sha512-J0MBwBq958lBtdIcEo02mUIO4ubl2YK+bY799T2SusrLTf3FZsq8+d/OiLTUtovfxaphD7F6yqo8M61AiOpq+w==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -330,18 +544,18 @@ } }, "node_modules/@mdit/plugin-container": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-container/-/plugin-container-0.8.0.tgz", - "integrity": "sha512-uWK3t0CWssintcmT5PTJVhAwbstcD+SrtijQKs6BhLRtGGgHJ9mOf0ybGjlJhn4077yFFTHmaCIT3K+n5ZVjPg==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-container/-/plugin-container-0.12.0.tgz", + "integrity": "sha512-61bWK1ek6Rn4o12/BIKTWgGU0miB9ENcXE19H5D4DRhwG5+4+0zp2U6hRLf/mE73+mRYin7iKVzcwwEsqs+u8w==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -350,15 +564,15 @@ } }, "node_modules/@mdit/plugin-demo": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-demo/-/plugin-demo-0.8.0.tgz", - "integrity": "sha512-yFRXnp3Lj0g4H9ImzHKQwwgtSykrL/BDNEQzql9fdA9FbSygfu0CIxfm+A8lsVos8cAvdsgxy3gILySxpfR89g==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-demo/-/plugin-demo-0.12.0.tgz", + "integrity": "sha512-+KDUOgcvnMtBN/uYWlhIFuWkTJexuxstq8ERy9q7vOiu8Go85qCb27h0RSToKBTmmGy+XqfU2EdJclYPWBupJQ==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -367,18 +581,18 @@ } }, "node_modules/@mdit/plugin-figure": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-figure/-/plugin-figure-0.8.0.tgz", - "integrity": "sha512-/o4RoKjnkdWc+K7m6mR7BAu2J79yYE38s8HUc8iKk9v+e9j1E+6LeXcpx1LoPnHzUhT4EO2QmUsv+kAaPFfZYw==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-figure/-/plugin-figure-0.12.0.tgz", + "integrity": "sha512-3nfcGI+uM0f6AqHZrEr8kSMBI6T2+fKKQXtCbvWQqQ+P3iGgf34Ay2eAtuMDcDGqyfNuR6e8aLoOeY2QWuEynA==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -387,33 +601,33 @@ } }, "node_modules/@mdit/plugin-footnote": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-footnote/-/plugin-footnote-0.8.0.tgz", - "integrity": "sha512-AaX1rfkJwq9vLX+H/a+XQ3ZxahOXrnMLr5dVZfNdazjqdDEJ7Cc/A7UFtLfOM19F2w3EgvcHR1gbINxIVDn/eg==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-footnote/-/plugin-footnote-0.12.0.tgz", + "integrity": "sha512-9B+bJdMndCPoA9De9bxRm4/fyz02PHRcttOyuyPJ3G+wCAgIN1c/7CB8ViT1YJuECUjLogJQ/rrgqh7f0LTqLQ==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" } }, "node_modules/@mdit/plugin-img-lazyload": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-img-lazyload/-/plugin-img-lazyload-0.8.0.tgz", - "integrity": "sha512-Rrlf2FzOxxyszbv3DpkIwEgmYKmtwHdxIO+Whkn0a9QckxnEKkaGl5KARCnM7LqX2fhEyFLgnfkr3onVOJG54g==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-img-lazyload/-/plugin-img-lazyload-0.12.0.tgz", + "integrity": "sha512-6R42ieXzwkB5BKKZi+ZefqeP/fBG5qo7Sqtl72ewSVqEQ30bgxpk6nkrPI2orRob4tb6z0F/c+R8h6PW5MkTOw==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -422,18 +636,18 @@ } }, "node_modules/@mdit/plugin-img-mark": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-img-mark/-/plugin-img-mark-0.8.0.tgz", - "integrity": "sha512-4P6z2QOfLHLMSXUP4mB/2Rnd6KeHmJBkUXJWJhybcXoIG5S5FDTFHJxOycSP4eGzfdOYAWSlkx6XwXEUGGZz5w==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-img-mark/-/plugin-img-mark-0.12.0.tgz", + "integrity": "sha512-HkIUwlTg/xPsBi4PG+5dsMnsb7wdiJzELSCEUfdAJTg55nksonHfyV2pFpr87MML4nuZlZK9JHt+Bm2BBDSVSw==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -442,18 +656,18 @@ } }, "node_modules/@mdit/plugin-img-size": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-img-size/-/plugin-img-size-0.8.0.tgz", - "integrity": "sha512-r+LbAizP/hw5SisY44VbHEnR7XUKpcHM2k2fwu5wb1+V1crxeigG4sa8rzrJEddU+k6uCl27yL5FTGbHjAl82Q==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-img-size/-/plugin-img-size-0.12.0.tgz", + "integrity": "sha512-fCcF5gc+ba6gQ5ebrKuI8bK/gFbj8mbeN45FHmBsFDFsfTHa0Xij2v8iok0nP8YEIVj71y8XYojsqCWs6avong==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -462,16 +676,16 @@ } }, "node_modules/@mdit/plugin-include": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-include/-/plugin-include-0.8.0.tgz", - "integrity": "sha512-e8Z8q5VkJ6UX04tTgELraupB/MdHio7hkdYT71wBJ6UQuhSmFv/xMOxFfTcGKH5yzsbEM45BtAFHzSXIi3dMCw==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-include/-/plugin-include-0.12.0.tgz", + "integrity": "sha512-8pnmp7s1TjbtoBIa/YhYpEivOpeVSyhkQoQrGq1UoaEcTbXqmFwShGkAW3zUYZVFYTl74PgL/UqJnrUojegJQg==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7", + "@types/markdown-it": "^14.1.1", "upath": "^2.0.1" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -479,22 +693,22 @@ } } }, - "node_modules/@mdit/plugin-katex": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-katex/-/plugin-katex-0.8.0.tgz", - "integrity": "sha512-u7CX3Xv5nuc2bu2sHrk1nil83/9ETKTBMmy0icbW8zlqBC0ykLo1xTCEBXmdhXtnJtPi9f/wUZVs6iMZrJzbNg==", + "node_modules/@mdit/plugin-katex-slim": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-katex-slim/-/plugin-katex-slim-0.12.0.tgz", + "integrity": "sha512-s2MJGXFZT7u8IUTmy6K1rxxAdYRmGggu0m860siyUrThL112xLN9r3jmXZ83epgi4UA/gLkRDAU5vF6R2JtyjQ==", "dev": true, "dependencies": { - "@mdit/plugin-tex": "0.8.0", + "@mdit/plugin-tex": "0.12.0", "@types/katex": "^0.16.7", - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { "katex": "^0.16.9", - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "katex": { @@ -506,18 +720,18 @@ } }, "node_modules/@mdit/plugin-mark": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-mark/-/plugin-mark-0.8.0.tgz", - "integrity": "sha512-1hImu8FskIZ9dumWD2VIyB5USyVGwGY2IuaPxYO25tFvMZkhu4rYBjkSK8x+vXExwp94OLzFUlGgVl94S+nw9w==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-mark/-/plugin-mark-0.12.0.tgz", + "integrity": "sha512-BDFwbV/tbgUGL8KF2ymYNLEXT2KNBLe8D0rshDrbB4Iko1U2DywACQkmaUbYBJ1VCn7/dff35at9fWrm3QjrwQ==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -525,21 +739,21 @@ } } }, - "node_modules/@mdit/plugin-mathjax": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-mathjax/-/plugin-mathjax-0.8.0.tgz", - "integrity": "sha512-y016KQHa3PoXDUIcQseISMAz5q2mZJ/qocEs2EABT4PjquXPEh/4rw7Ql7KX9gf/SQIUyzj8hYs4bHyRZc6x4w==", + "node_modules/@mdit/plugin-mathjax-slim": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-mathjax-slim/-/plugin-mathjax-slim-0.12.0.tgz", + "integrity": "sha512-bLM+JnCTN/3XiyKb64Yhpx014VYLfHBexua4n92cUyoKR9g3waB0loF1WMlg6GdyCTc7OvrUSceNjwWj3YRogg==", "dev": true, "dependencies": { - "@mdit/plugin-tex": "0.8.0", - "@types/markdown-it": "^13.0.7", + "@mdit/plugin-tex": "0.12.0", + "@types/markdown-it": "^14.1.1", "upath": "^2.0.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0", + "markdown-it": "^14.1.0", "mathjax-full": "^3.2.2" }, "peerDependenciesMeta": { @@ -551,19 +765,57 @@ } } }, + "node_modules/@mdit/plugin-plantuml": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-plantuml/-/plugin-plantuml-0.12.0.tgz", + "integrity": "sha512-m1pk6PA9+kWUs8kylLqjnQ7Lex68x3c4Ato8zAh+omkhugfWzuQXfFiXRiJ9C7wkdqHoJx/E5XobP3HJnhCpoA==", + "dev": true, + "dependencies": { + "@mdit/plugin-uml": "0.12.0", + "@types/markdown-it": "^14.1.1" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } + } + }, + "node_modules/@mdit/plugin-spoiler": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-spoiler/-/plugin-spoiler-0.12.0.tgz", + "integrity": "sha512-7yu+Gz000O0OxGnGYOoj77Am3WgH4GwzOvwCp7tPLexkJwTve8MyT9In/NEPFaRw8fmgXwthC0gKq4Ubh1+8DA==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } + } + }, "node_modules/@mdit/plugin-stylize": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-stylize/-/plugin-stylize-0.8.0.tgz", - "integrity": "sha512-oNFI3Z7UTxP8CKxS3CIuawLmsyrc0n9jIw9mPzUcPNp+LtYmLktfZc3FIRlqpUUq34YwHTH3yihayBRdSkVV6A==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-stylize/-/plugin-stylize-0.12.0.tgz", + "integrity": "sha512-5bzZvmjEpGTdwBax9jaDbCBhD1snEx6uTHVUG9HD/L5koKrL86+ox9E5FGeiMiD1dtxeMgL+WqBzV44nRE9ZPg==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -572,18 +824,18 @@ } }, "node_modules/@mdit/plugin-sub": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-sub/-/plugin-sub-0.8.0.tgz", - "integrity": "sha512-oqCcmJVJykESgNJ4fFmDKKxRRQddwkXWIT4PjF83XSeXHxTOz8gMfke/V1mE7BAfKKCLP4io8HbrYfvIiOTZ4A==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-sub/-/plugin-sub-0.12.0.tgz", + "integrity": "sha512-27kKkSVkymc+2RNc5XOYkeXip5PgHZPUnHpxUvkpnairLwyHsXb8/gzr9zd5arVkip86rcdy9LIvnF7zO0dNVQ==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -592,18 +844,18 @@ } }, "node_modules/@mdit/plugin-sup": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-sup/-/plugin-sup-0.8.0.tgz", - "integrity": "sha512-5/uE2lONNjCgGDXC8jZ265tzefjUNQNakmK4PSCI4D5jD80xFrxc6MKh70VLCOL8Xk6COK/K9f0SAU2lwa97Tg==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-sup/-/plugin-sup-0.12.0.tgz", + "integrity": "sha512-3bEDW5/y1UDVU8LVbFsqUvNcMW6orp16uCdRGYCNZ3/IeK7Qj1/9a3wfhScIoI8xRUE6M3JLv41sGBFXLHwi1w==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -612,15 +864,15 @@ } }, "node_modules/@mdit/plugin-tab": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-tab/-/plugin-tab-0.8.0.tgz", - "integrity": "sha512-SNa1S14Buuy564egiUTkU9HTTNFrEURJZLqA1+jr/2xYCdICPym0FWcB0cLtBl3lrQZkFtbxhzC6ws5JBt/ERQ==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-tab/-/plugin-tab-0.12.0.tgz", + "integrity": "sha512-ZDTEDxHoekcFA5Al+NLizn8Nf0kj6ABkNBAc/VxbQoVQdjZNQtGY2dOPeWW0I96Rao+Aw+IpYRCLFIfb/KtExw==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -629,18 +881,18 @@ } }, "node_modules/@mdit/plugin-tasklist": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-tasklist/-/plugin-tasklist-0.8.0.tgz", - "integrity": "sha512-vfOTZdXIL/jk/ConUqCODI5WuqgB9qiBGc+wIa7UMhe73KcpwFeGFJVQZm9AvjhXDDYqznJxSMVRP/TN7TxVVw==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-tasklist/-/plugin-tasklist-0.12.0.tgz", + "integrity": "sha512-MPmuLJrqHYR2xI7ST9Xtw/xj+6Xoq7kUvcGuXWdMMNT11DcU1KppkR8QBHov437NFYh6aGyjrHUVeM4T5Ls8yg==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -649,18 +901,18 @@ } }, "node_modules/@mdit/plugin-tex": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-tex/-/plugin-tex-0.8.0.tgz", - "integrity": "sha512-uh4kOhwBVEESz6dMmHk4Hn/AVfVtUhMA1UKpwMc1EL9qelodJ0YzSYfNXp6d/PS+E1l53yp8nMZK90DUO+3vpA==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-tex/-/plugin-tex-0.12.0.tgz", + "integrity": "sha512-ejeSgSeZvcI5P4hFFQ4q5pHrZBGO2fQWVGm6dZ3BhX4ldoV8LjCIzkcMMXhrhSOVjwHnqmF6xOh9EvI0jzak1w==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -669,18 +921,18 @@ } }, "node_modules/@mdit/plugin-uml": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-uml/-/plugin-uml-0.8.0.tgz", - "integrity": "sha512-6TOVxLhmdzV7bzjlJCRP5uCFq62Xwk2ZAeYUK3RLx9lgM3s2Mww5ENhdysnQMd7VQlUHsPmp4XIMBZZjPddg3g==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-uml/-/plugin-uml-0.12.0.tgz", + "integrity": "sha512-EfVMmq0CwLJcssxhkvGS2ESenNNEMeK04j702Z9v3am1M9DdEj6zHTrHQd9tA0jNVuFY8ZlmMgDfkkG5k6Rm3Q==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -692,7 +944,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -705,7 +956,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -714,7 +964,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -723,24 +972,222 @@ "node": ">= 8" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz", - "integrity": "sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" ] }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==" + }, + "node_modules/@shikijs/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.0.tgz", + "integrity": "sha512-BZcr6FCmPfP6TXaekvujZcnkFmJHZ/Yglu97r/9VjzVndQA56/F4WjUKtJRQUnK59Wi7p/UTAOekMfCJv7jnYg==", + "dev": true + }, + "node_modules/@shikijs/transformers": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.10.0.tgz", + "integrity": "sha512-5Eu/kuJu7/CzAjFlTJkyyPoLTLSVQZ31Ps81cjIeR/3PDJ2RUuX1/R8d0qFziBKToym1LXbNiXoJQq0mg5+Cwg==", + "dev": true, + "dependencies": { + "shiki": "1.10.0" + } + }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, "engines": { "node": ">=18" }, @@ -749,16 +1196,33 @@ } }, "node_modules/@stackblitz/sdk": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@stackblitz/sdk/-/sdk-1.9.0.tgz", - "integrity": "sha512-3m6C7f8pnR5KXys/Hqx2x6ylnpqOak6HtnZI6T5keEO0yT+E4Spkw37VEbdwuC+2oxmjdgq6YZEgiKX7hM1GmQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@stackblitz/sdk/-/sdk-1.10.0.tgz", + "integrity": "sha512-IcvE9Xifo2c4/f+yNqjFM/OW5VTBPLed3TxsQ+n8n81Py358IqD5w0IYfFgV5gbDjp2g5H5YK2/Shls/kQNTWQ==", "dev": true }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, "dependencies": { "@types/ms": "*" } @@ -767,13 +1231,12 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "devOptional": true }, "node_modules/@types/fs-extra": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", - "dev": true, "dependencies": { "@types/jsonfile": "*", "@types/node": "*" @@ -782,14 +1245,12 @@ "node_modules/@types/hash-sum": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-UP28RddqY8xcU0SCEp9YKutQICXpaAq9N8U2klqF5hegGha7KzTOL8EdhIIV3bOSGBzjEpN9bU/d+nNZBdJYVw==", - "dev": true + "integrity": "sha512-UP28RddqY8xcU0SCEp9YKutQICXpaAq9N8U2klqF5hegGha7KzTOL8EdhIIV3bOSGBzjEpN9bU/d+nNZBdJYVw==" }, "node_modules/@types/jsonfile": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -801,51 +1262,58 @@ "dev": true }, "node_modules/@types/linkify-it": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", - "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", - "dev": true + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==" }, "node_modules/@types/markdown-it": { - "version": "13.0.7", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.7.tgz", - "integrity": "sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==", - "dev": true, + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" + "@types/linkify-it": "^5", + "@types/mdurl": "^2" } }, "node_modules/@types/markdown-it-emoji": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/markdown-it-emoji/-/markdown-it-emoji-2.0.5.tgz", - "integrity": "sha512-iJLsmCNpSWKtV6Ia3mLSjcXJPEt7ubGG342z+hGvYx++TpM19oTUrJcI7XjbOqRQ+W2UQ323E7B0eCLwlgT/9g==", - "dev": true, + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/markdown-it-emoji/-/markdown-it-emoji-3.0.1.tgz", + "integrity": "sha512-cz1j8R35XivBqq9mwnsrP2fsz2yicLhB8+PDtuVkKOExwEdsVBNI+ROL3sbhtR5occRZ66vT0QnwFZCqdjf3pA==", + "dependencies": { + "@types/markdown-it": "^14" + } + }, + "node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dependencies": { - "@types/markdown-it": "*" + "@types/unist": "^2" } }, "node_modules/@types/mdurl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", - "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==" }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", - "dev": true, + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", "dependencies": { "undici-types": "~5.26.4" } }, + "node_modules/@types/raphael": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@types/raphael/-/raphael-2.3.9.tgz", + "integrity": "sha512-K1dZwoLNvEN+mvleFU/t2swG9Z4SE5Vub7dA5wDYojH0bVTQ8ZAP+lNsl91t1njdu/B+roSEL4QXC67I7Hpiag==" + }, "node_modules/@types/sax": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", @@ -861,17 +1329,21 @@ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "dev": true }, + "node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, "node_modules/@types/web-bluetooth": { "version": "0.0.20", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", - "dev": true + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==" }, "node_modules/@vitejs/plugin-vue": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", - "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", - "dev": true, + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", + "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", + "devOptional": true, "engines": { "node": "^18.0.0 || >=20.0.0" }, @@ -881,284 +1353,278 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.23", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.23.tgz", - "integrity": "sha512-HAFmuVEwNqNdmk+w4VCQ2pkLk1Vw4XYiiyxEp3z/xvl14aLTUBw2OfVH3vBcx+FtGsynQLkkhK410Nah1N2yyQ==", - "dev": true, + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.31.tgz", + "integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==", "dependencies": { - "@babel/parser": "^7.24.1", - "@vue/shared": "3.4.23", + "@babel/parser": "^7.24.7", + "@vue/shared": "3.4.31", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.23", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.23.tgz", - "integrity": "sha512-t0b9WSTnCRrzsBGrDd1LNR5HGzYTr7LX3z6nNBG+KGvZLqrT0mY6NsMzOqlVMBKKXKVuusbbB5aOOFgTY+senw==", - "dev": true, + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz", + "integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==", "dependencies": { - "@vue/compiler-core": "3.4.23", - "@vue/shared": "3.4.23" + "@vue/compiler-core": "3.4.31", + "@vue/shared": "3.4.31" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.23", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.23.tgz", - "integrity": "sha512-fSDTKTfzaRX1kNAUiaj8JB4AokikzStWgHooMhaxyjZerw624L+IAP/fvI4ZwMpwIh8f08PVzEnu4rg8/Npssw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.24.1", - "@vue/compiler-core": "3.4.23", - "@vue/compiler-dom": "3.4.23", - "@vue/compiler-ssr": "3.4.23", - "@vue/shared": "3.4.23", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz", + "integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==", + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/compiler-core": "3.4.31", + "@vue/compiler-dom": "3.4.31", + "@vue/compiler-ssr": "3.4.31", + "@vue/shared": "3.4.31", "estree-walker": "^2.0.2", - "magic-string": "^0.30.8", + "magic-string": "^0.30.10", "postcss": "^8.4.38", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.23", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.23.tgz", - "integrity": "sha512-hb6Uj2cYs+tfqz71Wj6h3E5t6OKvb4MVcM2Nl5i/z1nv1gjEhw+zYaNOV+Xwn+SSN/VZM0DgANw5TuJfxfezPg==", - "dev": true, + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz", + "integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==", "dependencies": { - "@vue/compiler-dom": "3.4.23", - "@vue/shared": "3.4.23" + "@vue/compiler-dom": "3.4.31", + "@vue/shared": "3.4.31" } }, "node_modules/@vue/devtools-api": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", - "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==", - "dev": true + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz", + "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==" }, "node_modules/@vue/reactivity": { - "version": "3.4.23", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.23.tgz", - "integrity": "sha512-GlXR9PL+23fQ3IqnbSQ8OQKLodjqCyoCrmdLKZk3BP7jN6prWheAfU7a3mrltewTkoBm+N7qMEb372VHIkQRMQ==", - "dev": true, + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.31.tgz", + "integrity": "sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==", "dependencies": { - "@vue/shared": "3.4.23" + "@vue/shared": "3.4.31" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.23", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.23.tgz", - "integrity": "sha512-FeQ9MZEXoFzFkFiw9MQQ/FWs3srvrP+SjDKSeRIiQHIhtkzoj0X4rWQlRNHbGuSwLra6pMyjAttwixNMjc/xLw==", - "dev": true, + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.31.tgz", + "integrity": "sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==", "dependencies": { - "@vue/reactivity": "3.4.23", - "@vue/shared": "3.4.23" + "@vue/reactivity": "3.4.31", + "@vue/shared": "3.4.31" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.23", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.23.tgz", - "integrity": "sha512-RXJFwwykZWBkMiTPSLEWU3kgVLNAfActBfWFlZd0y79FTUxexogd0PLG4HH2LfOktjRxV47Nulygh0JFXe5f9A==", - "dev": true, + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz", + "integrity": "sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==", "dependencies": { - "@vue/runtime-core": "3.4.23", - "@vue/shared": "3.4.23", + "@vue/reactivity": "3.4.31", + "@vue/runtime-core": "3.4.31", + "@vue/shared": "3.4.31", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.23", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.23.tgz", - "integrity": "sha512-LDwGHtnIzvKFNS8dPJ1SSU5Gvm36p2ck8wCZc52fc3k/IfjKcwCyrWEf0Yag/2wTFUBXrqizfhK9c/mC367dXQ==", - "dev": true, + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.31.tgz", + "integrity": "sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==", "dependencies": { - "@vue/compiler-ssr": "3.4.23", - "@vue/shared": "3.4.23" + "@vue/compiler-ssr": "3.4.31", + "@vue/shared": "3.4.31" }, "peerDependencies": { - "vue": "3.4.23" + "vue": "3.4.31" } }, "node_modules/@vue/shared": { - "version": "3.4.23", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.23.tgz", - "integrity": "sha512-wBQ0gvf+SMwsCQOyusNw/GoXPV47WGd1xB5A1Pgzy0sQ3Bi5r5xm3n+92y3gCnB3MWqnRDdvfkRGxhKtbBRNgg==", - "dev": true + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.31.tgz", + "integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==" }, "node_modules/@vuepress/bundler-vite": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@vuepress/bundler-vite/-/bundler-vite-2.0.0-rc.9.tgz", - "integrity": "sha512-GcM2eSqW2mPY5xXX4i5kuZujvwUeiTpsLX5kgau9LzPox+FdA3SMUkppCY3hsou2o2RxXPTfjocE7OlYQrUqvA==", - "dev": true, - "dependencies": { - "@vitejs/plugin-vue": "^5.0.4", - "@vuepress/client": "2.0.0-rc.9", - "@vuepress/core": "2.0.0-rc.9", - "@vuepress/shared": "2.0.0-rc.9", - "@vuepress/utils": "2.0.0-rc.9", + "version": "2.0.0-rc.14", + "resolved": "https://registry.npmjs.org/@vuepress/bundler-vite/-/bundler-vite-2.0.0-rc.14.tgz", + "integrity": "sha512-kttbowYITMCX3ztz78Qb6bMfXRv/GEpNu+nALksu7j/QJQ0gOzI2is68PatbmzZRWOufVsf1Zf0A8BwolmVcXA==", + "devOptional": true, + "dependencies": { + "@vitejs/plugin-vue": "^5.0.5", + "@vuepress/client": "2.0.0-rc.14", + "@vuepress/core": "2.0.0-rc.14", + "@vuepress/shared": "2.0.0-rc.14", + "@vuepress/utils": "2.0.0-rc.14", "autoprefixer": "^10.4.19", "connect-history-api-fallback": "^2.0.0", "postcss": "^8.4.38", - "postcss-load-config": "^5.0.3", - "rollup": "^4.13.0", - "vite": "~5.2.2", - "vue": "^3.4.21", - "vue-router": "^4.3.0" + "postcss-load-config": "^6.0.1", + "rollup": "^4.18.0", + "vite": "~5.3.1", + "vue": "^3.4.29", + "vue-router": "^4.3.3" } }, "node_modules/@vuepress/cli": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@vuepress/cli/-/cli-2.0.0-rc.9.tgz", - "integrity": "sha512-uv7Xmv3QmPpzCaUAq0oKEwp2tY64AO+7mxamgr7tr+t6FEnCYqr+X0nLlH17UtMkmGWIsbHLIlMjteprxGxIMg==", - "dev": true, + "version": "2.0.0-rc.14", + "resolved": "https://registry.npmjs.org/@vuepress/cli/-/cli-2.0.0-rc.14.tgz", + "integrity": "sha512-oYJX1nE6/ohF2tzUtpBAFxRr4MF2kdtab3+AQ897esXzrciQnE2LxPQZ8BUOn6Jb3XYW12FXDdkHrr82rN6XnQ==", "dependencies": { - "@vuepress/core": "2.0.0-rc.9", - "@vuepress/shared": "2.0.0-rc.9", - "@vuepress/utils": "2.0.0-rc.9", + "@vuepress/core": "2.0.0-rc.14", + "@vuepress/shared": "2.0.0-rc.14", + "@vuepress/utils": "2.0.0-rc.14", "cac": "^6.7.14", "chokidar": "^3.6.0", - "envinfo": "^7.11.1", - "esbuild": "~0.20.2" + "envinfo": "^7.13.0", + "esbuild": "~0.21.5" }, "bin": { "vuepress-cli": "bin/vuepress.js" } }, "node_modules/@vuepress/client": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-rc.9.tgz", - "integrity": "sha512-V5jA6L1nHQ8tXBshRHBJKei7HPFonGxFzmVK5yjj2Ho/Xtp/SD9rBS6dyYd5CSkKRGQDgy19Z+BUUPXtdI1qzg==", - "dev": true, + "version": "2.0.0-rc.14", + "resolved": "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-rc.14.tgz", + "integrity": "sha512-ULwxOiWoUi15HWQ6qH60gWjxSXB0797uExCUa4HgHV/8SpIqv4SHFn6jqjo7qCzOxuTqj1RT47JH3oWfUF4XPA==", "dependencies": { - "@vue/devtools-api": "^6.6.1", - "@vuepress/shared": "2.0.0-rc.9", - "vue": "^3.4.21", - "vue-router": "^4.3.0" + "@vue/devtools-api": "^6.6.3", + "@vuepress/shared": "2.0.0-rc.14", + "vue": "^3.4.29", + "vue-router": "^4.3.3" } }, "node_modules/@vuepress/core": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-2.0.0-rc.9.tgz", - "integrity": "sha512-uvMkIqYJ7vjfYEC91rMmT8YJt8xXnob5YYY3TzlwWUSEv4yoV3nlVu0l6Zfhenx/7FwKaxRJ/ePlUGIgUHBcBw==", - "dev": true, + "version": "2.0.0-rc.14", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-2.0.0-rc.14.tgz", + "integrity": "sha512-Ly3fypjXGUgPzjfbXKJeyd59jxJgXkhxhWAGkH/rRyQeV8Nr7Wo1ah3H1MeGhlCRGH1T9Yd3Bz9W7QMoyWFfmg==", "dependencies": { - "@vuepress/client": "2.0.0-rc.9", - "@vuepress/markdown": "2.0.0-rc.9", - "@vuepress/shared": "2.0.0-rc.9", - "@vuepress/utils": "2.0.0-rc.9", - "vue": "^3.4.21" + "@vuepress/client": "2.0.0-rc.14", + "@vuepress/markdown": "2.0.0-rc.14", + "@vuepress/shared": "2.0.0-rc.14", + "@vuepress/utils": "2.0.0-rc.14", + "vue": "^3.4.29" } }, "node_modules/@vuepress/helper": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/@vuepress/helper/-/helper-2.0.0-rc.24.tgz", - "integrity": "sha512-qXC+tXTKfZ7eJ+h3wYC/7Q903Tbqcz9Vqxku63R6pmcpbsRtt3l8XQRdJ/LMT5yX0wZln4Qzx1NY6S4psr0lzw==", - "dev": true, + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/helper/-/helper-2.0.0-rc.37.tgz", + "integrity": "sha512-Sa2H6EqRuG0+521Z5WN7I8EQNwLwFe7U+1KtV01zFp2BcehsgD3EigBjBP7hl01ubb4T8wR7CxWv7cGVA4bPcw==", "dependencies": { - "@vue/shared": "^3.4.21", + "@vue/shared": "^3.4.29", "cheerio": "1.0.0-rc.12", "fflate": "^0.8.2", "gray-matter": "^4.0.3", - "vue": "^3.4.21" + "vue": "^3.4.29" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, - "node_modules/@vuepress/markdown": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-2.0.0-rc.9.tgz", - "integrity": "sha512-e7as2ar3RQp0bUyMiwBPi7L/G2fzscb3s0BywNcAwubFR22o0/dBEYRYdrN0clPQ2FXpPxF6AFj4aD7O1heCbw==", + "node_modules/@vuepress/highlighter-helper": { + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/highlighter-helper/-/highlighter-helper-2.0.0-rc.37.tgz", + "integrity": "sha512-l7qxuJJP0+zxDd42UctS0Oc240cCN7BvxfEx6XJfaYmn2Yncrbbk15gS9tUT3jeXB959JGm8uUhxpPP0/4w3kw==", "dev": true, - "dependencies": { - "@mdit-vue/plugin-component": "^2.0.0", - "@mdit-vue/plugin-frontmatter": "^2.0.0", - "@mdit-vue/plugin-headers": "^2.0.0", - "@mdit-vue/plugin-sfc": "^2.0.0", - "@mdit-vue/plugin-title": "^2.0.0", - "@mdit-vue/plugin-toc": "^2.0.0", - "@mdit-vue/shared": "^2.0.0", - "@mdit-vue/types": "^2.0.0", - "@types/markdown-it": "^13.0.7", - "@types/markdown-it-emoji": "^2.0.4", - "@vuepress/shared": "2.0.0-rc.9", - "@vuepress/utils": "2.0.0-rc.9", + "peerDependencies": { + "vuepress": "2.0.0-rc.14" + } + }, + "node_modules/@vuepress/markdown": { + "version": "2.0.0-rc.14", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-2.0.0-rc.14.tgz", + "integrity": "sha512-9xr693gkp71qwEbQLxpo1ybhJ+lA2k5SiuFUgqqrmR2a8CSL3gcmKEGM+y7GMnHvL63U2dYlc9pUOtJ5rG9O0Q==", + "dependencies": { + "@mdit-vue/plugin-component": "^2.1.3", + "@mdit-vue/plugin-frontmatter": "^2.1.3", + "@mdit-vue/plugin-headers": "^2.1.3", + "@mdit-vue/plugin-sfc": "^2.1.3", + "@mdit-vue/plugin-title": "^2.1.3", + "@mdit-vue/plugin-toc": "^2.1.3", + "@mdit-vue/shared": "^2.1.3", + "@mdit-vue/types": "^2.1.0", + "@types/markdown-it": "^14.1.1", + "@types/markdown-it-emoji": "^3.0.1", + "@vuepress/shared": "2.0.0-rc.14", + "@vuepress/utils": "2.0.0-rc.14", "markdown-it": "^14.1.0", - "markdown-it-anchor": "^8.6.7", + "markdown-it-anchor": "^9.0.1", "markdown-it-emoji": "^3.0.0", "mdurl": "^2.0.0" } }, "node_modules/@vuepress/plugin-active-header-links": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-rc.21.tgz", - "integrity": "sha512-6i9TfGDV1zfszQ5aw6bV+/UvPdBWt3VxN2WB4Dg5o1g8Qn4z5CI6AW6VfLKRyaKUD+Rzj6W+Ikgx4xnF5RZAdA==", + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-rc.37.tgz", + "integrity": "sha512-VLM0JXgdShRAR38smp/M72sctDIVPgW4E+fBpGaP4iG+JOywXbLp5MfiO/r1ww62k7LXRI8g8/hYjlhyeMGnEg==", "dev": true, "dependencies": { - "@vueuse/core": "^10.9.0", - "vue": "^3.4.21" + "@vueuse/core": "^10.11.0", + "vue": "^3.4.29" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, "node_modules/@vuepress/plugin-back-to-top": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-rc.24.tgz", - "integrity": "sha512-cU5KtsuqUBcDiNlAD+I2NaaEd7ZRDldWPggJMgE7VvhEQ8uJMOq4ogh2IabeqGZ26XiUYuGnNrp4JK5mDkQlvw==", + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-rc.37.tgz", + "integrity": "sha512-R9rAXZCYdnBADvcbY2V4xtGOHS11mAIV98MbpixP1CYGaRdOGMcp4oJwfsGqwE1Iyi/nBgBaVFHexyQFkx7Rag==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.24", - "@vueuse/core": "^10.9.0", - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.37", + "@vueuse/core": "^10.11.0", + "vue": "^3.4.29" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, "node_modules/@vuepress/plugin-blog": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-blog/-/plugin-blog-2.0.0-rc.24.tgz", - "integrity": "sha512-EEpJcTHhlB6/LWXWdhBN3f9dFRrkOJSWw9KyD/7/GBImqbPKrdWh2y6VZejUvZBK+1Onv0/KEXMgE3zI3LAB/g==", + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-blog/-/plugin-blog-2.0.0-rc.37.tgz", + "integrity": "sha512-rJBM/P7PNhKkbz8UfQjY9qo1zxJZlF31vBgx1inhGS2tP1KJoUPTZdIRk35TphIKnA/4Xp6c7KLAL0RT4R21bw==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.24", + "@vuepress/helper": "2.0.0-rc.37", "chokidar": "^3.6.0", - "vue": "^3.4.21" + "vue": "^3.4.29" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, "node_modules/@vuepress/plugin-catalog": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-catalog/-/plugin-catalog-2.0.0-rc.24.tgz", - "integrity": "sha512-MkJ14qOd0KoKb8cmFqT0tPNK9REJNP8bm1dZBdYOrqX8mDgt4nq2EyVOZTBZWqaYyXekJZyNfXkN4i556/8x+w==", + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-catalog/-/plugin-catalog-2.0.0-rc.37.tgz", + "integrity": "sha512-NTTQZNtiO3cXtZ1/UK0ZKFjU3zUsg6KjCFme75vDAzS9TaO9G4c/RLlHKnmfMz/eGTwbiaoZPNcpR9xlGP0c9A==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.24", - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.37", + "vue": "^3.4.29" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, "node_modules/@vuepress/plugin-comment": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-comment/-/plugin-comment-2.0.0-rc.24.tgz", - "integrity": "sha512-Kl5LHCbyoTIXFZwMmJa4f8neMbebC4ZhASf8cnfdNTBf6XRVbSH1fGJKGFK1lUm3EcjjBHIAuZIrlMWPmepUGQ==", + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-comment/-/plugin-comment-2.0.0-rc.37.tgz", + "integrity": "sha512-SmwOdMzdHRV8LHSRmhwFibHesfaa3iRZDGMGcIYI5o294R1XO+QCVanV/KJ4GcNvpqrIlZpYN6z5CJrSz1jLxg==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.24", + "@vuepress/helper": "2.0.0-rc.37", "giscus": "^1.5.0", - "vue": "^3.4.21" + "vue": "^3.4.29" }, "peerDependencies": { "@waline/client": "^3.1.0", - "artalk": "^2.7.3", - "sass-loader": "^14.0.0", + "artalk": "^2.8.7", "twikoo": "^1.5.0", - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" }, "peerDependenciesMeta": { "@waline/client": { @@ -1167,263 +1633,291 @@ "artalk": { "optional": true }, - "sass-loader": { - "optional": true - }, "twikoo": { "optional": true } } }, "node_modules/@vuepress/plugin-copy-code": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-copy-code/-/plugin-copy-code-2.0.0-rc.24.tgz", - "integrity": "sha512-anLxeQqTiU+LNdEBK7EUbeIcU0YEh6x9Bs9SQV4wrdFKjYc5x2U4Gf9l9NagOSf1e3c0QZRYL3wLQ5q3XZnGjA==", + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-copy-code/-/plugin-copy-code-2.0.0-rc.37.tgz", + "integrity": "sha512-Z8rvn3n+SsEUmyoR2rYo/AYUPbOsJravtVh4COVqc40FT6gxlZPLlUcr4XV4Nh0ja87oZn/FubbZMkWfU8MyOA==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.24", - "@vueuse/core": "^10.9.0", - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.37", + "@vueuse/core": "^10.11.0", + "vue": "^3.4.29" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, "node_modules/@vuepress/plugin-copyright": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-copyright/-/plugin-copyright-2.0.0-rc.24.tgz", - "integrity": "sha512-sposicjAxALPhXb6TBVq5x6dE2/87OvwyB4RFs0kCeUjE4Tg7WKj2E28vdRQtNGE0P8MC0D0qJbi/ORbg9UObw==", - "dev": true, - "dependencies": { - "@vuepress/helper": "~2.0.0-rc.24", - "@vueuse/core": "^10.9.0", - "vue": "^3.4.21" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.9" - } - }, - "node_modules/@vuepress/plugin-docsearch": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-docsearch/-/plugin-docsearch-2.0.0-rc.24.tgz", - "integrity": "sha512-RWJSzRu7+fCO3//rYGO3EBq3+MkrGRyZx0k8nV1CiubpTa0aYftxxYoZdQH4UJslTuKhNShlYsIzxYNMYAf7uw==", + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-copyright/-/plugin-copyright-2.0.0-rc.37.tgz", + "integrity": "sha512-V7gTq7nQLzl6S/hd+H775yLUCOtWYWcH6epZMPJJn82iuqscP07lMLcw4SfAyILgHsvi5sK64HAbRVEo3QEc9w==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "@docsearch/css": "^3.6.0", - "@docsearch/js": "^3.6.0", - "@docsearch/react": "^3.6.0", - "@vuepress/helper": "~2.0.0-rc.24", - "@vueuse/core": "^10.9.0", - "ts-debounce": "^4.0.0", - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.37", + "@vueuse/core": "^10.11.0", + "vue": "^3.4.29" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, - "node_modules/@vuepress/plugin-external-link-icon": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-external-link-icon/-/plugin-external-link-icon-2.0.0-rc.24.tgz", - "integrity": "sha512-kry1EFkv6WaGOCzk9vRGHGcAuQHNVQ/jDEgtagUFaRk5+HtCQB60VzhmFdwM08DC2XAmDieBLm1MMR0T2DdHSw==", + "node_modules/@vuepress/plugin-git": { + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-git/-/plugin-git-2.0.0-rc.37.tgz", + "integrity": "sha512-+p+EkcWsoErJXKdVZQBfazJ6Q8YFRXXjfDrb1qUSF5wCUfC7QgD6Vsgt5MmB9YZjbhj1Yf/xeZcDVB6qz8B+GA==", "dev": true, "dependencies": { - "vue": "^3.4.21" + "execa": "^9.2.0" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, - "node_modules/@vuepress/plugin-git": { - "version": "2.0.0-rc.22", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-git/-/plugin-git-2.0.0-rc.22.tgz", - "integrity": "sha512-+T50AdCZ68Pkld4r8IEHTXLugfNVCxxPp2G1hlI/lpQ6IZcpLbswMI6l9xbbo15RrOBg/V0jkim/B/jaaVIM6A==", + "node_modules/@vuepress/plugin-links-check": { + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-links-check/-/plugin-links-check-2.0.0-rc.37.tgz", + "integrity": "sha512-9YelTHKFKADKmSdGxEVyF5LE6r9rg95ia695tQ695n/ov+2/iC0Ez6Kc0ceaqdaCPMq8Q5OsLAh2/hC2N/H15Q==", "dev": true, "dependencies": { - "execa": "^8.0.1" + "@vuepress/helper": "2.0.0-rc.37" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, - "node_modules/@vuepress/plugin-links-check": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-links-check/-/plugin-links-check-2.0.0-rc.24.tgz", - "integrity": "sha512-+HPIutNZhMP2eSf1Gb217WLCQlQhsMkebTfuZYyDSGGvY5TQmXOAuu/X7Xwh1lJlml9asPUXTcFe2cZcEtHHIA==", + "node_modules/@vuepress/plugin-notice": { + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-notice/-/plugin-notice-2.0.0-rc.37.tgz", + "integrity": "sha512-dUoHOZpvV3K8eVPNhTz6Bh+aZzM+Trk+JZumLRqywQ2f5Kn+unU3VTjJHrfWUIYFuwcmWjWbKdz0D35B48UVFA==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.24" + "@vuepress/helper": "2.0.0-rc.37", + "@vueuse/core": "^10.11.0", + "vue": "^3.4.29" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, "node_modules/@vuepress/plugin-nprogress": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-rc.21.tgz", - "integrity": "sha512-qpGA76195SyfpuQC1Pb9LwgCYIp/zg+BBDnexukJMdLjP1KnaU7HLhS5NnRNIWv8E+IC61zLvlh/wRox17QE+w==", + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-rc.37.tgz", + "integrity": "sha512-HEv6AzAG3U7Q5cAkeuQhMV2JhASB/2veTQ85OHNyWUzZ5yTC/Kx5PfQOb87X6LWK51eZA5vImibeZbFJ1mkE3g==", "dev": true, "dependencies": { - "vue": "^3.4.21" + "vue": "^3.4.29" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, "node_modules/@vuepress/plugin-photo-swipe": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-photo-swipe/-/plugin-photo-swipe-2.0.0-rc.24.tgz", - "integrity": "sha512-2Rvi8ODFJgIDDfrXzt7ynY3nizCiEte2Cna4W73bH1+s9PMiOoa5rQ54/r+jbLe4Nw5Iw4x+PXcRN8fDQPllKg==", + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-photo-swipe/-/plugin-photo-swipe-2.0.0-rc.37.tgz", + "integrity": "sha512-b9QR16jsx34z5TQvFvO3vMaPcuCD05OBvoFJ4nzu3P9cCZxIAfx3fw5wjIXR2wpKIiGLvkPhFOxNCywKFPAeBA==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.24", - "@vueuse/core": "^10.9.0", - "photoswipe": "^5.4.3", - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.37", + "@vueuse/core": "^10.11.0", + "photoswipe": "^5.4.4", + "vue": "^3.4.29" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, - "node_modules/@vuepress/plugin-prismjs": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-prismjs/-/plugin-prismjs-2.0.0-rc.21.tgz", - "integrity": "sha512-dMTCu/TZ1QCmTHXL4THVeh9gWzuqkJV8qhck5U77OP1qmgyf+r529A+MTOgp3ddcph1Yzb/FRb2orlefHk+yNQ==", + "node_modules/@vuepress/plugin-reading-time": { + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-reading-time/-/plugin-reading-time-2.0.0-rc.37.tgz", + "integrity": "sha512-jvg9pYkj0+PTv1P+H0Yk2RcXIKuz8LNwa05Ratf+pDppdi0ImnIBMNzk6gsQuBOjemol+1NNStYRu2Oo1IUudA==", "dev": true, "dependencies": { - "prismjs": "^1.29.0" + "@vuepress/helper": "2.0.0-rc.37", + "vue": "^3.4.29" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, - "node_modules/@vuepress/plugin-reading-time": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-reading-time/-/plugin-reading-time-2.0.0-rc.24.tgz", - "integrity": "sha512-La6dgul551Xp2Iacs1URZnLX5YdakfJWFfE9vIhhX/Q1+slUGRVftFLh/nb0oVUrsXNeRlqCUncTyilg51Q1fA==", + "node_modules/@vuepress/plugin-rtl": { + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-rtl/-/plugin-rtl-2.0.0-rc.37.tgz", + "integrity": "sha512-XgxfO0y6sVG1rMiRVYT/DNZegOEeZurqLioZvoOVtVo7HASF1qKVrfgRwSoorVnZwpg7VtWf0U27RCO9A8BC4Q==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.24", - "vue": "^3.4.21" + "vue": "^3.4.29" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, - "node_modules/@vuepress/plugin-rtl": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-rtl/-/plugin-rtl-2.0.0-rc.21.tgz", - "integrity": "sha512-r+4aP898KsFbF6m1J0e+776ZlSE9yaHr9zsMlib1GEUDcqP/OykMYaNKwRsOMB1eFXNmymgHlXFvswBGEHxS7w==", - "dev": true, + "node_modules/@vuepress/plugin-sass-palette": { + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-sass-palette/-/plugin-sass-palette-2.0.0-rc.37.tgz", + "integrity": "sha512-/dy47g27diqwbupYsoNTTgqsEv26AbC/rrypFLb6qQwYd+/1sO/b6osAqpqbm1u7mGq5J3nCGLp6mtK9gVLpTg==", "dependencies": { - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.37", + "chokidar": "^3.6.0", + "sass": "^1.77.6" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" - } + "sass-loader": "^14.0.0", + "vuepress": "2.0.0-rc.14" + }, + "peerDependenciesMeta": { + "sass-loader": { + "optional": true + } + } }, "node_modules/@vuepress/plugin-search": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-2.0.0-rc.24.tgz", - "integrity": "sha512-GgjKMCb+IUYTo/Nui7vCIzQV5KpZD05VknhPmy3aySYXGd55vem8IVDVOV71CU1mX9qnHnQt5DFX2sBtmu2SRQ==", + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-2.0.0-rc.37.tgz", + "integrity": "sha512-shFojdAi8Jj+/4w8Sgnl8UxssOWd/8HMF/5RGqa3rgKxNiCCzndLag8OJmRE1xbMnkdKvtPlA0UoOgG9qDom9g==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "chokidar": "^3.6.0", - "vue": "^3.4.21" + "vue": "^3.4.29" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, "node_modules/@vuepress/plugin-seo": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-seo/-/plugin-seo-2.0.0-rc.24.tgz", - "integrity": "sha512-E0dRCNqV6RLoVV4j8xchmlsnlR7OyPQxWmWrk20mBiyluRI05OXdb20ZQbYJe3PfK8f8DnyETzob943HBg3sVA==", + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-seo/-/plugin-seo-2.0.0-rc.37.tgz", + "integrity": "sha512-H6bM4jYKwFABP/JGocDC7CD5SACMdFf9rE5lci5/VYJybvBr5XXDXHXk9KSy01jupPjmAjsGp5Fzqk2ggeqQIQ==", + "dev": true, + "dependencies": { + "@vuepress/helper": "2.0.0-rc.37" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.14" + } + }, + "node_modules/@vuepress/plugin-shiki": { + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-shiki/-/plugin-shiki-2.0.0-rc.37.tgz", + "integrity": "sha512-3VBobLYjj8dnWMohy4HK/eCRiZ/9DzCG4hMStBJiIr6R5kyf3yVc7kc5rWSiOqq8yrNwkgNafKPuAaZYHKuJdw==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.24" + "@shikijs/transformers": "^1.7.0", + "@vuepress/helper": "2.0.0-rc.37", + "@vuepress/highlighter-helper": "2.0.0-rc.37", + "nanoid": "^5.0.7", + "shiki": "^1.7.0" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" + } + }, + "node_modules/@vuepress/plugin-shiki/node_modules/nanoid": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz", + "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" } }, "node_modules/@vuepress/plugin-sitemap": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-sitemap/-/plugin-sitemap-2.0.0-rc.24.tgz", - "integrity": "sha512-su5ZD8vGuNpbqmb+uCOzWXCZ0eii8wnkdhn4V1xtmmXsrmYDr0FFHp61Ebb6EYAquB3HH1v3hWdfLRMU9DM6VQ==", + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-sitemap/-/plugin-sitemap-2.0.0-rc.37.tgz", + "integrity": "sha512-mL9aKIkiSEJizVcsreY7O+FZmTT/coV4iR2P5OQ5oyXbcByMN+omirsupHBHsWl2zH/EZe2FklByDEDUPpg3MQ==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.24", - "sitemap": "^7.1.1" + "@vuepress/helper": "2.0.0-rc.37", + "sitemap": "^8.0.0" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, "node_modules/@vuepress/plugin-theme-data": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-rc.21.tgz", - "integrity": "sha512-vLXvTKx4gWXY6oVaJ9Z2ECnojnKQuXBIe1ZGIAwJdxCYfr6aaqggrVvmphB8BwTURh0XAuis/l6YTcMrs0bX8Q==", + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-rc.37.tgz", + "integrity": "sha512-xzdYyScZcS5aDbk/2bQAuEofe6wqgtX2Y/6SUqsGlV4A59D+xIfPbNUZhO0gbUX//ofYGaxgKQps0OrvPkwMVg==", "dev": true, "dependencies": { - "@vue/devtools-api": "^6.6.1", - "vue": "^3.4.21" + "@vue/devtools-api": "^6.6.3", + "vue": "^3.4.29" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, - "node_modules/@vuepress/shared": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@vuepress/shared/-/shared-2.0.0-rc.9.tgz", - "integrity": "sha512-XfI6CWNv4/Vp9Iew6GJil9RUSy1rM7zGdjwikr0j3Rkh55q3f00w1wud47wE9kxRqsZ0PIvsMget5CxEn5rA/w==", + "node_modules/@vuepress/plugin-watermark": { + "version": "2.0.0-rc.37", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-watermark/-/plugin-watermark-2.0.0-rc.37.tgz", + "integrity": "sha512-lHNkxpIB0yV9RdzVRFQMQ1J2jhYVYJCyeZyZmnNMQ5P/iPnhrAOFLO/opHnCuGUun/ObxhQELKLA09qlzrS0Vg==", "dev": true, "dependencies": { - "@mdit-vue/types": "^2.0.0" + "@vuepress/helper": "2.0.0-rc.37", + "vue": "^3.4.29", + "watermark-js-plus": "^1.5.1" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.14" + } + }, + "node_modules/@vuepress/shared": { + "version": "2.0.0-rc.14", + "resolved": "https://registry.npmjs.org/@vuepress/shared/-/shared-2.0.0-rc.14.tgz", + "integrity": "sha512-VDDnPpz4x1Q07richcVRGbc4qc2RG/6bKoEYSImofTFzvdmHer538ouv8kD2SNU10UrSOpxxUiphnhlhNIe03A==", + "dependencies": { + "@mdit-vue/types": "^2.1.0" } }, "node_modules/@vuepress/utils": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@vuepress/utils/-/utils-2.0.0-rc.9.tgz", - "integrity": "sha512-qk6Pel4JVKYKxp3bWxyvnwchvx3QaCWc7SqUw7L6qUo/um+0U2U45L0anWoAfckw12RXYhoIEbJ9UZpueiKOPg==", - "dev": true, + "version": "2.0.0-rc.14", + "resolved": "https://registry.npmjs.org/@vuepress/utils/-/utils-2.0.0-rc.14.tgz", + "integrity": "sha512-1h/5qcKBeIhIg6SZM2IoZVOaIdFSeQ1CdEWadqQWy1uwupEeVrU3QPkjFyn0vUt0O/EuuVqQcLLC8OuS/wldNw==", "dependencies": { "@types/debug": "^4.1.12", "@types/fs-extra": "^11.0.4", "@types/hash-sum": "^1.0.2", - "@vuepress/shared": "2.0.0-rc.9", - "debug": "^4.3.4", + "@vuepress/shared": "2.0.0-rc.14", + "debug": "^4.3.5", "fs-extra": "^11.2.0", "globby": "^14.0.1", "hash-sum": "^2.0.0", "ora": "^8.0.1", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "upath": "^2.0.1" } }, "node_modules/@vueuse/core": { - "version": "10.9.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz", - "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", - "dev": true, + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.0.tgz", + "integrity": "sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==", "dependencies": { "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.9.0", - "@vueuse/shared": "10.9.0", - "vue-demi": ">=0.14.7" + "@vueuse/metadata": "10.11.0", + "@vueuse/shared": "10.11.0", + "vue-demi": ">=0.14.8" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", - "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", - "dev": true, + "version": "0.14.8", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", + "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", "hasInstallScript": true, "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", @@ -1446,31 +1940,28 @@ } }, "node_modules/@vueuse/metadata": { - "version": "10.9.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz", - "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==", - "dev": true, + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.0.tgz", + "integrity": "sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==", "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared": { - "version": "10.9.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz", - "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", - "dev": true, + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.0.tgz", + "integrity": "sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==", "dependencies": { - "vue-demi": ">=0.14.7" + "vue-demi": ">=0.14.8" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", - "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", - "dev": true, + "version": "0.14.8", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", + "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", "hasInstallScript": true, "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", @@ -1492,36 +1983,10 @@ } } }, - "node_modules/algoliasearch": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.3.tgz", - "integrity": "sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@algolia/cache-browser-local-storage": "4.23.3", - "@algolia/cache-common": "4.23.3", - "@algolia/cache-in-memory": "4.23.3", - "@algolia/client-account": "4.23.3", - "@algolia/client-analytics": "4.23.3", - "@algolia/client-common": "4.23.3", - "@algolia/client-personalization": "4.23.3", - "@algolia/client-search": "4.23.3", - "@algolia/logger-common": "4.23.3", - "@algolia/logger-console": "4.23.3", - "@algolia/recommend": "4.23.3", - "@algolia/requester-browser-xhr": "4.23.3", - "@algolia/requester-common": "4.23.3", - "@algolia/requester-node-http": "4.23.3", - "@algolia/transporter": "4.23.3" - } - }, "node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, "engines": { "node": ">=12" }, @@ -1548,7 +2013,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1567,7 +2031,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -1576,7 +2039,7 @@ "version": "10.4.19", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", - "dev": true, + "devOptional": true, "funding": [ { "type": "opencollective", @@ -1628,7 +2091,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, "engines": { "node": ">=8" }, @@ -1639,26 +2101,24 @@ "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "devOptional": true, "funding": [ { "type": "opencollective", @@ -1674,10 +2134,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.0.16" }, "bin": { "browserslist": "cli.js" @@ -1690,7 +2150,6 @@ "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, "engines": { "node": ">=8" } @@ -1705,10 +2164,10 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001610", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", - "integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==", - "dev": true, + "version": "1.0.30001638", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001638.tgz", + "integrity": "sha512-5SuJUJ7cZnhPpeLHaH0c/HPAnAHZvS6ElWyHK9GSIbVOQABLzowiI2pjmpvZ1WEbkyz46iFd4UXlOHR5SqgfMQ==", + "devOptional": true, "funding": [ { "type": "opencollective", @@ -1728,7 +2187,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -1736,11 +2194,30 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chart.js": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz", + "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, "node_modules/cheerio": { "version": "1.0.0-rc.12", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dev": true, "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", @@ -1761,7 +2238,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", @@ -1778,7 +2254,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -1802,173 +2277,625 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, "dependencies": { "restore-cursor": "^4.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "devOptional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/create-codepen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/create-codepen/-/create-codepen-2.0.0.tgz", + "integrity": "sha512-ehJ0Zw5RSV2G4+/azUb7vEZWRSA/K9cW7HDock1Y9ViDexkgSJUZJRcObdw/YAWeXKjreEQV9l/igNSsJ1yw5A==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/cytoscape": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.0.tgz", + "integrity": "sha512-l590mjTHT6/Cbxp13dGPC2Y7VXdgc+rUeF8AnF/JPzhjNevbDJfObnJgaSjlldOgBQZbue+X6IUZ7r5GAgvauQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" } }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dependencies": { + "internmap": "^1.0.0" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "d3-path": "1" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "dependencies": { - "ansi-regex": "^5.0.1" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", "dependencies": { - "color-name": "~1.1.4" + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "engines": { - "node": ">=0.8" + "node": ">=12" } }, - "node_modules/create-codepen": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/create-codepen/-/create-codepen-1.0.1.tgz", - "integrity": "sha512-XzSWwGCFNeOnNGp3KdCDGaKq4Cp1SvjzpPGQqO0tj1HT3BhksLdl/xQ2ZEY4+0MQ3m1I/K1Fvpm4GGMthtamyA==", - "dev": true + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "d3-array": "2 - 3" }, "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "d3-time": "1 - 3" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">=12" } }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "engines": { - "node": ">= 6" + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" } }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", + "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", + "dependencies": { + "d3": "^7.8.2", + "lodash-es": "^4.17.21" + } }, "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", - "dev": true + "version": "1.11.11", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", + "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dependencies": { "ms": "2.1.2" }, @@ -1990,6 +2917,42 @@ "node": ">=0.10.0" } }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dijkstrajs": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", @@ -2000,7 +2963,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -2014,7 +2976,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, "funding": [ { "type": "github", @@ -2026,7 +2987,6 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, "dependencies": { "domelementtype": "^2.3.0" }, @@ -2037,11 +2997,15 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/dompurify": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.5.tgz", + "integrity": "sha512-lwG+n5h8QNpxtyrJW/gJWckL+1/DQiYMX8f7t8Z2AZTPw1esVrqjI63i7Zc2Gz0aKzLVMYC1V1PL/ky+aY/NgA==" + }, "node_modules/domutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -2051,17 +3015,30 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/echarts": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.5.1.tgz", + "integrity": "sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.6.0" + } + }, "node_modules/electron-to-chromium": { - "version": "1.4.738", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.738.tgz", - "integrity": "sha512-lwKft2CLFztD+vEIpesrOtCrko/TFnEJlHFdRhazU7Y/jx5qc4cqsocfVrBg4So4gGe9lvxnbLIoev47WMpg+A==", - "dev": true + "version": "1.4.815", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.815.tgz", + "integrity": "sha512-OvpTT2ItpOXJL7IGcYakRjHCt8L5GrrN/wHCQsRB4PQa1X9fe+X9oen245mIId7s14xvArCGSTIq644yPUKKLg==", + "devOptional": true + }, + "node_modules/elkjs": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz", + "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==" }, "node_modules/emoji-regex": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" }, "node_modules/encode-utf8": { "version": "1.0.3", @@ -2073,7 +3050,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, "engines": { "node": ">=0.12" }, @@ -2082,10 +3058,9 @@ } }, "node_modules/envinfo": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.12.0.tgz", - "integrity": "sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg==", - "dev": true, + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", + "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", "bin": { "envinfo": "dist/cli.js" }, @@ -2094,10 +3069,9 @@ } }, "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -2106,36 +3080,36 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6" } @@ -2144,7 +3118,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -2156,54 +3129,44 @@ "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/eve-raphael": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eve-raphael/-/eve-raphael-0.5.0.tgz", + "integrity": "sha512-jrxnPsCGqng1UZuEp9DecX/AuSyAszATSjf4oEcRxvfxa1Oux4KkIPKBAAWWnpdwfARtr+Q0o9aPYWjsROD7ug==" }, "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.3.0.tgz", + "integrity": "sha512-l6JFbqnHEadBoVAVpN5dl2yCyfX28WoBAGaoQcNmLLSedOxTxcn2Qa83s8I/PA5i56vWru2OHOtrwF7Om2vqlg==", "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^7.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^5.2.0", + "pretty-ms": "^9.0.0", "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" }, "engines": { - "node": ">=16.17" + "node": "^18.19.0 || >=20.5.0" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/mimic-fn": { + "node_modules/execa/node_modules/@sindresorhus/merge-streams": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2213,7 +3176,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "engines": { "node": ">=14" }, @@ -2225,7 +3187,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, "dependencies": { "is-extendable": "^0.1.0" }, @@ -2237,7 +3198,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2253,7 +3213,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -2261,14 +3220,26 @@ "node_modules/fflate": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "dev": true + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2289,11 +3260,40 @@ "node": ">=8" } }, + "node_modules/flowchart": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/flowchart/-/flowchart-1.2.0.tgz", + "integrity": "sha512-n8gn08AzGwj/4aALo1DP5Xfb/Fr0BDrs6kn/z7zT2FvWzHSt8keDP1yN7NP1YGiDks9e5e/Q/gWHRGzC1JK0/w==", + "dependencies": { + "underscore": "^1.8.3" + }, + "bin": { + "flowchart": "index.js" + } + }, + "node_modules/flowchart.ts": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/flowchart.ts/-/flowchart.ts-3.0.0.tgz", + "integrity": "sha512-yD+0wVJHvV6SutpNpao5S0hQp+7tnPuETtPORIodGEuUAP8LzegVVSUy+NFDWU9pUO2F1E+PikBD83PddoCfnw==", + "dependencies": { + "@types/raphael": "^2.3.9", + "raphael": "^2.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^18.0.0 || >= 20" + } + }, + "node_modules/flowchart.ts/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, + "devOptional": true, "engines": { "node": "*" }, @@ -2306,7 +3306,6 @@ "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2316,6 +3315,19 @@ "node": ">=14.14" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2329,7 +3341,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", - "dev": true, "engines": { "node": ">=18" }, @@ -2338,12 +3349,15 @@ } }, "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2362,7 +3376,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -2371,10 +3384,9 @@ } }, "node_modules/globby": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", - "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", - "dev": true, + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.2", @@ -2393,14 +3405,12 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dev": true, "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", @@ -2414,14 +3424,12 @@ "node_modules/hash-sum": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", - "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", - "dev": true + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==" }, "node_modules/htmlparser2": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -2437,34 +3445,49 @@ } }, "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-7.0.0.tgz", + "integrity": "sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, "engines": { - "node": ">=16.17.0" + "node": ">=0.10.0" } }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, "engines": { "node": ">= 4" } }, "node_modules/immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", - "dev": true + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -2476,7 +3499,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2485,7 +3507,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2503,7 +3524,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -2515,7 +3535,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true, "engines": { "node": ">=12" }, @@ -2527,18 +3546,27 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2548,7 +3576,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", - "dev": true, "engines": { "node": ">=18" }, @@ -2559,14 +3586,12 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -2579,7 +3604,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -2587,20 +3611,52 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/katex": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.10.tgz", + "integrity": "sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" + }, "node_modules/lilconfig": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", - "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", - "dev": true, + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "devOptional": true, "engines": { "node": ">=14" }, @@ -2612,15 +3668,14 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, "dependencies": { "uc.micro": "^2.0.0" } }, "node_modules/lit": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.3.tgz", - "integrity": "sha512-l4slfspEsnCcHVRTvaP7YnkTZEZggNFywLEIhQaGhYDczG+tu/vlgm/KaWIEjIp+ZyV20r2JnZctMb8LeLCG7Q==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.4.tgz", + "integrity": "sha512-q6qKnKXHy2g1kjBaNfcoLlgbI3+aSOZ9Q4tiGa9bGYXq5RBXxkVTqTIVmP2VWMp29L4GyvCFm8ZQ2o56eUAMyA==", "dev": true, "dependencies": { "@lit/reactive-element": "^2.0.4", @@ -2629,9 +3684,9 @@ } }, "node_modules/lit-element": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.5.tgz", - "integrity": "sha512-iTWskWZEtn9SyEf4aBG6rKT8GABZMrTWop1+jopsEOgEcugcXJGKuX5bEbkq9qfzY+XB4MAgCaSPwnNpdsNQ3Q==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.6.tgz", + "integrity": "sha512-U4sdJ3CSQip7sLGZ/uJskO5hGiqtlpxndsLr6mt3IQIjheg93UKYeGQjWMRql1s/cXNOaRrCzC2FQwjIwSUqkg==", "dev": true, "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0", @@ -2640,9 +3695,9 @@ } }, "node_modules/lit-html": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.3.tgz", - "integrity": "sha512-FwIbqDD8O/8lM4vUZ4KvQZjPPNx7V1VhT7vmRB8RBAO0AU6wuTVdoXiu2CivVjEGdugvcbPNBLtPE1y0ifplHA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.4.tgz", + "integrity": "sha512-yKKO2uVv7zYFHlWMfZmqc+4hkmSbFp8jgjdZY9vvR9jr4J8fH6FUMXhr+ljfELgmjpvlF7Z1SJ5n5/Jeqtc9YA==", "dev": true, "dependencies": { "@types/trusted-types": "^2.0.2" @@ -2660,11 +3715,15 @@ "node": ">=8" } }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "node_modules/log-symbols": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "dev": true, "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" @@ -2680,7 +3739,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, "engines": { "node": ">=12" }, @@ -2688,23 +3746,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/magic-string": { "version": "0.30.10", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", - "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } @@ -2713,7 +3758,6 @@ "version": "14.1.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", @@ -2727,55 +3771,526 @@ } }, "node_modules/markdown-it-anchor": { - "version": "8.6.7", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", - "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", - "dev": true, + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-9.0.1.tgz", + "integrity": "sha512-cBt7aAzmkfX8X7FqAe8EBryiKmToXgMQEEMqkXzWCm0toDtfDYIGboKeTKd8cpNJArJtutrf+977wFJTsvNGmQ==", "peerDependencies": { "@types/markdown-it": "*", "markdown-it": "*" } }, - "node_modules/markdown-it-emoji": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-3.0.0.tgz", - "integrity": "sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==", - "dev": true - }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true + "node_modules/markdown-it-emoji": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-3.0.0.tgz", + "integrity": "sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==" + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.9.1.tgz", + "integrity": "sha512-Mx45Obds5W1UkW1nv/7dHRsbfMM1aOKA2+Pxs/IGHNonygDHwmng8xTHyS9z4KWVi0rbko8gjiBmuwwXQ7tiNA==", + "dependencies": { + "@braintree/sanitize-url": "^6.0.1", + "@types/d3-scale": "^4.0.3", + "@types/d3-scale-chromatic": "^3.0.0", + "cytoscape": "^3.28.1", + "cytoscape-cose-bilkent": "^4.1.0", + "d3": "^7.4.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.10", + "dayjs": "^1.11.7", + "dompurify": "^3.0.5", + "elkjs": "^0.9.0", + "katex": "^0.16.9", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "mdast-util-from-markdown": "^1.3.0", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.3", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" + } + }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } + "node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -2786,22 +4301,27 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", @@ -2819,13 +4339,17 @@ "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "devOptional": true + }, + "node_modules/non-layered-tidy-tree-layout": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2834,7 +4358,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -2843,7 +4367,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, "dependencies": { "path-key": "^4.0.0" }, @@ -2858,7 +4381,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, "engines": { "node": ">=12" }, @@ -2870,7 +4392,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, "dependencies": { "boolbase": "^1.0.0" }, @@ -2882,7 +4403,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -2897,7 +4417,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", - "dev": true, "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^4.0.0", @@ -2952,11 +4471,21 @@ "node": ">=6" } }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, "dependencies": { "entities": "^4.4.0" }, @@ -2968,7 +4497,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dev": true, "dependencies": { "domhandler": "^5.0.2", "parse5": "^7.0.0" @@ -2990,7 +4518,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -2999,7 +4526,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true, "engines": { "node": ">=12" }, @@ -3008,25 +4534,23 @@ } }, "node_modules/photoswipe": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/photoswipe/-/photoswipe-5.4.3.tgz", - "integrity": "sha512-9UC6oJBK4oXFZ5HcdlcvGkfEHsVrmE4csUdCQhEjHYb3PvPLO3PG7UhnPuOgjxwmhq5s17Un5NUdum01LgBDng==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/photoswipe/-/photoswipe-5.4.4.tgz", + "integrity": "sha512-WNFHoKrkZNnvFFhbHL93WDkW3ifwVOXSW3w1UuZZelSmgXpIGiZSNlZJq37rR8YejqME2rHs9EhH9ZvlvFH2NA==", "dev": true, "engines": { "node": ">= 0.12.0" } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -3044,10 +4568,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", - "dev": true, + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "funding": [ { "type": "opencollective", @@ -3064,7 +4587,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -3072,10 +4595,10 @@ } }, "node_modules/postcss-load-config": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.0.3.tgz", - "integrity": "sha512-90pBBI5apUVruIEdCxZic93Wm+i9fTrp7TXbgdUCH+/L+2WnfpITSpq5dFU/IPvbv7aNiMlQISpUkAm3fEcvgQ==", - "dev": true, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "devOptional": true, "funding": [ { "type": "opencollective", @@ -3087,15 +4610,16 @@ } ], "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" + "lilconfig": "^3.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { "jiti": ">=1.21.0", - "postcss": ">=8.0.9" + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "jiti": { @@ -3103,6 +4627,12 @@ }, "postcss": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, @@ -3110,34 +4640,26 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/preact": { - "version": "10.20.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.20.2.tgz", - "integrity": "sha512-S1d1ernz3KQ+Y2awUxKakpfOg2CEmJmwOP+6igPx6dgr6pgDvenqYviyokWso2rhHvGtTlWWnJDa7RaPbQerTg==", - "dev": true, - "optional": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } + "devOptional": true }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", - "dev": true, + "node_modules/pretty-ms": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.0.0.tgz", + "integrity": "sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==", + "dependencies": { + "parse-ms": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/punycode.js": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, "engines": { "node": ">=6" } @@ -3164,7 +4686,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -3180,11 +4701,18 @@ } ] }, + "node_modules/raphael": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/raphael/-/raphael-2.3.0.tgz", + "integrity": "sha512-w2yIenZAQnp257XUWGni4bLMVxpUpcIl7qgxEgDIXtmSypYtlNxfXWpOBxs7LBTps5sDwhRnrToJrMUrivqNTQ==", + "dependencies": { + "eve-raphael": "0.5.0" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -3211,7 +4739,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -3227,17 +4754,21 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, "node_modules/rollup": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.3.tgz", - "integrity": "sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==", - "dev": true, + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "devOptional": true, "dependencies": { "@types/estree": "1.0.5" }, @@ -3249,22 +4780,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.14.3", - "@rollup/rollup-android-arm64": "4.14.3", - "@rollup/rollup-darwin-arm64": "4.14.3", - "@rollup/rollup-darwin-x64": "4.14.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.14.3", - "@rollup/rollup-linux-arm-musleabihf": "4.14.3", - "@rollup/rollup-linux-arm64-gnu": "4.14.3", - "@rollup/rollup-linux-arm64-musl": "4.14.3", - "@rollup/rollup-linux-powerpc64le-gnu": "4.14.3", - "@rollup/rollup-linux-riscv64-gnu": "4.14.3", - "@rollup/rollup-linux-s390x-gnu": "4.14.3", - "@rollup/rollup-linux-x64-gnu": "4.14.3", - "@rollup/rollup-linux-x64-musl": "4.14.3", - "@rollup/rollup-win32-arm64-msvc": "4.14.3", - "@rollup/rollup-win32-ia32-msvc": "4.14.3", - "@rollup/rollup-win32-x64-msvc": "4.14.3", + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", "fsevents": "~2.3.2" } }, @@ -3272,7 +4803,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -3291,11 +4821,31 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/sass": { - "version": "1.75.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.75.0.tgz", - "integrity": "sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==", - "dev": true, + "version": "1.77.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", + "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -3309,24 +4859,15 @@ } }, "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "dev": true }, - "node_modules/search-insights": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", - "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dev": true, "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" @@ -3336,13 +4877,9 @@ } }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -3360,7 +4897,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3372,21 +4908,28 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/shiki": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.0.tgz", + "integrity": "sha512-YD2sXQ+TMD/F9BimV9Jn0wj35pqOvywvOG/3PB6hGHyGKlM7TJ9tyJ02jOb2kF8F0HfJwKNYrh3sW7jEcuRlXA==", + "dev": true, + "dependencies": { + "@shikijs/core": "1.10.0" + } + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sitemap": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", - "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.0.tgz", + "integrity": "sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==", "dev": true, "dependencies": { "@types/node": "^17.0.5", @@ -3398,8 +4941,8 @@ "sitemap": "dist/cli.js" }, "engines": { - "node": ">=12.0.0", - "npm": ">=5.6.0" + "node": ">=14.0.0", + "npm": ">=6.0.0" } }, "node_modules/sitemap/node_modules/@types/node": { @@ -3412,7 +4955,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, "engines": { "node": ">=14.16" }, @@ -3424,7 +4966,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/slimsearch/-/slimsearch-2.1.1.tgz", "integrity": "sha512-l1utJWal8F/RIheYk88DE2+enI12nIrn5SHt4ih/CNAH81PzkTv2GVBODlLynDJb7xan5hjd8XTL5f0L4cxLQA==", - "dev": true, "engines": { "node": ">=18.18.0" } @@ -3433,7 +4974,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3441,14 +4981,12 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/stdin-discarder": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "dev": true, "engines": { "node": ">=18" }, @@ -3460,7 +4998,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", - "dev": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -3477,7 +5014,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3492,28 +5028,30 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -3521,31 +5059,38 @@ "node": ">=8.0" } }, - "node_modules/ts-debounce": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ts-debounce/-/ts-debounce-4.0.0.tgz", - "integrity": "sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==", - "dev": true, - "optional": true, - "peer": true + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicorn-magic": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, "engines": { "node": ">=18" }, @@ -3553,11 +5098,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, "engines": { "node": ">= 10.0.0" } @@ -3566,17 +5122,16 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "dev": true, "engines": { "node": ">=4", "yarn": "*" } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "devOptional": true, "funding": [ { "type": "opencollective", @@ -3592,8 +5147,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -3602,13 +5157,42 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/vite": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.9.tgz", - "integrity": "sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==", - "dev": true, + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz", + "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==", + "devOptional": true, "dependencies": { - "esbuild": "^0.20.1", + "esbuild": "^0.21.3", "postcss": "^8.4.38", "rollup": "^4.13.0" }, @@ -3658,16 +5242,15 @@ } }, "node_modules/vue": { - "version": "3.4.23", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.23.tgz", - "integrity": "sha512-X1y6yyGJ28LMUBJ0k/qIeKHstGd+BlWQEOT40x3auJFTmpIhpbKLgN7EFsqalnJXq1Km5ybDEsp6BhuWKciUDg==", - "dev": true, + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.31.tgz", + "integrity": "sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==", "dependencies": { - "@vue/compiler-dom": "3.4.23", - "@vue/compiler-sfc": "3.4.23", - "@vue/runtime-dom": "3.4.23", - "@vue/server-renderer": "3.4.23", - "@vue/shared": "3.4.23" + "@vue/compiler-dom": "3.4.31", + "@vue/compiler-sfc": "3.4.31", + "@vue/runtime-dom": "3.4.31", + "@vue/server-renderer": "3.4.31", + "@vue/shared": "3.4.31" }, "peerDependencies": { "typescript": "*" @@ -3679,10 +5262,9 @@ } }, "node_modules/vue-router": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.1.tgz", - "integrity": "sha512-D0h3oyP6vp28BOvxv2hVpiqFTjTJizCf1BuMmCibc8UW0Ll/N80SWqDd/hqPMaZfzW1j+s2s+aTRyBIP9ElzOw==", - "dev": true, + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.0.tgz", + "integrity": "sha512-HB+t2p611aIZraV2aPSRNXf0Z/oLZFrlygJm+sZbdJaW6lcFqEDQwnzUBXn+DApw+/QzDU/I9TeWx9izEjTmsA==", "dependencies": { "@vue/devtools-api": "^6.5.1" }, @@ -3694,18 +5276,17 @@ } }, "node_modules/vuepress": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-2.0.0-rc.9.tgz", - "integrity": "sha512-jT1ln2lawdph+vVI6n2JfEUhQIcyc1RQWDdQu9DffhJGywJunFcumnUJudpqd1SNIES2Fz1hVCD6gdrE/rVKOQ==", - "dev": true, - "dependencies": { - "@vuepress/cli": "2.0.0-rc.9", - "@vuepress/client": "2.0.0-rc.9", - "@vuepress/core": "2.0.0-rc.9", - "@vuepress/markdown": "2.0.0-rc.9", - "@vuepress/shared": "2.0.0-rc.9", - "@vuepress/utils": "2.0.0-rc.9", - "vue": "^3.4.21" + "version": "2.0.0-rc.14", + "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-2.0.0-rc.14.tgz", + "integrity": "sha512-t902FYKFF2MavNQjm/I4gN8etl6iX4PETutu4c1Pt7qQjXF6Hp2eurZaW32O5/TaYWsbVG757FwKodRLj9GDng==", + "dependencies": { + "@vuepress/cli": "2.0.0-rc.14", + "@vuepress/client": "2.0.0-rc.14", + "@vuepress/core": "2.0.0-rc.14", + "@vuepress/markdown": "2.0.0-rc.14", + "@vuepress/shared": "2.0.0-rc.14", + "@vuepress/utils": "2.0.0-rc.14", + "vue": "^3.4.29" }, "bin": { "vuepress": "bin/vuepress.js", @@ -3716,8 +5297,8 @@ "node": ">=18.16.0" }, "peerDependencies": { - "@vuepress/bundler-vite": "2.0.0-rc.9", - "@vuepress/bundler-webpack": "2.0.0-rc.9", + "@vuepress/bundler-vite": "2.0.0-rc.14", + "@vuepress/bundler-webpack": "2.0.0-rc.14", "vue": "^3.4.0" }, "peerDependenciesMeta": { @@ -3730,23 +5311,23 @@ } }, "node_modules/vuepress-plugin-components": { - "version": "2.0.0-rc.36", - "resolved": "https://registry.npmjs.org/vuepress-plugin-components/-/vuepress-plugin-components-2.0.0-rc.36.tgz", - "integrity": "sha512-JMIj+1VA+euB4TvmeUt0Fdm4inpAndzLgasadUd/C8j4Jj/99PtoTzBLR7Gxk6LaIYaR9IUsOTKPi3wnS0EOdg==", + "version": "2.0.0-rc.50", + "resolved": "https://registry.npmjs.org/vuepress-plugin-components/-/vuepress-plugin-components-2.0.0-rc.50.tgz", + "integrity": "sha512-xwMgvrsUnjJe9grUAf69IwMlfThPz0lJsx12zXUecN1I17uSbZN6Bh/2POIVm5LTxfRGMgLrQM69DwualGCH/Q==", "dev": true, "dependencies": { - "@stackblitz/sdk": "^1.9.0", - "@vuepress/helper": "2.0.0-rc.24", - "@vueuse/core": "^10.9.0", + "@stackblitz/sdk": "^1.10.0", + "@vuepress/helper": "2.0.0-rc.37", + "@vuepress/plugin-sass-palette": "2.0.0-rc.37", + "@vueuse/core": "^10.11.0", "balloon-css": "^1.2.0", - "create-codepen": "1.0.1", + "create-codepen": "^2.0.0", "qrcode": "^1.5.3", - "vue": "^3.4.21", - "vuepress-plugin-sass-palette": "2.0.0-rc.36", - "vuepress-shared": "2.0.0-rc.36" + "vue": "^3.4.29", + "vuepress-shared": "2.0.0-rc.50" }, "engines": { - "node": ">=18.16.0", + "node": ">=18.19.0", "npm": ">=8", "pnpm": ">=7", "yarn": ">=2" @@ -3757,8 +5338,8 @@ "hls.js": "^1.4.12", "mpegts.js": "^1.7.3", "sass-loader": "^14.0.0", - "vidstack": "^1.11.11", - "vuepress": "2.0.0-rc.9" + "vidstack": "^1.11.21", + "vuepress": "2.0.0-rc.14" }, "peerDependenciesMeta": { "artplayer": { @@ -3782,43 +5363,45 @@ } }, "node_modules/vuepress-plugin-md-enhance": { - "version": "2.0.0-rc.36", - "resolved": "https://registry.npmjs.org/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-rc.36.tgz", - "integrity": "sha512-FvQ4foaqsE13WEXN2TaBqtSEN3tKnkkuDX7daLbNPQ1z0ghaMgcCDJ+ehEwwcNgXSs1vlbTRYL/Tf4M4RC1nfA==", - "dev": true, - "dependencies": { - "@mdit/plugin-alert": "^0.8.0", - "@mdit/plugin-align": "^0.8.0", - "@mdit/plugin-attrs": "^0.8.0", - "@mdit/plugin-container": "^0.8.0", - "@mdit/plugin-demo": "^0.8.0", - "@mdit/plugin-figure": "^0.8.0", - "@mdit/plugin-footnote": "^0.8.0", - "@mdit/plugin-img-lazyload": "^0.8.0", - "@mdit/plugin-img-mark": "^0.8.0", - "@mdit/plugin-img-size": "^0.8.0", - "@mdit/plugin-include": "^0.8.0", - "@mdit/plugin-katex": "^0.8.0", - "@mdit/plugin-mark": "^0.8.0", - "@mdit/plugin-mathjax": "^0.8.0", - "@mdit/plugin-stylize": "^0.8.0", - "@mdit/plugin-sub": "^0.8.0", - "@mdit/plugin-sup": "^0.8.0", - "@mdit/plugin-tab": "^0.8.0", - "@mdit/plugin-tasklist": "^0.8.0", - "@mdit/plugin-tex": "^0.8.0", - "@mdit/plugin-uml": "^0.8.0", - "@types/markdown-it": "^14.0.0", - "@vuepress/helper": "2.0.0-rc.24", - "@vueuse/core": "^10.9.0", + "version": "2.0.0-rc.50", + "resolved": "https://registry.npmjs.org/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-rc.50.tgz", + "integrity": "sha512-1t570DCGDDWvc5+aPf1ERK6ZIvwY1hGKN4KOdFz7zgGzP2EFZXwwW8wioyVgKVfbjTgT2dvkyNbxykRQV6eKEA==", + "dev": true, + "dependencies": { + "@mdit/plugin-alert": "^0.12.0", + "@mdit/plugin-align": "^0.12.0", + "@mdit/plugin-attrs": "^0.12.0", + "@mdit/plugin-container": "^0.12.0", + "@mdit/plugin-demo": "^0.12.0", + "@mdit/plugin-figure": "^0.12.0", + "@mdit/plugin-footnote": "^0.12.0", + "@mdit/plugin-img-lazyload": "^0.12.0", + "@mdit/plugin-img-mark": "^0.12.0", + "@mdit/plugin-img-size": "^0.12.0", + "@mdit/plugin-include": "^0.12.0", + "@mdit/plugin-katex-slim": "^0.12.0", + "@mdit/plugin-mark": "^0.12.0", + "@mdit/plugin-mathjax-slim": "^0.12.0", + "@mdit/plugin-plantuml": "^0.12.0", + "@mdit/plugin-spoiler": "^0.12.0", + "@mdit/plugin-stylize": "^0.12.0", + "@mdit/plugin-sub": "^0.12.0", + "@mdit/plugin-sup": "^0.12.0", + "@mdit/plugin-tab": "^0.12.0", + "@mdit/plugin-tasklist": "^0.12.0", + "@mdit/plugin-tex": "^0.12.0", + "@mdit/plugin-uml": "^0.12.0", + "@types/markdown-it": "^14.1.1", + "@vuepress/helper": "2.0.0-rc.37", + "@vuepress/plugin-sass-palette": "2.0.0-rc.37", + "@vueuse/core": "^10.11.0", "balloon-css": "^1.2.0", "js-yaml": "^4.1.0", - "vue": "^3.4.21", - "vuepress-plugin-sass-palette": "2.0.0-rc.36", - "vuepress-shared": "2.0.0-rc.36" + "vue": "^3.4.29", + "vuepress-shared": "2.0.0-rc.50" }, "engines": { - "node": ">=18.16.0", + "node": ">=18.19.0", "npm": ">=8", "pnpm": ">=7", "yarn": ">=2" @@ -3831,15 +5414,15 @@ "flowchart.ts": "^2.0.0 || ^3.0.0", "katex": "^0.16.0", "kotlin-playground": "^1.23.0", - "markmap-lib": "^0.15.5 || ^0.16.0", - "markmap-toolbar": "^0.15.5 || ^0.16.0", - "markmap-view": "^0.15.5 || ^0.16.0", + "markmap-lib": "^0.17.0", + "markmap-toolbar": "^0.17.0", + "markmap-view": "^0.17.0", "mathjax-full": "^3.2.2", "mermaid": "^10.8.0", "reveal.js": "^5.0.0", "sandpack-vue3": "^3.0.0", "sass-loader": "^14.0.0", - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" }, "peerDependenciesMeta": { "@types/reveal.js": { @@ -3889,16 +5472,6 @@ } } }, - "node_modules/vuepress-plugin-md-enhance/node_modules/@types/markdown-it": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.0.1.tgz", - "integrity": "sha512-6WfOG3jXR78DW8L5cTYCVVGAsIFZskRHCDo5tbqa+qtKVt4oDRVH7hyIWu1SpDQJlmIoEivNQZ5h+AGAOrgOtQ==", - "dev": true, - "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, "node_modules/vuepress-plugin-md-enhance/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -3917,57 +5490,29 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/vuepress-plugin-sass-palette": { - "version": "2.0.0-rc.36", - "resolved": "https://registry.npmjs.org/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-rc.36.tgz", - "integrity": "sha512-kOfZHGZxfplVq/z7QtHmsrKfOlR6/s37QA/DilIYGFzj8XVL8h1eJ0ty7J1ySTZFVvDkK7r3TVVQZ2sPIEjbYQ==", - "dev": true, - "dependencies": { - "@vuepress/helper": "2.0.0-rc.24", - "chokidar": "^3.6.0", - "sass": "^1.74.1", - "vuepress-shared": "2.0.0-rc.36" - }, - "engines": { - "node": ">=18.16.0", - "npm": ">=8", - "pnpm": ">=7", - "yarn": ">=2" - }, - "peerDependencies": { - "sass-loader": "^14.0.0", - "vuepress": "2.0.0-rc.9" - }, - "peerDependenciesMeta": { - "sass-loader": { - "optional": true - } - } - }, "node_modules/vuepress-plugin-search-pro": { - "version": "2.0.0-rc.36", - "resolved": "https://registry.npmjs.org/vuepress-plugin-search-pro/-/vuepress-plugin-search-pro-2.0.0-rc.36.tgz", - "integrity": "sha512-xumvvm0/V7WrWJXMs6ZVqFjjN6h4oIEm6YrBpeteBpbG2iUkuF9E2xhVPwhrV/dYzCSkKpR7bA31qp1CngWknA==", - "dev": true, + "version": "2.0.0-rc.50", + "resolved": "https://registry.npmjs.org/vuepress-plugin-search-pro/-/vuepress-plugin-search-pro-2.0.0-rc.50.tgz", + "integrity": "sha512-MhzFjPVfuDed52d9eCEGtADw7zW+JbjYOzoNcGCUqyRazhefZC32oTitcGWdzvhzXbKOu8QeuQX+ZhiQSkDEfw==", "dependencies": { - "@vuepress/helper": "2.0.0-rc.24", - "@vueuse/core": "^10.9.0", + "@vuepress/helper": "2.0.0-rc.37", + "@vuepress/plugin-sass-palette": "2.0.0-rc.37", + "@vueuse/core": "^10.11.0", "cheerio": "1.0.0-rc.12", "chokidar": "^3.6.0", "slimsearch": "^2.1.1", - "vue": "^3.4.21", - "vuepress-plugin-sass-palette": "2.0.0-rc.36", - "vuepress-shared": "2.0.0-rc.36" + "vue": "^3.4.29", + "vuepress-shared": "2.0.0-rc.50" }, "engines": { - "node": ">=18.16.0", + "node": ">=18.19.0", "npm": ">=8", "pnpm": ">=7", "yarn": ">=2" }, "peerDependencies": { "sass-loader": "^14.0.0", - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" }, "peerDependenciesMeta": { "sass-loader": { @@ -3976,84 +5521,85 @@ } }, "node_modules/vuepress-shared": { - "version": "2.0.0-rc.36", - "resolved": "https://registry.npmjs.org/vuepress-shared/-/vuepress-shared-2.0.0-rc.36.tgz", - "integrity": "sha512-a4XLodJk5U8qeon7jNqsyLGNUgOAdVr8YBZD7E9BGiu84+S3P6e5SCJLCLQ17v37jwdLoYwT2Fv67k586GAx7w==", - "dev": true, + "version": "2.0.0-rc.50", + "resolved": "https://registry.npmjs.org/vuepress-shared/-/vuepress-shared-2.0.0-rc.50.tgz", + "integrity": "sha512-iOf4r4LpdXVvFJb2Zh1rmXJW8lrq3ZyJv0bTKGun4yhBKE9sW5ZAt9rT/eVEFMDPLJLFYBfRmF4MZ9c4x8BL6A==", "dependencies": { - "@vuepress/helper": "2.0.0-rc.24", - "@vueuse/core": "^10.9.0", + "@vuepress/helper": "2.0.0-rc.37", + "@vueuse/core": "^10.11.0", "cheerio": "1.0.0-rc.12", - "dayjs": "^1.11.10", - "execa": "^8.0.1", + "dayjs": "^1.11.11", + "execa": "^9.2.0", "fflate": "^0.8.2", "gray-matter": "^4.0.3", - "semver": "^7.6.0", - "vue": "^3.4.21" + "semver": "^7.6.2", + "vue": "^3.4.29" }, "engines": { - "node": ">=18.16.0", + "node": ">=18.19.0", "npm": ">=8", "pnpm": ">=7", "yarn": ">=2" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.14" } }, "node_modules/vuepress-theme-hope": { - "version": "2.0.0-rc.36", - "resolved": "https://registry.npmjs.org/vuepress-theme-hope/-/vuepress-theme-hope-2.0.0-rc.36.tgz", - "integrity": "sha512-kMCmlwPw4S0P0LYnAulaT98L3Z2jD+A4bgQ93rfuCVxmfCJEUs99V6ms9iu/GZ8CqJC10anDqwfJ+SjHCs0V8g==", - "dev": true, - "dependencies": { - "@vuepress/helper": "2.0.0-rc.24", - "@vuepress/plugin-active-header-links": "2.0.0-rc.21", - "@vuepress/plugin-back-to-top": "2.0.0-rc.24", - "@vuepress/plugin-blog": "2.0.0-rc.24", - "@vuepress/plugin-catalog": "2.0.0-rc.24", - "@vuepress/plugin-comment": "2.0.0-rc.24", - "@vuepress/plugin-copy-code": "2.0.0-rc.24", - "@vuepress/plugin-copyright": "2.0.0-rc.24", - "@vuepress/plugin-external-link-icon": "2.0.0-rc.24", - "@vuepress/plugin-git": "2.0.0-rc.22", - "@vuepress/plugin-links-check": "2.0.0-rc.24", - "@vuepress/plugin-nprogress": "2.0.0-rc.21", - "@vuepress/plugin-photo-swipe": "2.0.0-rc.24", - "@vuepress/plugin-prismjs": "2.0.0-rc.21", - "@vuepress/plugin-reading-time": "2.0.0-rc.24", - "@vuepress/plugin-rtl": "2.0.0-rc.21", - "@vuepress/plugin-seo": "2.0.0-rc.24", - "@vuepress/plugin-sitemap": "2.0.0-rc.24", - "@vuepress/plugin-theme-data": "2.0.0-rc.21", - "@vueuse/core": "^10.9.0", + "version": "2.0.0-rc.50", + "resolved": "https://registry.npmjs.org/vuepress-theme-hope/-/vuepress-theme-hope-2.0.0-rc.50.tgz", + "integrity": "sha512-Bgf9JQC/ae+wZ0TJz6LuH9772NJhvaytP705aeNRnLDnlML0yW7laIod67wCsaF3KzCRnOuZ86VvQGNMojo3Bw==", + "dev": true, + "dependencies": { + "@vuepress/helper": "2.0.0-rc.37", + "@vuepress/plugin-active-header-links": "2.0.0-rc.37", + "@vuepress/plugin-back-to-top": "2.0.0-rc.37", + "@vuepress/plugin-blog": "2.0.0-rc.37", + "@vuepress/plugin-catalog": "2.0.0-rc.37", + "@vuepress/plugin-comment": "2.0.0-rc.37", + "@vuepress/plugin-copy-code": "2.0.0-rc.37", + "@vuepress/plugin-copyright": "2.0.0-rc.37", + "@vuepress/plugin-git": "2.0.0-rc.37", + "@vuepress/plugin-links-check": "2.0.0-rc.37", + "@vuepress/plugin-notice": "2.0.0-rc.37", + "@vuepress/plugin-nprogress": "2.0.0-rc.37", + "@vuepress/plugin-photo-swipe": "2.0.0-rc.37", + "@vuepress/plugin-reading-time": "2.0.0-rc.37", + "@vuepress/plugin-rtl": "2.0.0-rc.37", + "@vuepress/plugin-sass-palette": "2.0.0-rc.37", + "@vuepress/plugin-seo": "2.0.0-rc.37", + "@vuepress/plugin-shiki": "2.0.0-rc.37", + "@vuepress/plugin-sitemap": "2.0.0-rc.37", + "@vuepress/plugin-theme-data": "2.0.0-rc.37", + "@vuepress/plugin-watermark": "2.0.0-rc.37", + "@vueuse/core": "^10.11.0", "balloon-css": "^1.2.0", "bcrypt-ts": "^5.0.2", "cheerio": "1.0.0-rc.12", "chokidar": "^3.6.0", "gray-matter": "^4.0.3", - "vue": "^3.4.21", - "vuepress-plugin-components": "2.0.0-rc.36", - "vuepress-plugin-md-enhance": "2.0.0-rc.36", - "vuepress-plugin-sass-palette": "2.0.0-rc.36", - "vuepress-shared": "2.0.0-rc.36" + "vue": "^3.4.29", + "vuepress-plugin-components": "2.0.0-rc.50", + "vuepress-plugin-md-enhance": "2.0.0-rc.50", + "vuepress-shared": "2.0.0-rc.50" }, "engines": { - "node": ">=18.16.0", + "node": ">=18.19.0", "npm": ">=8", "pnpm": ">=7", "yarn": ">=2" }, "peerDependencies": { - "@vuepress/plugin-docsearch": "2.0.0-rc.24", - "@vuepress/plugin-feed": "2.0.0-rc.24", - "@vuepress/plugin-pwa": "2.0.0-rc.24", - "@vuepress/plugin-redirect": "2.0.0-rc.24", - "@vuepress/plugin-search": "2.0.0-rc.24", + "@vuepress/plugin-docsearch": "2.0.0-rc.37", + "@vuepress/plugin-feed": "2.0.0-rc.37", + "@vuepress/plugin-prismjs": "2.0.0-rc.37", + "@vuepress/plugin-pwa": "2.0.0-rc.37", + "@vuepress/plugin-redirect": "2.0.0-rc.37", + "@vuepress/plugin-search": "2.0.0-rc.37", "nodejs-jieba": "^0.1.2", "sass-loader": "^14.0.0", - "vuepress": "2.0.0-rc.9", - "vuepress-plugin-search-pro": "2.0.0-rc.36" + "vuepress": "2.0.0-rc.14", + "vuepress-plugin-search-pro": "2.0.0-rc.50" }, "peerDependenciesMeta": { "@vuepress/plugin-docsearch": { @@ -4062,6 +5608,9 @@ "@vuepress/plugin-feed": { "optional": true }, + "@vuepress/plugin-prismjs": { + "optional": true + }, "@vuepress/plugin-pwa": { "optional": true }, @@ -4082,11 +5631,24 @@ } } }, + "node_modules/watermark-js-plus": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/watermark-js-plus/-/watermark-js-plus-1.5.1.tgz", + "integrity": "sha512-fj82XgrJkqP0a7kcG6U591YT6E0GFq9zdUrqbijbkE9l8aHhOpOogQwk5jaoTaWVqQsBSNFRIc6QWRkHBfHNsA==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/web-worker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", + "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -4164,24 +5726,6 @@ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", @@ -4257,6 +5801,25 @@ "engines": { "node": ">=8" } + }, + "node_modules/yoctocolors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.0.tgz", + "integrity": "sha512-FsQpXXeOEe05tcJN4Z2eicuC6+6KiJdBbPOAChanSkwwjZ277XGsh8wh/HaPuGeifTiw/7dgAzabitu2bnDvRg==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zrender": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.0.tgz", + "integrity": "sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==", + "dependencies": { + "tslib": "2.3.0" + } } } } diff --git a/package.json b/package.json index b9519f07..77a21b83 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,19 @@ "docs:update-package": "npx vp-update" }, "devDependencies": { - "@vuepress/bundler-vite": "2.0.0-rc.9", - "vue": "^3.4.23", - "vuepress": "2.0.0-rc.9", - "vuepress-plugin-search-pro": "^2.0.0-rc.39", - "vuepress-theme-hope": "2.0.0-rc.40" + "@vuepress/bundler-vite": "2.0.0-rc.14", + "@vuepress/plugin-search": "^2.0.0-rc.37", + "vue": "^3.4.27", + "vuepress": "2.0.0-rc.14", + "vuepress-theme-hope": "2.0.0-rc.50" + }, + "dependencies": { + "chart.js": "^4.4.3", + "echarts": "^5.5.1", + "flowchart": "^1.2.0", + "flowchart.ts": "^3.0.0", + "katex": "^0.16.10", + "mermaid": "^10.9.1", + "vuepress-plugin-search-pro": "^2.0.0-rc.50" } } From 081f881ecf6c37d4e4fd3d228d96561d5c2530fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Tue, 2 Jul 2024 21:01:15 +0800 Subject: [PATCH 09/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9B=B4=E6=96=B0=20as?= =?UTF-8?q?ync=20=E6=BA=90=E7=A0=81=E8=A7=A3=E6=9E=90=E7=9A=84=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=8E=AA=E8=BE=9E=20#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ture\346\272\220\347\240\201\350\247\243\346\236\220.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" index 3a1eb5c3..b5edc97d 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -231,7 +231,7 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> - **异常指针**:用于存储异步任务中可能发生的异常,以便在调用 `future::get` 时能够重新抛出异常。 - **互斥量和条件变量**:用于在异步任务和等待任务之间进行同步。当异步任务完成时,条件变量会通知等待的任务。 - `_Associated_state` 模板类负责管理异步任务的状态,包括结果的存储、异常的处理以及任务完成的通知。它是实现 `std::future` 和 `std::promise` 的核心组件之一,通过 `_State_manager` 和 `_Promise` 类模板对其进行封装和管理,提供更高级别的接口和功能。 + **`_Associated_state` 模板类负责管理异步任务的状态,包括结果的存储、异常的处理以及任务完成的通知。它是实现 `std::future` 和 `std::promise` 的核心组件之一**,通过 `_State_manager` 和 `_Promise` 类模板对其进行封装和管理,提供更高级别的接口和功能。 ```plaintext +---------------------+ @@ -269,4 +269,6 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> } ``` - 在 MSVC STL 的实现中,`launch::async | launch::deferred` 与 `launch::async` 执行策略**毫无区别**。这段代码的 `switch` 语句有两个 `case` 和一个 `default`,如你所见,`case launch::async` 是为空的,除了 `launch::deferred` 最终都会进入 `default`,即都执行 `launch::async` 策略。 + `_Get_associated_state` 函数返回一个 `_Associated_state` 指针,该指针指向一个新的 `_Deferred_async_state` 或 `_Task_async_state` 对象。这两个类分别对应于异步任务的两种不同执行策略:**延迟执行**和**异步执行**。 + + > 这也就是证明了在 MSVC STL 的实现中,`launch::async | launch::deferred` 与 `launch::async` 执行策略**毫无区别**。这段代码的 `switch` 语句有两个 `case` 和一个 `default`,如你所见,`case launch::async` 是为空的,除了 `launch::deferred` 最终都会进入 `default`,即都执行 `launch::async` 策略。 From b632820e2d340f173752584556be0eb3dffadb30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Fri, 5 Jul 2024 19:36:35 +0800 Subject: [PATCH 10/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=80=E7=82=B9?= =?UTF-8?q?=E7=AC=AC=E5=9B=9B=E7=AB=A0=E7=AC=94=E8=AF=AF=E4=B8=8E=E6=8E=AA?= =?UTF-8?q?=E8=BE=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" index 1bcd6ece..02bc215e 100644 --- "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" +++ "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" @@ -294,7 +294,7 @@ C++ 标准库将这种事件称为 [future](https://zh.cppreference.com/w/cpp/t C++ 标准库有两种 future,都声明在 [``](https://zh.cppreference.com/w/cpp/header/future) 头文件中:独占的 [`std::future`](https://zh.cppreference.com/w/cpp/thread/future) 、共享的 [`std::shared_future`](https://zh.cppreference.com/w/cpp/thread/shared_future)。它们的区别与 `std::unique_ptr` 和 `std::shared_ptr` 类似。`std::future` 只能与**单个**指定事件关联,而 `std::shared_future` 能关联**多个**事件。它们都是模板,它们的模板类型参数,就是其关联的事件(函数)的返回类型。当多个线程需要访问一个独立 future 对象时, 必须使用互斥量或类似同步机制进行保护。而多个线程访问同一共享状态,若每个线程都是通过其自身的 `shared_future` 对象副本进行访问,则是安全的。 -最简单的作用是,我们先前讲的 `std::thread` 执行任务是没有返回值的,这个问题就能使用 future 解决。 +最简单有效的使用是,我们先前讲的 `std::thread` 在线程中执行任务是没有返回值的,这个问题就能使用 future 解决。 ### 创建异步任务获取返回值 @@ -1470,7 +1470,7 @@ int main(){ - 并发调用`barrier` 除了析构函数外的成员函数不会引起数据竞争。 -另外你可能注意到我们使用了 [`std::osyncstream`](https://zh.cppreference.com/w/cpp/io/basic_osyncstream) ,它是 C++20 引入的,此处是确保输出流在多线程环境中同步,**免除数据竞争,而且将不以任何方式穿插或截断**。 +另外你可能注意到我们使用了 [`std::osyncstream`](https://zh.cppreference.com/w/cpp/io/basic_osyncstream) ,它是 C++20 引入的,此处是确保输出流在多线程环境中同步,**避免除数据竞争,而且将不以任何方式穿插或截断**。 > 虽然 `std::cout` 的 `operator<<` 调用是线程安全的,不会被打断,但多个 `operator<<` 的调用在多线程环境中可能会**交错**,导致输出结果混乱,使用 `std::osyncstream` 就可以解决这个问题。开发者可以尝试去除 `std::osyncstream` 直接使用 `std::cout`,效果会非常明显。 From a8bd60e2f3585215180d3df65344e3ec34dedf6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sat, 6 Jul 2024 09:30:11 +0800 Subject: [PATCH 11/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20C++20=20=E5=B1=8F?= =?UTF-8?q?=E9=9A=9C=20std::barrier=20=E7=9A=84=E7=AC=AC=E4=BA=8C=E4=B8=AA?= =?UTF-8?q?=E7=A4=BA=E4=BE=8B=E4=B8=8E=E8=A7=A3=E9=87=8A=EF=BC=8C=E8=AE=A9?= =?UTF-8?q?=E5=85=B6=E4=BB=A3=E7=A0=81=E6=9B=B4=E5=8A=A0=E7=9B=B4=E8=A7=82?= =?UTF-8?q?=20=20#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\220\214\346\255\245\346\223\215\344\275\234.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" index 02bc215e..e6bd7842 100644 --- "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" +++ "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" @@ -1498,10 +1498,10 @@ std::barrier barrier{ 4, } }; -void f(int thread_id){ - for (int i = 0; i < 5; ++i) { +void f(int thread_id) { + for (int i = 1; i <= 5; ++i) { std::osyncstream{ std::cout } << "线程 " << thread_id << " 输出: " << i << '\n'; - if (i == 2 && thread_id == 2) { // 假设线程ID为2的线程在输出完2后退出 + if (i == 3 && thread_id == 2) { // 假设线程 ID 为 2 的线程在完成第三轮同步后退出 std::osyncstream{ std::cout } << "线程 " << thread_id << " 完成并退出\n"; --active_threads; // 减少活跃线程数 barrier.arrive_and_drop(); // 减少当前计数 1,并减少重置计数 1 @@ -1511,7 +1511,7 @@ void f(int thread_id){ } } -int main(){ +int main() { std::vector threads; for (int i = 1; i <= 4; ++i) { threads.emplace_back(f, i); @@ -1519,9 +1519,9 @@ int main(){ } ``` -> [运行](https://godbolt.org/z/csor1bq8d)测试。 +> [运行](https://godbolt.org/z/T7WYeYGd1)测试。 -初始线程有 4 个,线程 2 在执行了两轮同步之后便直接退出了,调用 `arrive_and_drop` 函数,下一个阶段的计数会重置为 `3`,也就是只有三个活跃线程继续执行。查看输出结果,非常的直观。 +初始线程有 4 个,线程 2 在执行了**三轮**同步便直接退出了,调用 `arrive_and_drop` 函数,下一个阶段的计数会重置为 `3`,也就是执行完第三轮同步后只有**三个活跃线程**继续执行。查看输出结果,非常的直观。 这样,`arrive_and_drop` 的作用就非常明显了,使用也十分的简单。 From 8714ced2bc6d06e48146cb4a326d253d3d81951d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sat, 6 Jul 2024 20:43:23 +0800 Subject: [PATCH 12/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=BA=90=E7=A0=81?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E7=9A=84=E9=83=A8=E5=88=86=E5=86=85=E5=AE=B9?= =?UTF-8?q?=20#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\347\240\201\350\247\243\346\236\220.md" | 63 ++++++++++++++++++- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" index b5edc97d..18d29db1 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -253,7 +253,9 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> `_Get_associated_state<_Ret>(_Policy, _Fake_no_copy_callable_adapter<_Fty, _ArgTypes...>(_STD forward<_Fty>(_Fnarg), _STD forward<_ArgTypes>(_Args)...))` - 很明显,这是一个函数调用,将我们 `std::async` 的参数全部转发给它,它是重要而直观的,代码如下: + 很明显,这是一个函数调用,将我们 `std::async` 的参数全部转发给它,它是重要而直观的。 + + `_Get_associated_state` 函数根据启动模式(`launch`)来决定创建的异步任务状态对象类型: ```cpp template @@ -271,4 +273,61 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> `_Get_associated_state` 函数返回一个 `_Associated_state` 指针,该指针指向一个新的 `_Deferred_async_state` 或 `_Task_async_state` 对象。这两个类分别对应于异步任务的两种不同执行策略:**延迟执行**和**异步执行**。 - > 这也就是证明了在 MSVC STL 的实现中,`launch::async | launch::deferred` 与 `launch::async` 执行策略**毫无区别**。这段代码的 `switch` 语句有两个 `case` 和一个 `default`,如你所见,`case launch::async` 是为空的,除了 `launch::deferred` 最终都会进入 `default`,即都执行 `launch::async` 策略。 + > 这段代码也很好的说明在 MSVC STL 中,`launch::async | launch::deferred` 和 `launch::async` 的行为是相同的,即都是异步执行。 + + --- + + **`_Task_async_state` 类型** + + ```cpp + template + class _Task_async_state : public _Packaged_state<_Rx()> + ``` + + `_Task_async_state` 是 `_Packaged_state` 的派生类,用于异步执行任务。它的构造函数接受一个函数对象,并将其传递给基类 `_Packaged_state` 的构造函数。 + + `_Packaged_state` 类型只有一个数据成员 `std::function` 类型的对象 `_Fn`,它表示需要执行的异步任务,而它又继承自 _Associated_state。 + + ```cpp + template + class _Packaged_state<_Ret(_ArgTypes...)> + : public _Associated_state<_Ret> + ``` + + 我们直接看 `_Task_async_state` 类型的构造函数实现即可: + + ```cpp + template + _Task_async_state(_Fty2&& _Fnarg) : _Mybase(_STD forward<_Fty2>(_Fnarg)) { + _Task = ::Concurrency::create_task([this]() { // do it now + this->_Call_immediate(); + }); + + this->_Running = true; + } + ``` + + 它的数据成员: + + ```cpp + private: + ::Concurrency::task _Task; + ``` + + 这里其实使用到了微软自己实现的 [并行模式库](https://learn.microsoft.com/zh-cn/cpp/parallel/concrt/parallel-patterns-library-ppl?view=msvc-170)(PPL),简而言之 `async` 策略并不是单纯的创建线程让任务执行,而是使用了微软的 `::Concurrency::create_task` ,它从**线程池**中获取线程并执行任务返回包装对象。 + + `this->_Call_immediate();` 是调用的父类 `_Packaged_state` 的成员函数: + + ```cpp + void _Call_immediate(_ArgTypes... _Args) { // call function object + _TRY_BEGIN + // call function object and catch exceptions + this->_Set_value(_Fn(_STD forward<_ArgTypes>(_Args)...), false); + _CATCH_ALL + // function object threw exception; record result + this->_Set_exception(_STD current_exception(), false); + _CATCH_END + } + ``` + + 它则调用了 `_Associated_state` 的成员函数(`_Set_value`、`_set_exception`),传递的可调用对象执行结果,以及可能的异常,将结果或异常存储在 `_Associated_state` 中。 From 1fc6f7b9932201f38720d60af5a2636eeb14fa60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sun, 7 Jul 2024 21:14:41 +0800 Subject: [PATCH 13/62] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=BA=90=E7=A0=81=E8=A7=A3=E6=9E=90=E7=9A=84=E5=86=85=E5=AE=B9?= =?UTF-8?q?=20#12=20=E5=A2=9E=E5=8A=A0=20mermaid=20=E5=9B=BE=20#22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\347\240\201\350\247\243\346\236\220.md" | 70 ++++++++++++++++--- 1 file changed, 62 insertions(+), 8 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" index 18d29db1..8c93903a 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -255,7 +255,7 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> 很明显,这是一个函数调用,将我们 `std::async` 的参数全部转发给它,它是重要而直观的。 - `_Get_associated_state` 函数根据启动模式(`launch`)来决定创建的异步任务状态对象类型: + [`_Get_associated_state`](https://github.com/microsoft/STL/blob/f54203f/stl/inc/future#L1400-L1410) 函数根据启动模式(`launch`)来决定创建的异步任务状态对象类型: ```cpp template @@ -277,14 +277,14 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> --- - **`_Task_async_state` 类型** + **[`_Task_async_state`](https://github.com/microsoft/STL/blob/f54203f/stl/inc/future#L654-L686) 类型** ```cpp template class _Task_async_state : public _Packaged_state<_Rx()> ``` - `_Task_async_state` 是 `_Packaged_state` 的派生类,用于异步执行任务。它的构造函数接受一个函数对象,并将其传递给基类 `_Packaged_state` 的构造函数。 + `_Task_async_state` 继承自 [`_Packaged_state`](https://github.com/microsoft/STL/blob/f54203f/stl/inc/future#L462-L597),用于异步执行任务。它的构造函数接受一个函数对象,并将其传递给基类 `_Packaged_state` 的构造函数。 `_Packaged_state` 类型只有一个数据成员 `std::function` 类型的对象 `_Fn`,它表示需要执行的异步任务,而它又继承自 _Associated_state。 @@ -294,6 +294,25 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> : public _Associated_state<_Ret> ``` + ```mermaid + classDiagram + class _Associated_state { + ... + } + + class _Packaged_state { + -std::function _Fn + } + + class _Task_async_state { + -::Concurrency::task _Task + } + + _Associated_state <|-- _Packaged_state : 继承 + _Packaged_state <|-- _Task_async_state : 继承 + + ``` + 我们直接看 `_Task_async_state` 类型的构造函数实现即可: ```cpp @@ -316,18 +335,53 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> 这里其实使用到了微软自己实现的 [并行模式库](https://learn.microsoft.com/zh-cn/cpp/parallel/concrt/parallel-patterns-library-ppl?view=msvc-170)(PPL),简而言之 `async` 策略并不是单纯的创建线程让任务执行,而是使用了微软的 `::Concurrency::create_task` ,它从**线程池**中获取线程并执行任务返回包装对象。 - `this->_Call_immediate();` 是调用的父类 `_Packaged_state` 的成员函数: + `this->_Call_immediate();` 是调用 `_Task_async_state` 的父类 `_Packaged_state` 的成员函数 `_Call_immediate` 。 + + **`_Packaged_state` 有三个偏特化**,`_Call_immediate` 自然也拥有三个不同版本,用来应对我们传入的函数对象**返回类型**的三种情况: + + - 返回普通类型 [`_Packaged_state<_Ret(_ArgTypes...)>`](https://github.com/microsoft/STL/blob/f54203f/stl/inc/future#L554) + + ```cpp + void _Call_immediate(_ArgTypes... _Args) { + _TRY_BEGIN + // 调用函数对象并捕获异常 传递返回值 + this->_Set_value(_Fn(_STD forward<_ArgTypes>(_Args)...), false); + _CATCH_ALL + // 函数对象抛出异常就记录 + this->_Set_exception(_STD current_exception(), false); + _CATCH_END + } + ``` + + - 返回引用类型 [`_Packaged_state<_Ret&(_ArgTypes...)>`](https://github.com/microsoft/STL/blob/f54203f/stl/inc/future#L510) + + ```cpp + void _Call_immediate(_ArgTypes... _Args) { + _TRY_BEGIN + // 调用函数对象并捕获异常 传递返回值的地址 + this->_Set_value(_STD addressof(_Fn(_STD forward<_ArgTypes>(_Args)...)), false); + _CATCH_ALL + // 函数对象抛出异常就记录 + this->_Set_exception(_STD current_exception(), false); + _CATCH_END + } + ``` + + - 返回 void 类型 [`_Packaged_state`](https://github.com/microsoft/STL/blob/f54203f/stl/inc/future#L554) ```cpp void _Call_immediate(_ArgTypes... _Args) { // call function object _TRY_BEGIN - // call function object and catch exceptions - this->_Set_value(_Fn(_STD forward<_ArgTypes>(_Args)...), false); + // 调用函数对象并捕获异常 因为返回 void 不获取返回值 而是直接 _Set_value 传递一个 1 + _Fn(_STD forward<_ArgTypes>(_Args)...); + this->_Set_value(1, false); _CATCH_ALL - // function object threw exception; record result + // 函数对象抛出异常就记录 this->_Set_exception(_STD current_exception(), false); _CATCH_END } ``` - 它则调用了 `_Associated_state` 的成员函数(`_Set_value`、`_set_exception`),传递的可调用对象执行结果,以及可能的异常,将结果或异常存储在 `_Associated_state` 中。 + 说白了,无非是把返回引用类型的可调用对象返回的引用获取地址传递给 `_Set_value`,把返回 void 类型的可调用对象传递一个 1 表示正确执行的状态给 `_Set_value`。 + + `_Call_immediate` 则又调用了父类 `_Associated_state` 的成员函数(`_Set_value`、`_set_exception`),传递的可调用对象执行结果,以及可能的异常,将结果或异常存储在 `_Associated_state` 中。 From f97b0238df95698c073408c0e15befc53a696c63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Wed, 10 Jul 2024 21:51:54 +0800 Subject: [PATCH 14/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=AC=94=E8=AF=AF?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E4=B8=80=E7=82=B9=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" | 2 +- ...\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git "a/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" "b/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" index b0c38841..3abff876 100644 --- "a/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" +++ "b/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" @@ -347,7 +347,7 @@ void f(){ > > 你是否觉得这样也可以?也没问题?简单的[测试](https://godbolt.org/z/Wo7Tj95Tz)运行的确没问题。 > -> **但是这是不对的**,你要注意我们的注释:“**一些当前线程可能抛出异常的代码**”,而不是 `f2()`,我们的 `try` `catch` 只是为了让线程对象关联的线程得以正确执行完毕,以及线程对象正确析构。并没有处理什么其他的东西,不掩盖错误,try` 块中的代码抛出了异常, `catch` 接住了,我们理所应当再次抛出。 +> **但是这是不对的**,你要注意我们的注释:“**一些当前线程可能抛出异常的代码**”,而不是 `f2()`,我们的 `try` `catch` 只是为了让线程对象关联的线程得以正确执行完毕,以及线程对象正确析构。并没有处理什么其他的东西,不掩盖错误,`try` 块中的代码抛出了异常, `catch` 接住了,我们理所应当再次抛出。 ### RAII diff --git "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" index ea4d47d4..b3b4cdb5 100644 --- "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" +++ "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" @@ -330,7 +330,7 @@ b = false; ```cpp std::atomicb {true}; auto& ref = (b = false); // 假设返回 atomic 引用 -bool flag = ref.load(); // 必须显式调用 load() 加载 +bool flag = ref.load(); // 那就必须显式调用 load() 加载 ``` 通过返回非原子值进行赋值,可以避免多余的加载(load)过程,得到实际存储的值。 From 25043eb71ae72826302f54accea926a6c3615c6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sat, 13 Jul 2024 18:45:52 +0800 Subject: [PATCH 15/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20async=20=E6=BA=90?= =?UTF-8?q?=E7=A0=81=E8=A7=A3=E6=9E=90=E5=86=85=E5=AE=B9=EF=BC=8C=E5=B0=86?= =?UTF-8?q?=20=5FTask=5Fasync=5Fstate=20=E4=B8=8E=20=5FDeferred=5Fasync=5F?= =?UTF-8?q?state=20=E4=B8=80=E8=B5=B7=E6=8F=8F=E8=BF=B0=EF=BC=8C=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E8=A1=A5=E5=85=85=E3=80=82=20=E4=BF=AE=E6=94=B9=20=20?= =?UTF-8?q?mermaid=20=E7=BB=A7=E6=89=BF=E5=9B=BE=EF=BC=8C=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=20=5FDeferred=5Fasync=5Fstate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\347\240\201\350\247\243\346\236\220.md" | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" index 8c93903a..f4b5f3f8 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -277,16 +277,18 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> --- - **[`_Task_async_state`](https://github.com/microsoft/STL/blob/f54203f/stl/inc/future#L654-L686) 类型** + **[`_Task_async_state`](https://github.com/microsoft/STL/blob/f54203f/stl/inc/future#L654-L686) 与 `_Deferred_async_state` 类型** ```cpp template class _Task_async_state : public _Packaged_state<_Rx()> + template + class _Deferred_async_state : public _Packaged_state<_Rx()> ``` - `_Task_async_state` 继承自 [`_Packaged_state`](https://github.com/microsoft/STL/blob/f54203f/stl/inc/future#L462-L597),用于异步执行任务。它的构造函数接受一个函数对象,并将其传递给基类 `_Packaged_state` 的构造函数。 + `_Task_async_state` 与 `_Deferred_async_state` 都继承自 [`_Packaged_state`](https://github.com/microsoft/STL/blob/f54203f/stl/inc/future#L462-L597),用于异步执行任务。它们的构造函数都接受一个函数对象,并将其转发给基类 `_Packaged_state` 的构造函数。 - `_Packaged_state` 类型只有一个数据成员 `std::function` 类型的对象 `_Fn`,它表示需要执行的异步任务,而它又继承自 _Associated_state。 + **`_Packaged_state` 类型只有一个数据成员 `std::function` 类型的对象 `_Fn`,它用来存储需要执行的异步任务**,而它又继承自 `_Associated_state`。 ```cpp template @@ -308,12 +310,17 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> -::Concurrency::task _Task } + class _Deferred_async_state { + ... + } + _Associated_state <|-- _Packaged_state : 继承 _Packaged_state <|-- _Task_async_state : 继承 + _Packaged_state <|-- _Deferred_async_state : 继承 ``` - 我们直接看 `_Task_async_state` 类型的构造函数实现即可: + 我们直接先看 `_Task_async_state` 与 `_Deferred_async_state` 类型的构造函数实现即可: ```cpp template @@ -324,16 +331,21 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> this->_Running = true; } + template + _Deferred_async_state(const _Fty2& _Fnarg) : _Packaged_state<_Rx()>(_Fnarg) {} + + template + _Deferred_async_state(_Fty2&& _Fnarg) : _Packaged_state<_Rx()>(_STD forward<_Fty2>(_Fnarg)) {} ``` - 它的数据成员: + `_Task_async_state` 它的数据成员: ```cpp private: ::Concurrency::task _Task; ``` - 这里其实使用到了微软自己实现的 [并行模式库](https://learn.microsoft.com/zh-cn/cpp/parallel/concrt/parallel-patterns-library-ppl?view=msvc-170)(PPL),简而言之 `async` 策略并不是单纯的创建线程让任务执行,而是使用了微软的 `::Concurrency::create_task` ,它从**线程池**中获取线程并执行任务返回包装对象。 + `_Task_async_state` 的实现使用到了微软自己实现的 [并行模式库](https://learn.microsoft.com/zh-cn/cpp/parallel/concrt/parallel-patterns-library-ppl?view=msvc-170)(PPL),简而言之 `launch::async` 策略并不是单纯的创建线程让任务执行,而是使用了微软的 `::Concurrency::create_task` ,它从**线程池**中获取线程并执行任务返回包装对象。 `this->_Call_immediate();` 是调用 `_Task_async_state` 的父类 `_Packaged_state` 的成员函数 `_Call_immediate` 。 @@ -385,3 +397,15 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> 说白了,无非是把返回引用类型的可调用对象返回的引用获取地址传递给 `_Set_value`,把返回 void 类型的可调用对象传递一个 1 表示正确执行的状态给 `_Set_value`。 `_Call_immediate` 则又调用了父类 `_Associated_state` 的成员函数(`_Set_value`、`_set_exception`),传递的可调用对象执行结果,以及可能的异常,将结果或异常存储在 `_Associated_state` 中。 + + `_Deferred_async_state` 并不会在线程中执行任务,但它同样调用 `_Call_immediate` 函数执行保有的函数对象,它有一个 `_Run_deferred_function` 函数: + + ```cpp + void _Run_deferred_function(unique_lock& _Lock) override { // run the deferred function + _Lock.unlock(); + _Packaged_state<_Rx()>::_Call_immediate(); + _Lock.lock(); + } + ``` + + 然后也就和上面说的没什么区别了 。 From f05fa42f6c518148ecc8b2eb6dfd832457e49f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sat, 13 Jul 2024 19:46:33 +0800 Subject: [PATCH 16/62] =?UTF-8?q?=E5=A4=84=E7=90=86=20mermaid=20=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E6=97=A0=E6=B3=95=E6=98=BE=E7=A4=BA=E4=B8=8B=E5=88=92?= =?UTF-8?q?=E7=BA=BF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\347\240\201\350\247\243\346\236\220.md" | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" index f4b5f3f8..db4773b3 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -298,25 +298,24 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> ```mermaid classDiagram - class _Associated_state { - ... - } + class _Associated_state { + ... + } - class _Packaged_state { - -std::function _Fn - } + class _Packaged_state { + -std::function _Fn + } - class _Task_async_state { - -::Concurrency::task _Task - } + class _Task_async_state { + -::Concurrency::task _Task + } - class _Deferred_async_state { - ... - } + class _Deferred_async_state { + } - _Associated_state <|-- _Packaged_state : 继承 - _Packaged_state <|-- _Task_async_state : 继承 - _Packaged_state <|-- _Deferred_async_state : 继承 + _Associated_state <|-- _Packaged_state : 继承 + _Packaged_state <|-- _Task_async_state : 继承 + _Packaged_state <|-- _Deferred_async_state : 继承 ``` From e191580be34a2e69f63872f0490544add801c0c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sun, 14 Jul 2024 21:19:10 +0800 Subject: [PATCH 17/62] =?UTF-8?q?=E6=9A=82=E7=BC=93=E5=8D=8F=E7=A8=8B?= =?UTF-8?q?=E9=83=A8=E5=88=86=EF=BC=8C=E6=9B=B4=E6=96=B0=E6=BA=90=E7=A0=81?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=86=85=E5=AE=B9=20#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "md/06\345\215\217\347\250\213.md" | 4 +- ...20\347\240\201\350\247\243\346\236\220.md" | 186 +++++++++++++++++- 2 files changed, 188 insertions(+), 2 deletions(-) diff --git "a/md/06\345\215\217\347\250\213.md" "b/md/06\345\215\217\347\250\213.md" index a87de6b1..e696832f 100644 --- "a/md/06\345\215\217\347\250\213.md" +++ "b/md/06\345\215\217\347\250\213.md" @@ -2,6 +2,8 @@ 既然是“**现代**” C++ 并发编程教程,怎么能不聊协程呢? -C++20 引入了协程语法,新增了三个用作协程的关键字:`co_await`、`co_yield`、`co_return`。但并未给出标准**协程库**。协程库在 C++23 被引入。 +C++20 引入了协程语法,新增了三个用作协程的关键字:`co_await`、`co_yield`、`co_return`。但并未给出标准**协程库**,协程库在 C++23 被引入。 希望您拥有 `gcc14`、`clang18`,最新的 MSVC。 + +> C++ 20 协程的使用尚不成熟,等待后续更新讲解..... diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" index db4773b3..c219e861 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -241,7 +241,7 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> | - _Future_retrieved | | _State_manager<_Ty> | +---------------------+ |----------------------| | - _Assoc_state | -----> +-------------------------+ - | - _Get_only_once | | _Associated_state<_Ty> | + | - _Get_only_once | | _Associated_state<_Ty>* | +----------------------+ +-------------------------+ ``` @@ -408,3 +408,187 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> ``` 然后也就和上面说的没什么区别了 。 + +7. 返回 `std::future` + + `return future<_Ret>(_From_raw_state_tag{}, _Pr._Get_state_for_future());` + + 它选择到了 `std::future` 的构造函数是: + + ```cpp + future(_From_raw_state_tag, const _Mybase& _State) noexcept : _Mybase(_State, true) {} + ``` + + > ```cpp + > using _Mybase = _State_manager<_Ty*>; + > ``` + + `_From_raw_state_tag` 是一个空类,并没有什么特殊作用,只是为了区分重载。 + + `_Get_state_for_future` 代码如下: + + ```cpp + _State_manager<_Ty>& _Get_state_for_future() { + if (!_State.valid()) { + _Throw_future_error2(future_errc::no_state); + } + + if (_Future_retrieved) { + _Throw_future_error2(future_errc::future_already_retrieved); + } + + _Future_retrieved = true; + return _State; + } + ``` + + 检查状态,修改状态,返回底层 `_State` ,完成转移状态。 + + 总而言之这行代码通过调用 `std::future` 的特定构造函数,将 `_Promise` 对象中的 `_State_manager` 状态转移到 `std::future` 对象中,从而创建并返回一个 `std::future` 对象。这使得 `std::future` 可以访问并管理异步任务的状态,包括获取任务的结果或异常,并等待任务的完成。 + +## `std::future` + +先前的 `std::async` 的内容非常之多,希望各位开发者不要搞晕了,其实重中之重主要是那几个类,关系图如下: + +```plaintext ++---------------------+ +| _Promise<_Ty> | +|---------------------| +| - _State | -----> +---------------------+ +| - _Future_retrieved | | _State_manager<_Ty> | ++---------------------+ |----------------------| + | - _Assoc_state | -----> +-------------------------+ + | - _Get_only_once | | _Associated_state<_Ty>* | + +----------------------+ +-------------------------+ +``` + +> `_Promise`、_`State_manager`、`_Associated_state` 之间的**包含关系示意图**。 + +```mermaid +classDiagram + class _Associated_state { + ... + } + + class _Packaged_state { + -std::function _Fn + } + + class _Task_async_state { + -::Concurrency::task _Task + } + + class _Deferred_async_state { + } + + _Associated_state <|-- _Packaged_state : 继承 + _Packaged_state <|-- _Task_async_state : 继承 + _Packaged_state <|-- _Deferred_async_state : 继承 + +``` + +> `_Asscociated_state`、`_Packaged_state`、`_Task_async_state`、`_Deferred_async_state` **继承关系示意图**。 + +这其中的 `_Associated_state`、`_State_manager` 类型是我们的核心,它在后续 `std::future` 乃至其它并发设施都有众多使用。 + +--- + +介绍 `std::future` 的源码我认为无需过多篇幅或者示例,引入过多的源码实现等等从头讲解,只会让各位开发者感觉复杂难。 + +我们直接从它的最重要、常见的 `get()`、`wait()` 成员函数开始即可。 + +```cpp +std::future future = std::async([] { return 0; }); +future.get(); +``` + +我们先前已经详细介绍过了 `std::async` 返回 `std::future` 的步骤。以上这段代码,唯一的问题是:*`future.get()` 做了什么?* + +```cpp +_EXPORT_STD template +class future : public _State_manager<_Ty> { + // class that defines a non-copyable asynchronous return object that holds a value +private: + using _Mybase = _State_manager<_Ty>; + +public: + static_assert(!is_array_v<_Ty> && is_object_v<_Ty> && is_destructible_v<_Ty>, + "T in future must meet the Cpp17Destructible requirements (N4950 [futures.unique.future]/4)."); + + future() = default; + + future(future&& _Other) noexcept : _Mybase(_STD move(_Other), true) {} + + future& operator=(future&&) = default; + + future(_From_raw_state_tag, const _Mybase& _State) noexcept : _Mybase(_State, true) {} + + _Ty get() { + // block until ready then return the stored result or throw the stored exception + future _Local{_STD move(*this)}; + return _STD move(_Local._Get_value()); + } + + _NODISCARD shared_future<_Ty> share() noexcept { + return shared_future<_Ty>(_STD move(*this)); + } + + future(const future&) = delete; + future& operator=(const future&) = delete; +}; +``` + +> `std::future` 其实还有两种特化,不过整体大差不差。 +> +> ```cpp +> template +> class future<_Ty&> : public _State_manager<_Ty*> +> ``` +> +> ```cpp +> template <> +> class future : public _State_manager +> ``` +> +> 也就是对返回类型为引用和 void 的情况了。其实先前已经聊过很多次了,无非就是内部的返回引用实际按指针操作,返回 void,那么也得给个 1。参见前面的 `_Call_immediate` 实现。 + +可以看到 `std::future` 整体代码实现很少,很简单,那是因为其实现细节都在其父类 `_State_manager` 。然而 `_State_manager` 又保有一个 `_Associated_state<_Ty>*` 类型的成员。而 **`_Associated_state` 又是一切的核心**,之前已经详细描述过了。 + +阅读 `std::future` 的源码你可能注意到了一个问题:*没有 `wait()`*成员函数?* + +它的定义来自于父类 `_State_manager` : + +```cpp +void wait() const { // wait for signal + if (!valid()) { + _Throw_future_error2(future_errc::no_state); + } + + _Assoc_state->_Wait(); +} +``` + +然而这还不够,实际上还需要调用了 `_Associated_state` 的 `wait()` 成员函数: + +```cpp +virtual void _Wait() { // wait for signal + unique_lock _Lock(_Mtx); + _Maybe_run_deferred_function(_Lock); + while (!_Ready) { + _Cond.wait(_Lock); + } +} +``` + +先使用锁进行保护,然后调用函数,再循环等待任务执行完毕。关键实际上在于 `_Maybe_run_deferred_function`: + +```cpp +void _Maybe_run_deferred_function(unique_lock& _Lock) { // run a deferred function if not already done + if (!_Running) { // run the function + _Running = true; + _Run_deferred_function(_Lock); + } +} +``` + +`_Run_deferred_function` 相信你不会陌生,在讲述 `std::async` 源码中其实已经提到了。 From c485d442fa8f8a2f300f39ad4ab8f9b2291ad569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Wed, 17 Jul 2024 21:13:13 +0800 Subject: [PATCH 18/62] =?UTF-8?q?=E5=AE=8C=E6=88=90=20`async`=20=E4=B8=8E?= =?UTF-8?q?=20`future`=20=E6=BA=90=E7=A0=81=E8=A7=A3=E6=9E=90=E7=9A=84?= =?UTF-8?q?=E6=89=80=E6=9C=89=E5=86=85=E5=AE=B9=20#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\347\240\201\350\247\243\346\236\220.md" | 204 +++++++++++++++++- 1 file changed, 202 insertions(+), 2 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" index c219e861..85fb2db5 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/03async\344\270\216future\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -273,6 +273,8 @@ _NODISCARD_ASYNC future<_Invoke_result_t, decay_t<_ArgTypes>...>> `_Get_associated_state` 函数返回一个 `_Associated_state` 指针,该指针指向一个新的 `_Deferred_async_state` 或 `_Task_async_state` 对象。这两个类分别对应于异步任务的两种不同执行策略:**延迟执行**和**异步执行**。 + > 其实就是父类指针指向了子类对象,注意 **`_Associated_state` 是有虚函数的**,子类进行覆盖,这很重要。比如在后续聊 `std::future` 的 `get()` 成员函数的时候就会讲到 + > 这段代码也很好的说明在 MSVC STL 中,`launch::async | launch::deferred` 和 `launch::async` 的行为是相同的,即都是异步执行。 --- @@ -580,7 +582,7 @@ virtual void _Wait() { // wait for signal } ``` -先使用锁进行保护,然后调用函数,再循环等待任务执行完毕。关键实际上在于 `_Maybe_run_deferred_function`: +先使用锁进行保护,然后调用函数,再循环等待任务执行完毕。`_Maybe_run_deferred_function`: ```cpp void _Maybe_run_deferred_function(unique_lock& _Lock) { // run a deferred function if not already done @@ -591,4 +593,202 @@ void _Maybe_run_deferred_function(unique_lock& _Lock) { // run a deferred } ``` -`_Run_deferred_function` 相信你不会陌生,在讲述 `std::async` 源码中其实已经提到了。 +`_Run_deferred_function` 相信你不会陌生,在讲述 `std::async` 源码中其实已经提到了,就是解锁然后调用 `_Call_immediate` 罢了。 + +```cpp +void _Run_deferred_function(unique_lock& _Lock) override { // run the deferred function + _Lock.unlock(); + _Packaged_state<_Rx()>::_Call_immediate(); + _Lock.lock(); +} +``` + +> `_Call_immediate` 就是执行我们实际传入的函数对象,先前已经提过。 + +在 `_Wait` 函数中调用 `_Maybe_run_deferred_function` 是为了确保延迟执行(`launch::deferred`)的任务能够在等待前被启动并执行完毕。这样,在调用 `wait` 时可以正确地等待任务完成。 + +至于下面的循环等待部分: + +```cpp +while (!_Ready) { + _Cond.wait(_Lock); +} +``` + +这段代码使用了条件变量、互斥量、以及一个状态对象,主要目的有两个: + +1. **避免虚假唤醒**: + - 条件变量的 `wait` 函数在被唤醒后,会重新检查条件(即 `_Ready` 是否为 `true`),确保只有在条件满足时才会继续执行。这防止了由于虚假唤醒导致的错误行为。 +2. **等待 `launch::async` 的任务在其它线程执行完毕**: + - 对于 `launch::async` 模式的任务,这段代码确保当前线程会等待任务在另一个线程中执行完毕,并接收到任务完成的信号。只有当任务完成并设置 `_Ready` 为 `true` 后,条件变量才会被通知,从而结束等待。 + +这样,当调用 `wait` 函数时,可以保证无论任务是 `launch::deferred` 还是 `launch::async` 模式,当前线程都会正确地等待任务的完成信号,然后继续执行。 + +--- + +`wait()` 介绍完了,那么接下来就是 `get()` : + +```cpp +// std::future +void get() { + // block until ready then return or throw the stored exception + future _Local{_STD move(*this)}; + _Local._Get_value(); +} +// std::future +_Ty get() { + // block until ready then return the stored result or throw the stored exception + future _Local{_STD move(*this)}; + return _STD move(_Local._Get_value()); +} +// std::future +_Ty& get() { + // block until ready then return the stored result or throw the stored exception + future _Local{_STD move(*this)}; + return *_Local._Get_value(); +} +``` + +在第四章的 “*future 的状态变化*”一节中我们也详细聊过 `get()` 成员函数。由于 future 本身有三个特化,`get()` 成员函数自然那也有三个版本,不过总体并无多大区别。 + +它们都是将当前对象(`*this`)的共享状态转移给了这个局部对象 `_Local`,然后再去调用父类`_State_manager` 的成员函数 `_Get_value()` 获取值并返回。而局部对象 `_Local` 在函数结束时析构。这意味着当前对象(`*this`)失去共享状态,并且状态被完全销毁。 + +`_Get_value()` : + +```cpp +_Ty& _Get_value() const { + if (!valid()) { + _Throw_future_error2(future_errc::no_state); + } + + return _Assoc_state->_Get_value(_Get_only_once); +} +``` + +先进行一下状态判断,如果拥有共享状态则继续,调用 `_Assoc_state` 的成员函数 `_Get_value` ,传递 `_Get_only_once` 参数,其实就是代表这个成员函数只能调用一次,次参数是里面进行状态判断的而已。 + +`_Assoc_state` 的类型是 ` _Associated_state<_Ty>* ` ,是一个指针类型,它实际会指向自己的子类对象,我们在讲 `std::async` 源码的时候提到了,它必然指向 `_Deferred_async_state` 或者 `_Task_async_state`。 + +`_Assoc_state->_Get_value` 这其实是个多态调用,父类有这个虚函数: + +```cpp +virtual _Ty& _Get_value(bool _Get_only_once) { + unique_lock _Lock(_Mtx); + if (_Get_only_once && _Retrieved) { + _Throw_future_error2(future_errc::future_already_retrieved); + } + + if (_Exception) { + _STD rethrow_exception(_Exception); + } + + // TRANSITION: `_Retrieved` should be assigned before `_Exception` is thrown so that a `future::get` + // that throws a stored exception invalidates the future (N4950 [futures.unique.future]/17) + _Retrieved = true; + _Maybe_run_deferred_function(_Lock); + while (!_Ready) { + _Cond.wait(_Lock); + } + + if (_Exception) { + _STD rethrow_exception(_Exception); + } + + if constexpr (is_default_constructible_v<_Ty>) { + return _Result; + } else { + return _Result._Held_value; + } +} + +``` + +但是子类 `_Task_async_state` 进行了重写,以 `launch::async` 策略创建的 future,那么实际会调用 `_Task_async_state::_Get_value` : + +```cpp +_State_type& _Get_value(bool _Get_only_once) override { + // return the stored result or throw stored exception + _Task.wait(); + return _Mybase::_Get_value(_Get_only_once); +} +``` + +> `_Deferred_async_state` 则没有进行重写,就是直接调用父类虚函数。 + +`_Task` 就是 `::Concurrency::task _Task;`,调用 `wait()` 成员函数确保任务执行完毕。 + +`_Mybase::_Get_value(_Get_only_once)` 其实又是回去调用父类的虚函数了。 + +> ### `_Get_value` 方法详细解释 + +1. **状态检查**: + - 如果`_Get_only_once`为真并且结果已被检索过,则抛出`future_already_retrieved`异常。 +2. **异常处理**: + - 如果存在存储的异常,重新抛出该异常。 +3. **标记结果已被检索**: + - 将`_Retrieved`设置为`true`。 +4. **执行延迟函数**: + - 调用`_Maybe_run_deferred_function`来运行可能的延迟任务。这个函数很简单,就是单纯的执行延时任务而已,在讲述 `wait` 成员函数的时候已经讲完了。 +5. **等待结果就绪**: + - 如果结果尚未准备好,等待条件变量通知结果已就绪。(这里和 `std::async` 和 `std::future` 的组合无关,因为如果是 `launch::async` 模式创建的任务,重写的 `_Get_value` 是先调用了 `_Task.wait();` 确保异步任务执行完毕,此处根本无需等待它) +6. **再次检查异常**: + - 再次检查是否有存储的异常,并重新抛出它。 +7. **返回结果**: + - 如果`_Ty`是默认可构造的,返回结果`_Result`。 + - 否则,返回`_Result._Held_value`。 + +`_Result` 是通过执行 `_Call_immediate` 函数,然后 `_Call_immediate` 再执行 `_Set_value` ,`_Set_value` 再执行 `_Emplace_result`,`_Emplace_result` 再执行 `_Emplace_result` 获取到我们执行任务的值的。以 `Ty` 的偏特化为例: + +```cpp +// _Packaged_state +void _Call_immediate(_ArgTypes... _Args) { + _TRY_BEGIN + // 调用函数对象并捕获异常 传递返回值 + this->_Set_value(_Fn(_STD forward<_ArgTypes>(_Args)...), false); + _CATCH_ALL + // 函数对象抛出异常就记录 + this->_Set_exception(_STD current_exception(), false); + _CATCH_END +} + +// _Asscoiated_state +void _Set_value(const _Ty& _Val, bool _At_thread_exit) { // store a result + unique_lock _Lock(_Mtx); + _Set_value_raw(_Val, &_Lock, _At_thread_exit); +} +void _Set_value_raw(const _Ty& _Val, unique_lock* _Lock, bool _At_thread_exit) { + // store a result while inside a locked block + if (_Already_has_stored_result()) { + _Throw_future_error2(future_errc::promise_already_satisfied); + } + + _Emplace_result(_Val); + _Do_notify(_Lock, _At_thread_exit); +} +template +void _Emplace_result(_Ty2&& _Val) { + // TRANSITION, incorrectly assigns _Result when _Ty is default constructible + if constexpr (is_default_constructible_v<_Ty>) { + _Result = _STD forward<_Ty2>(_Val); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + } else { + ::new (static_cast(_STD addressof(_Result._Held_value))) _Ty(_STD forward<_Ty2>(_Val)); + _Has_stored_result = true; + } +} +``` + +## 总结 + +好了,到此也就可以了。 + +你不会期待我们将每一个成员函数都分析一遍吧?首先是没有必要,其次是篇幅限制。 + +`std::future` 的继承关系让人感到头疼,但是如果耐心的看了一遍,全部搞明白了继承关系, `std::async` 如何创建的 `std::future` 也就没有问题了。 + +其实各位不用着急完全理解,可以慢慢看,至少有许多的显著的信息,比如: + +1. `sttd::future` 的很多部分,如 `get()` 成员函数实现中,实际使用了虚函数。 +2. `std::async` 创建 `std::future` 对象中,内部其实也有父类指针指向子类对象,以及多态调用。 +3. `std::async` 的非延迟执行策略,使用到了自家的 PPL 库。 +4. 微软的 `std::async` 策略实现并不符合标准,不区分 `launch::async | launch::deferred` 和 `launch::async`。 +5. `std::future` 内部使用到了互斥量、条件变量、异常指针等设施。 From 370f13367dd8ace07129b2c32262e626066d3100 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Fri, 19 Jul 2024 21:37:00 +0800 Subject: [PATCH 19/62] =?UTF-8?q?=E5=BC=80=E5=A7=8B=E7=BC=96=E5=86=99?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=B1=A0=E5=86=85=E5=AE=B9=EF=BC=8C=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E6=96=87=E4=BB=B6=E3=80=81=E5=89=8D=E8=A8=80=20#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\272\277\347\250\213\346\261\240.md" | 26 +++++++++++++++++++ .../README.md" | 3 ++- 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 "md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" new file mode 100644 index 00000000..1a3d334d --- /dev/null +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -0,0 +1,26 @@ +# 线程池 + +## 前言 + +我相信,已经阅读到这里的各位,不会对“*线程池*”这个词感到陌生。大部分开发者早就自己使用、学习,乃至实现过线程池。那不如我们先来进行一下基础的名词解释。 + +- ***什么叫线程池?*** + +“**线程**”没什么好说的,是 CPU 调度的最小单位,也是操作系统的一种抽象资源。 + +“**池**”?水池装着水,线程池则是装着线程,是一种抽象的指代。 + +抽象的来说,可以当做是一个池子中存放了一堆线程,故称作线程池。简而言之,线程池是指代一组**预先创建的**、**可以复用的线程集合**。这些线程由线程池管理,用于执行多个任务而**无需频繁地创建和销毁**线程。 + +使用线程池的益处我们已经加粗了,然而这其实并不是“*线程池*”独有的,任何创建和销毁存在较大开销的设施,都可以进行所谓的“***池化***”。 + +常见的还有:**套接字连接池**、**数据库连接池**、**内存池**、**对象池**。 + +--- + +了解以上这些基础概念是第一步也是最后一步,随着水平的提升,对这些概念认知与理解也会逐渐提升。 + +## 实现线程池 + +实现一个普通的能够满足日常开发需求的线程池实际上非常简单,也只需要一百多行代码。 + diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/README.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/README.md" index 9f7fbd0f..f76617b3 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/README.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/README.md" @@ -1,3 +1,4 @@ # 详细分析 -放一些详细分析源码实现之类的内容。 +存放一些源码分析,以及一些其它非知识点,而是应用的造轮子(如线程池),或者其它扩展讲解。 + From 86bd06eef830bda1dd8e21feab5610c247d2b1a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sat, 20 Jul 2024 18:45:06 +0800 Subject: [PATCH 20/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20github-pages=20?= =?UTF-8?q?=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vuepress/config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/.vuepress/config.js b/.vuepress/config.js index d5c2ea5d..889cb274 100644 --- a/.vuepress/config.js +++ b/.vuepress/config.js @@ -28,6 +28,7 @@ export default defineUserConfig({ { text: 'std::thread 的构造-源码解析', link: srcCodePath + '01thread的构造与源码解析', }, { text: 'std::scoped_lock 的源码实现与解析', link: srcCodePath + '02scoped_lock源码解析', }, { text: 'std::async 与 std::future 源码解析', link: srcCodePath + '03async与future源码解析', }, + { text: '线程池', link: srcCodePath + "04线程池", }, ] }, ], From 9e82309d86040a7030b63af2749e06f35536c6f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sat, 20 Jul 2024 20:06:22 +0800 Subject: [PATCH 21/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=A2=9E=E5=8A=A0=20me?= =?UTF-8?q?rmaid=20=E5=9B=BE=20#22=20=E5=A2=9E=E5=8A=A0=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0=E6=8F=8F=E8=BF=B0=20#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\272\277\347\250\213\346\261\240.md" | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index 1a3d334d..71218c55 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -10,7 +10,61 @@ “**池**”?水池装着水,线程池则是装着线程,是一种抽象的指代。 -抽象的来说,可以当做是一个池子中存放了一堆线程,故称作线程池。简而言之,线程池是指代一组**预先创建的**、**可以复用的线程集合**。这些线程由线程池管理,用于执行多个任务而**无需频繁地创建和销毁**线程。 +抽象的来说,可以当做是一个池子中存放了一堆线程,**故称作线程池**。简而言之,线程池是指代一组**预先创建的**、**可以复用的线程集合**。这些线程由线程池管理,用于执行多个任务而**无需频繁地创建和销毁**线程。 + +```mermaid +graph TD + subgraph 线程池 + 线程1 + 线程2 + 线程3 + 线程4 + 线程5 + ... + end + + 任务队列[任务队列] + 调度器 --> 线程1 + 调度器 --> 线程2 + 调度器 --> 线程3 + 调度器 --> 线程4 + 调度器 --> 线程5 + + 任务1 --> 调度器 + 任务2 --> 调度器 + 任务3 --> 调度器 + 任务4 --> 调度器 + 任务5 --> 调度器 + 任务6 --> 调度器 + 任务7 --> 调度器 + + 线程1 --> 执行任务1[执行任务1] + 线程2 --> 执行任务2[执行任务2] + 线程3 --> 执行任务3[执行任务3] + 线程4 --> 执行任务4[执行任务4] + 线程5 --> 执行任务5[执行任务5] + + 执行任务1 --> 休眠1[休眠等待] + 执行任务2 --> 休眠2[休眠等待] + 执行任务3 --> 休眠3[休眠等待] + 执行任务4 --> 休眠4[休眠等待] + 执行任务5 --> 休眠5[休眠等待] + + 任务6 --> 调度器 --> 唤醒线程1[唤醒线程1] + 唤醒线程1 -.-> 线程1 + 线程1 --> 执行任务6[执行任务6] + 执行任务6 --> 休眠1 + + 任务7 --> 调度器 --> 唤醒线程2[唤醒线程2] + 唤醒线程2 -.-> 线程2 + 线程2 --> 执行任务7[执行任务7] + 执行任务7 --> 休眠2 + +``` + +> 这是一个典型的线程池结构。线程池包含一个**任务队列**,当有新任务加入时,调度器会将任务分配给线程池中的空闲线程进行执行。线程在执行完任务后会进入**休眠状态**,等待**调度器**的下一次**唤醒**。当有新的任务加入队列,并且有线程处于休眠状态时,调度器会唤醒休眠的线程,并分配新的任务给它们执行。线程执行完新任务后,会再次进入休眠状态,直到有新的任务到来,调度器**才可能**会再次唤醒它们。 +> +> 图中线程1 就是被调度器分配了任务1,执行完毕后休眠,然而新任务的到来让调度器再次将它唤醒,去执行任务6,执行完毕后继续休眠。 使用线程池的益处我们已经加粗了,然而这其实并不是“*线程池*”独有的,任何创建和销毁存在较大开销的设施,都可以进行所谓的“***池化***”。 From 68e852f045f98e2ff7979cf579c2837e5b83b74e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sun, 21 Jul 2024 20:02:04 +0800 Subject: [PATCH 22/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E7=AB=A0=20mermaid=20=E7=A4=BA=E6=84=8F=E5=9B=BE=EF=BC=9B?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E7=82=B9=E7=AC=AC=E5=9B=9B=E7=AB=A0?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" | 6 ------ .../04\347\272\277\347\250\213\346\261\240.md" | 7 ++++++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git "a/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" index 0146aadc..a59d6e6c 100644 --- "a/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -40,9 +40,6 @@ graph TD; CPU2 --> Task2[任务2] CPU3 --> Task3[任务3] end - - style MultiCore, CPU1, CPU2, CPU3, Task1, Task2, Task3 fill:#fff,stroke:#333,stroke-width:2px; - ``` ```mermaid @@ -55,9 +52,6 @@ graph TD; TaskSwitching --> Task2[任务2执行片段] TaskSwitching --> Task3[任务3执行片段] end - - style SingleCore, OS, TaskSwitching, Task1, Task2, Task3 fill:#fff,stroke:#333,stroke-width:2px; - ``` ## 并发与并行 diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index 71218c55..091ede0c 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -74,7 +74,12 @@ graph TD 了解以上这些基础概念是第一步也是最后一步,随着水平的提升,对这些概念认知与理解也会逐渐提升。 +## 市面上常规的线程池 + +在了解了线程池的基本概念与运行逻辑后,我们不用着急就尝试实现。我们可以先来聊一聊,使用一下市面上常见的那些线程池设施,了解它们的使用感受,接口设计的方式。 + +如 **`boost::asio::thread_pool`**、**`QThreadPool`**、`PPL` + ## 实现线程池 实现一个普通的能够满足日常开发需求的线程池实际上非常简单,也只需要一百多行代码。 - From 2584b4a366c21fc5d33f72a100cca5648f7383f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Tue, 23 Jul 2024 20:30:23 +0800 Subject: [PATCH 23/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0=E4=B8=AD`boost::asio::thread=5Fpool`=20=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\272\277\347\250\213\346\261\240.md" | 81 ++++++++++++++++++- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index 091ede0c..9a122c5b 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -74,11 +74,86 @@ graph TD 了解以上这些基础概念是第一步也是最后一步,随着水平的提升,对这些概念认知与理解也会逐渐提升。 -## 市面上常规的线程池 +## 市面上常见的线程池 -在了解了线程池的基本概念与运行逻辑后,我们不用着急就尝试实现。我们可以先来聊一聊,使用一下市面上常见的那些线程池设施,了解它们的使用感受,接口设计的方式。 +在了解了线程池的基本概念与运行逻辑后,我们不用着急就尝试实现。我们可以先来聊一聊,使用一下市面上常见的那些 C++ 线程池设施,了解它们的使用感受,接口设计的方式。 -如 **`boost::asio::thread_pool`**、**`QThreadPool`**、`PPL` +### `boost::asio::thread_pool` + +[`boost::asio::thread_pool`](https://think-async.com/Asio/asio-1.11.0/doc/asio/reference/thread_pool.html) 是 [`Boost.Asio`](https://www.boost.org/doc/libs/1_85_0/doc/html/boost_asio.html) 库提供的一种线程池实现。 + +> Asio 是一个跨平台的 C++ 库,用于**网络**和低级 I/O 编程,使用 **现代C++** 方法为开发人员提供一致的异步模型。 + +使用方法: + +1. 创建线程池对象,自行指定或者让 Asio 自动决定线程数量。 + +2. 提交任务:通过 [`boost::asio::post`](https://beta.boost.org/doc/libs/1_82_0/doc/html/boost_asio/reference/post.html) 函数模板提交任务到线程池中。 + +3. 阻塞,直到池中的线程完成任务。 + +```cpp +#include +#include + +void print_task(int n) { + std::cout << "Task " << n << " is running." << std::endl; +} + +int main() { + boost::asio::thread_pool pool{4}; // 创建一个包含 4 个线程的线程池 + + for (int i = 0; i < 10; ++i) { + boost::asio::post(pool, [i]() { print_task(i); }); + } + + pool.join(); // 等待所有任务执行完成 +} +``` + +- 创建线程池时,指定线程数量,线程池会创建对应数量的线程。 + +- 使用 `boost::asio::post` 提交任务,任务会被添加到任务队列中。 + +- 线程池中的线程会从任务队列中取出任务并执行,任务执行完毕后,线程继续取下一个任务或者休眠。 + +- 调用 join 方法等待所有任务执行完毕并关闭线程池(`thread_pool` 析构同样会调用它,非必要)。 + +如果我们不自己指明线程池的线程数量,那么 Asio 会根据函数 [`default_thread_pool_size`](https://github.com/boostorg/asio/blob/44238d033e1503c694782925d647811380a067c2/include/boost/asio/impl/thread_pool.ipp#L53-L58) 计算并返回一个**线程池的默认线程数量**。它根据系统的硬件并发能力来决定使用的线程数,通常是硬件并发能力的两倍。 + +```cpp +inline long default_thread_pool_size() +{ + std::size_t num_threads = thread::hardware_concurrency() * 2; + num_threads = num_threads == 0 ? 2 : num_threads; + return static_cast(num_threads); +} + +thread_pool::thread_pool() + : scheduler_(add_scheduler(new detail::scheduler(*this, 0, false))), + num_threads_(detail::default_thread_pool_size()) +``` + +代码很简单,就是 `thread::hardware_concurrency() * 2` 而已,至于下面的判断是因为 `std::thread::hardware_concurrency()` 在某些特殊情况下可能返回 `0`,例如硬件并发能力无法被检测时,那将 `num_threads` 设置为 2,确保线程池至少有 2 个线程。 + +--- + +我们的重点来到它的析构函数中: + +```cpp +thread_pool::~thread_pool() +{ + stop(); + join(); + shutdown(); +} +``` + +- `stop` :修改内部的标志位存在使得线程池能够识别何时需要停止接收新的任务,然后唤醒所有线程准备。 + +- `join()` :等待所有线程完成它们的工作,确保所有线程都已终止。 + +- `shutdown()` :进行最终的清理,释放资源,确保线程池的完全清理和资源的正确释放 ## 实现线程池 From d69ad28715583db4cd46602b888361fcb45ba903 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Tue, 23 Jul 2024 20:49:22 +0800 Subject: [PATCH 24/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0=E7=AC=94=E8=AF=AF;=E4=BF=AE=E6=94=B9=E4=BB=93?= =?UTF-8?q?=E5=BA=93=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 +++++++++++++ "image/\350\265\236\345\212\251.jpg" | Bin 0 -> 171632 bytes .../04\347\272\277\347\250\213\346\261\240.md" | 2 +- ...53\350\231\253\346\227\213\350\275\254.jpg" | Bin 0 -> 354705 bytes 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 "image/\350\265\236\345\212\251.jpg" create mode 100644 "\347\214\253\347\214\253\350\231\253\346\227\213\350\275\254.jpg" diff --git a/README.md b/README.md index 4e4f62b5..214601ed 100644 --- a/README.md +++ b/README.md @@ -25,3 +25,16 @@   虽强调现代,但不用担心,我们几乎是从头教学,即使你从来没使用过 C++ 进行多线程编程,也不成问题。   我们希望您的编译器版本和标准尽可能的高,我们的代码均会测试三大编译器 gcc、clang、msvc。需要更高的标准会进行强调。 + +
+ +![猫猫虫](/猫猫虫旋转.jpg) + +如果你觉得本仓库对你有所帮助,可以通过支付宝赞助白老师,激励白老师有更多的精力和信心维护本仓库。 + +> [!TIP] +> 每一位开发者赞助 `30`,白老师一天的食品安全就有了着落。 + +![赞助](/image/赞助.jpg) + +
diff --git "a/image/\350\265\236\345\212\251.jpg" "b/image/\350\265\236\345\212\251.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..22adddd49d7e5e2cfb8b8bc4437cec2b11feab6a GIT binary patch literal 171632 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�S$8g4IjByXusue&xCdGtRL+RUf|^RbzcpS|87o1z|43;H z1G%$bFM)O70AC;Y;=iZBz0!KRm1KI`;)DwPGto}RA}-#lX;-*;L&w8_?w00yHfY;L zmDT11?nsw+@m<$z3xuH@(6CT}cd#}y;6S0QOKaO1)-*$+lc6lP>SnCh$=4alCE5vJ zFMQg*BzFUC>)!RNzNoKaoOLpJNAT~%92LXDVk2HRZ*e%C|~>abM`y!Va!rH(q1RLv2>4y{>icYfr=ocl)!v^P zAO^WsxWW71li;0H1P*d7quIduzI_&kpA5Xd1|@%?KtaON+!K;Uk3jYmusg})XF zE!sXcxCt&uoJ$wTtVxl3nXl<-xjJWj*2jC_Ycl+;!~MWlU++4Ba+d3n-47N$x^!^W z7d42y6y&&BxTX)d8PQlE zGvfXV8oOj$sX^57ehb?zpZmm|%#efcb>@d`>0stN@w|6-8a%b2^wwLi`ZG9Wmcta) zS!1|F=v_I-lJu^igMU{PPW~x?Apn9V09YW<0wB=9YlFrk6cFS6FFcm;5K{z4?C+QL z9p>%g24q%;$T+LHpKCG9_FfP(`=xQitZQqOOvi1$TxQ4gV(hvdIPtM?ORd7Vkg>Opz^fkXesr7S>Twc_b&flkv>yGoGgds7#)k1R!mRJxh5u_fX-&x=93;dw~?9&Ii1!^TUfy9y{N`q{dREDRay$kGB z;WGxbRA=0Vu4=1XQ&LA7*>-Vv)VP@1T&Vqm_1WJ8(NX51uzS*GD+m?wW^6F6_)kJq z5v7=yP6D!$7IasqV33y$B8g^OZI)}g33^tr-)5zm!lsqzFD7O}>JRvT=pDcSKB`fX zdWe_86h@hL^6o$~2~#6=n*qvJe^jnlm(~~k9_#B;KaF}Ke}>wOI47l@77+x^L`rQM z$o)*|m-`8DE`%zZaxaA%O&yJVRX?d-Q#S5)5Y*wnLYaH6SfcC_w~{1rwUJU+Yt2>g zVYNJiw6-LRh)X6y%Wv2g=sShm*`Zt}+y-|YT}Kp*t%5|OClS;J%KqjOsWiB{=_Y8a zv{?5S?xn^kaE$N)qii|!?mZ3?Suz48#B>P#ftWrgD9|7=$npbPYbbR<`CSL982bz0 z6+{ybWnfp<1>EnXi!^eY=@LkX1$ z(PY2cTVgyeRXGxt-WmV$0LjCFMT}r6!;;1J_s}=W(h$rH?=&4?=4ddo<0;wDFNcei zq*n4qV>=Jp2&OEpZ)JVaP&M}KX+y7S7U`!D40LfT zsr@8dV7yZVf9rJtHteC|nt^1KM#NA0h|35VgN%S0Y)X(3paBg9RipuuNh6~yKm=Jp zcSi!jC#@w7-X>e}%kCyoIAvVLp&ylkbqD?f+9h{jmncAv4g?6r;vf>da6roX_glbR zNoZ%yo$kZH_gj9yL?`UG+6$DXNYHs241E5(TB!humCER;jd}S_v36GpIW5sslbn>n zA+=b{bn9H=R{3-)`QV-@fUMn2rj)Zl4QLdY9Xb%j<|v96Z#U0z4>VNa8fOLDy;8I0 zrRmkjgld>wyY2Y?+m>;wa}?LF?5hnl+==th@Ro(sBD&!i{^45v6K#5~Zk?19P19Gk z8YN%V+YvwQz#`Qt4GVnxC=fDdX@LgQiAbo=JU>h3gP0?Tp6URHfSZf>4D(ZZL|#3| z4GDbe3-tvh!c})U&6f7I-q$C7b&OcdT(aiUqu9n=)^^H6=y*cmhP^Dr3<*%e8iT5B z!)AaxhxWdW$~*w4(xALCua+zvb@B({0>rBSi|c#=vW0Cm+ZasBL)@BlV<4RaMJdZy zpqwKI$~lQ?HQ_I)ihj%5hnF+Y_{N)i=q1^vSLRQhQ{4DTW{>5Ks5T?@J3uHIwuK6H z)GRA6w)l7eR4kr*Lk!UhB2(&mu(H%MATouCR~QkUil{0eMTK8B{eN>=p-XK6$Xcm^ z^Vi8@@fFEG2-6`7xs$`{lIOOGWx>kiIsyO|1U!-qaK;h|*WP&Q`bG}XZ%bXKP035! z%!}v8U1yj^SiikmnD_Xu<->EI3NJ| z2B63Nh`JBjzkr8fU@=v3H2`^KUmlu4l#??WD4Ne!1K6#oug-cdQ|qwj1Tl zav;q-k-d3u;7A`C=xWJB%q;ibP)s5Pb``>hSWq$=Ce(+#0YdTirfNfy(2{Kkfexfv z?zZ3Hl229cG~Uumeedh~Zl7D}PZnM{7NxinApl5aV2=a<=m_e@B%)ztByopC!&o>& z@&i8!UaJ`rGLcxIXirQ9$X&P*W`U4N7~p4pQ+a-TQcc0xD*24ElxOek=_8j@RZOSDTy=8ghV4Q0gAsHoRy|CvuL$)m?&gfeA$=I)`D}V#no_1a* zV^tidd2`i{ma3~IYaaz)jvG5NIAq=QzCyVdxe2rV;|DhK!0jL@re6=0^$sdxmD!_S z?RRuwl|lJK)eb7KN+4x1d=;d(&XEkR+)MHBk_AG$J8;OHZO7`wRTz8fZk&`q?An&? z^PNqvuDUd8X``_%p-)rY=`g-&`4ym_*1xxrfErTsjiNx83heEbXm4+)ykIEX^DAm{ zF4rp9kh~Z=2Cd)R9y|(uoIZBstgbDbgrmta9SpohkRoDX&>Ra4Hwi}#-B@b^)N!)dStz5{+VA?^}S!rp8F@uSnwoz>+-`L@pM z*cqq>6pV6QF1{AO&Dpl|^T!?Qj!oQXFnimbgIP1yj$5?sh4Odco_%G2V40RZ3i{tQ zK+rGJV!We*V3}10pgFkyK$lD&XsJA+3UNJ13wY6INww*J%j5hBE)eeMK$BB{xYJbj zo-cTrYQKb=&~v7Ho7?Wk86Cph)P37VzERGRAGZ8{s}b>9SGfRkHoNC=-vckj5l)5; zmkb(T5Lq4{kF`e-0NVh_kJP{@m#?FoWlrbk+s}k?Mh*8@LZe>Vad>bNG(O;F6c~08JKD?On-FBakXi_Cb@f1? zxJ-R1Zt41WgL4rTBA+a4uR5@ZQ>CU3-!=Gkr@@v;wv982F23|LB~L+5ewqC*muy$e zrUpecyy8HETJw%29Knirph7qGUfbgRtra(udPXk1*d^1@U4~13+^UB2rLYZa>`Jsq z_FEBe9@U(FG{Nz*$>Cjxl|P$l&X&)45w>L1($}glpkeIfIzKS}3f91o8R6v)J@pOX zL!g{t4Lt(K?Fa6f;2-}FFZ9HI332?lR3G9bvn%8-K8guZJRs2F{oau#x^onWh3`5S zhy1qig6Fb=Db3^>n%^Wa#MFrxhmRbimm~}-`575~QtqUjV=6mhBXmjhvxX|^rQf@Q ziSC!jMb9))`1>2O{%3z_SOgVbdA`EBk*+U@N|j4K3&|v(@h(%c()O$PSwOA{)-Vy0h||9xP(3- z(udKJK8$*lV#?rp^8f4FD-gQ|9PocQn5MWp;|{K}uUtz_NE6f6*)ve^Hiqg|QNv`^ zh_vh+!35t7IrR2X@D+_4wBcQr<$>g-4;^0s(o;h-fc0BNMeDa#svBsIHUkCLZvq4y zs!@t`u4A@8I`6S?LdNjndR*2|7lTL+^#7RXgq(v&=N-XElEN@h3M0{3?CU-G!cgn6 z=tlC>jNj@U-Q2sUzPT7bE#36NjQkAEy#F*t|T3fdx%t55qg&<-$A@1vTa`Gu><5c`-bN z4>#RKH|xDw2QHT!yT+P&^p3;#X${lk3nAX}1OK+ld>mH2mIJyP1`or$2a{%upIT+taA%{(S3kGBX@vr@KJ>7MB5L!-xSr zC`h&s;8&Qt14pC7$^b&CUGYdqr<*Lq#X^o->5Gs+sXFZ$7uTCGSkjk?av;M z`B8G#q3d@}8MgkQ@oGoeaiL+wn`M9#Jvcb8S8js-*dAfH`B=m@4$VhuDL|a;O=x!j z`AVeI1IHS4dQ6+dh>2){>#yQHW9m9o#EVB_yE!9W%GX^x=awQbe||%x#cGntRL%KD zb5%8#jtnF(I^_6<0omATYa|ni+_FTv6PbGtv=0W39_r2x2c;fKZ7a^U+q5@6i>!Qv ze8NY8k=3SD?tCmF=kk*R!|Q5b?VsK}8h*r0#ad2lncV#^O~_rL{X46F|N0Z;bW=Ke zhP?MJ$kE|DAKW&ss9Fl(u7{aDv8Juu^5t?~=Dlw!KKnDm^?SD1t}R(J%BW-MX1j@3 zE<`?OKLLO@f~7+K31l>P#j*4PKu}!rnxRjjP>uvr@9>(Dn5KdmE~XjO+(`Y@4Cm5t zn%9EP4If&%oxblcRd2N|*8DW=ue!~n9V~C$YW-$JbSS1AmrC>oz&T_=_|wGU5_8++ z`4!nm4T;4M^zOSa=xOo&Yq!(Yh@pGu8WZg&!aE^CD~Fzh4>uCfiCCV*XlEsg)hmg;@6Cv#KUPGnGgYeW`y-tO~x z-XU&pUmwd!{C%rz(HXa=QR9wY4gGbha$h`84VE<_9Q7htcQA08y`2sW`iQ$Pn+H%d z)Vk~;p#ltSUJ#4i+=bQYpK{M|<#H%oF-<#}5*}%OwP$|*l!`^m-fT8sw=%t!xeGR` z6;Mn^WGwqZz)&EhE7REx;|btv9Gsu?jYM^_xycsBOIA0w4Ij90xT@WnwraEC+maPJJf?}3-oYKtOm>7NNhx(1qu zPBNJ%G%L+xywF)w?`&&oD{>+Z>w%yB>tEU-g$SAG&wssBYS5F7QBYC?g<4!QEhZWv z#i+9cU>KM~ghbQ2`bESsZW7is5tqih47$_%;{L!f#5oKJ&BDh--X(-#-GjEWqYncslL?PXA-iI7qN{w(dF zZSJ%WoHXY`asNuOS|HsYfSDh&!(cEFK5hl_Jn3K_0c!sFng#%_H2Xs(pL$aK-w*=` z`SG45Qoq`4rdTQ)O&O4l7C~(uSAb@KwUYwzkC`QCEok4cfq6-rWgQV?hbh8MJRh{m zSY2_p{4wYQ@|RQn9}v2Iq{}mQ3+l@X#6ZY)LBL#CeJYYziJy~6k&aYy$JK7P#^*W8 zfQz|%J8*fypUCTHKs<)GInnyIP$QsbhC|Q#Fi{DEiAr6t!-ZuyxemuhG7vgTjkX2{ z4pa!-fqNqd9=OaD-3Wjy$B-hs6kK6wBKQUSlFpaHF9ZP(#Xdv-Fl9usP}t&!i=oLZ zLQBy1%Lkwh3DXUJ9yN62&`wC_mo!7jlBV2k?H4al@NAFykPihYQd68ny$pb5BxwZ0 znC{WQ1#g96Ox?U_=qrP+Fe~T^lTa@WhGm-LYPStFjA#_1*l%?ymF(gGwZ0tyF(%9O z@K8?h?|s~5?I}3MBoED5P~`k(W!-cdq>>@Z2B~B!zIpD0Jf#{e{!};+zmSPxx>rn# z9jY!3g!242Xz50iUSJ}bYB-wog2q)*$>MTAACu|*b6uhkLA}CGY;qI=jKQpvzuCor zFhAr}cJz;YV7&7YX`-=Qv!0=@kH@evM;lGw2Rq>~=(NGN;ToORlswkY?7B;)BLNCa z|LDZ`KcF05{V)Y9Cmls|p43W42#GyB6@JHnkPwDJds_fyjA)Az;ZC&Q2-M|vSh|q& zt$P~3QDp*3>7e!lhaMj{M(|#T47GHA8Jsp7blUpomyH}K3iZz~Q^e<&4H@A^m5y*@ zNk+K+Dp5zZX6Mlnot1^tS(UqY3=}d(GW+{7F=<~W)j5J6Kg7ZlyhcciaBOK2PHG)l z9XtGfwT}I3h5t>Z(LisE7Dk};^t8Ny_oFXu4Y6Q9_v~pvlhA&CR45n!%Ny#(&+?!* zXhhUvZ{uDE31yJz(Q^P>Q~Y#!v*9l&9<+L+)g%t7n>EuC<53A!2b|Hz{hfFXHMzg; zkN@5BgK(oL@&@m&VQJJ2HNxn&jZ(hgzwwj}RDsc>)zU$FbY5ZN5!a&?t+uZ3IZLLu zTu*)I(K&DUp(w7eO@d^A80XgkVm*Tgh{YB4&*qVgJb4PyUl`(J!QPOJR{?&G4}1~V zp>;*INdASo;lq-Qg?o6Uc}HG1X|$h9q3Jd^I9$f#>ma7zCZNu0*G zx*GTfeGjg;-gRl!v`Me^cx}LLLazbLEgC>n?`MYw7Shq_0B4Bi6*|hk0i=u01a8`6 zj`TN`==v|O*iif+xz$id>;3!TX(v`@r>+lDUT-q1TIS8Nc<2t<9&=F)lYMfjK;!u{ zW~1QP$DUr|w~5(F0hJt&@MYzh{-k&q2@!(^Ab~C?@P^=+=7K=UEiT}BM0o>+Sg)+- z5l+P!>tejA`<``vq33tb-a!9CyEe|kc-l$!N+Z24nQzbrzXcHo`}GQ}WI76vG%ZY& zf^cLtyPqb8W@uqTe1?|im#)on4-g9x)V6Lxu7wZMLL3v|w}DB(by)4q*AaYj{}s;J|)S2^%R4Y)QaWl>lx|eF9dAczVpW6lH(x=U-#qh z;ba-3)kYg^GG6{$V-3NZgiK%xEC8TVp(W|R$mgL_STcbE{o-?>&w3&_I5fCYGIDY7 zCr0Xk%WamS90^|CY*PB5TicL2hxh)-lM@?nrEa*Ox@pvm>fzx0KHAWVq{A zxLo^EKG`p1V$w9EBOJJpdhH3Ln2w@RGXsc5ce+3cF-)dR?Qbs0KhC9=fix;3!T0WT z#HVXkD<{>sk8g@pW@~!}k8Eg34+b4&sy5ZFUMs+6xcZcf#y&aGQHt=wfOmTnC`kI^ z4Yp81#Oa%JvBGy?b3m}xE#sbaxRNYr-eR?9F8EE7Xx`@bYu>&adu_1h?Ha&FWC!o9 zQXEQ19-Iy}yMH=~zRI;uAku%;S5R@_cFC+K8^rI%dR;P`crwh$XNAX&!&Gxbok#US zOX*+(oI0O3NXeKD60@1ML4*#FGj5a08F$00nU)Alw<`4#1MOQCj(y5$pOTwhtE}wz z7*@XB+VSej)!p7Jn|A}1rPq!J?^(*YVa76OEH|vbzS<~TZ~N@7^JLpi(GIar9liRg zhofIjbX9n~c4ywfRdU0}jmox&*(?`_4xl+4!0Uq#Af)&E`%fS=B-@pB%O_B+GD!jjZ*SDn^f$2{k9kSjCoZmSc(Ys${tAi>#Wt>T^pBD|zI{y<}FX_H`j{Xg+2h zF3#)`gEgoL!NBZ)=`KK=R}u>N+2YSEUM(|j*iSn|mDnLoc)$LLSG}4oRp9Q1ZV!A3 z!TlGeNM*QjHE1%m zUk~{Hwa03zhQl(FhI){%XSUzuh;HhTL13)=D3H_L>?kYIv>mV)-JK$!h&#cKwJh%M zzRMtZMvXi9+)z2Qoe|WML5|LMSFZnfCExcnY09Um%ia(ogM2AqbfIQd0riV%{q>7O zbP2Kz_8sMoR163%B-n;F2oOUJ(h}rWuqhniMoIyeJoknB1i$s|(UFYX_D;XsWyM6_ znf>K4>FTywe!-6(=1e=*N?i@KNM%$hsRPan*g{FA#0P8X=GwiYD+pb@<6VyVY|KvX z^DU1n->C8Xo>{J;IF8uerH7MRrSdZmy%ehzgZ$iURw#~lqV&yQLh%(Q!(7!%2aW!MiENvBu{jvT!0-7EG41096dKj$mJlU;^AWSav+21apzhHf3X zXm1KmkkfgE566z)LWzr{)l*Z5!b>cCI4o_Q5fSAIGOc2wC_=a^v2po+hQs~Fd9L?u zvyV;8*M0Hw_3^-+Gc}g3JeQ!z--k^FDo_^i4ajJSRvZ%&mH7j`U=#}ec1ggBI1xFp zkD&M|My!bb$!b(**aQaR0{RG{F}ERy5|NtXeRsQ^`A*&~*V&hEEDT-pMnUbuE=8X{ zm8&qS8(6}>mMx%Ak_WY0bFo_dFBoWn(2|>G$7eHkc!ASk`|OLn9N#*ARqTdu2O}*; zP4&6G{6g}9^;5XUYo7N$W(q{%BLhZCcr*8G30y>`fDQSx(g%nrB?rg|KZjPqFdjH> z|Jv(1^>djjnOsT`!;c(i;;LOA6aIDOvxRGzdLAd9t6x|_A=}5}0p+0SzB2Y#~ z9_O^!rH^<0uC0mEF}y%g96H|Mf|AONNf#~`s_{5OFp}NqOfVu+fZWF@ z2zf8C%ftTpb>Q3jYmq?EL#0SFX(eYk|BAGdQ`WvuNv5kI*kGQ&U|o}kSK5okb};hy zV6fJP?xT*;i|**23cRpkN$WMaS<_DD{Ju$1xQK!7Xdb99NbV>O73h9WIALH>ilG^k zYgV*<%C`*9u38dNF4&au=QoesyNk^UmP+r? zcql*laiAe2giyE}Tznf^vt!N&F!1k}L5Vn;5*115GlzHGE$F$+%=)j9r%Wae^$bAPx8|O09Ay5NG1R5 z!h~utgkuYMZG1?FYM}%(dRzg(UwZ<296t59cN%bXR69$i6s)=75eYr)$Og!_6UDMw zkgd5~6+I^6?jxJP-DgEHZbJ!|Ksk>yWi%%N9cRecy&zI@f0gsr!4*`JUf7zsKYEJAb&- z+#mUTX5P#7zOL8xd?6LIJV!iTe@OpWu=FCfAWZ?w1*w()@#~x&3fR5mv4xhaJ9Vq~ zjsBhH(VckFs#?43zKYnoF9$sN2Pf@wzfvCpczvm^3*FmRNn%ibA}p4lM3C~+nUW9J zFBE?Ys8Dxz-aTvpCg<-#n-jE{#1)xMI^E9p%}QI~$BOr>uPF!UHQ-60vb;7ID!=)# z*;7tCv*-D7B_5cW%QzdnhLZ+(M4JWp@tn|w2y1{kxOT47hUKUNPZ9^~) zB<4r6PeURT>5E0#;g?96L^>#QD}WIZK`g@ls4Z&QiA) z5Wj}79V3We1Dpl)Wwwzo4a)1}j0>L0teRHfS8tU5r^D1@WYbkP(SL$P)VK?n{cQ{d zFv;DSQ6?V%zz{0)K z_*?xj;Dycc5EK%J*3*d$=r}3l#v)Bqh$u1Oa#5)u94X`H!>7{qL` zkQb***a%-kQR0)69auLPBZqOZA_tvt&hb?cFeZLaKDp(&)GM!=13EhE!Je*5w~rsB z7z7|?^dcL%C<#v03@5KqP;Ep|&I*n_78GD7sjQl9#FbG~Y4>M*!|i{fB+8q!tfnfY zd<&F-laJWQ|3po~ctZH-RV-CN8KSVmLHidv6){jF)qHFs<`cm|%}}ITf*`Wd!W|H` zS1m3bFIo3SEpH_aeC>D1m7_$EOl~x0EtC!%6=-?&`1u{;0B`>tCuMhw={~_Ry`YKp ztG>DO3_!Xh*KScL`v8!x6C0Q}o+uSU7r$orqOC2V_!&Z=mH!M7(k=v~@^gN%@{lvy_?Qv(i!u5bzcmvt{JHeX>trvToBdB+v_*p%s z+XShd9^#)!V<0a6{$2(xzL(&NW(}@r93+h>liUSvF5MLkxVg&9UD4Jkts$60xfGdT`jmtk-e>$@fa8c;`Gji{`P{1))>Cw!iG*Euv5z32xf@Sx?y|fhP9q< zh$of@pX(uH=UIINavlsvyvO*DpFlIp_J8v)#?Y#pd_xk)pA>Fw(jHEne%xj}F|se_ zqLGV!Ase?E%Sw*v)!API89hnz{vJ;b&fqz+#q1oU?PsdY>fe<~CvkCXxwiL<1`4&d z9OvfmMO!08Qx#+d?buhuDexdnjIRh99io6=PJu~&6$8A@CRP?b-nTCXT=h12CVAr3 zRmp(-l^c(&ChilT3WJ^;23ZUa7RRGecER_PNa+Qc{2fi^&a|Ky1Ie{I;$@|bq41X+ zG8EFy;TWh7X`|qUI^Y!3^kEX+$dCe2*K#96%+l@2^f7L)6}i1i(6`Zz3|}&Q5p9=< zwUdV4sDRAy=l!v<=T4~XnubGQExqt%woIi2D9Yt7q&YNjsh-KKPCf0=UL0l~WtyJp z`+1=HbG6>#8o47I@{-rBExy2BoU4LhlR){gjPFg|B_s{i=zottacsQyoIV&PXOQJd z%^#aE`EBgq2Ev7_EeJcws!y$LT{oW>wGz1;e0}BBjW~~7p%|nqiNUa?j~OV{6zP`Z z(=;APV>aSH?x5a%)1Mg;FjFZzq>C_kOPjMyVY|;acSr zYjfAl?+!AF(U(H%D%|x3kRe1sp-qY|LpZ$;1wr~BRaaT{kK^f-2brT($8w0Hd0PIo zsEx)vaDKXs;Ux6Kuw8kx<}%luUbkJ^lXM=z9|feQ&*%WP2>zJdyLr*IUgY$9Mtp&9}Go zgo2v(N*_0yp383Bp-R4f8?!}n<*K(}@{NtnPL+8~fdWKDGc0B}E4H~v~BsKO96 z4`RlWqm#RpG}xhJ{SnKR+QRvbr46;;Q%ZiQjFM z1zt)Do21BTpXEiNP%FT;*t{Ft96^J|TpR=}&SMzTMWhJX~fq6Q)OtxkAk&~-iQzDBDA9fD{0X3 zAl-=|dGw&D0z)w{78a>*^qyZ=sHto=#cfTI)ypY;ps~hVR?)LsbsC^0#rw~cvblSY z8&e~vxFW8Y>b+Eb#5|z5V~_aU(j@ zufq4S#^Y>|5G2fLye;2B>isN^Gt?<;RPj+>#f`rXiHW^^eamcL)g{trZ}L{!)+cxH zeW&o0)$Vu3OY$;GC_DT?xLb98MssK@T0ScG6NcA?Z7u7Mk`3${DMwCQ`_fjOn{<@P zA3~S2NK+q^S5^A$A|zwlok&}0_ezkH?JoELhJRq^IbmJTyNw@@9*X_8-^D@M)f1*~ za~^R@6s9FegMC>#EAOySJ_W+ZqC_NB5B0)jPRg!sIJDz>+PzPZO#v15%-wN`_O0G_ z!l`xHQn43K^>S3knZA`iK5va0o`1&fd}fouir(T|x_vB#5loIp8`>+qt=?pdM;6$u z4szIQs~r3Bjn9soZ(i+3Se=B*$@*89v9H?JB0@EK(2JcH5udzHRHKh{M*fgErGA#> z;=h)aRB;vqAe!1W7iQH@0ns$`ILBUuX!;o;nzHx=+Kj*e6!oU=5@h?G^2=dpPF8i4 z_}HYHPuPexMe|l$SYIJyo+zc>J9pyg2OmDk*FxI^rbOM)JK*fhRO>-hM~18zGGxKD z7)GrB($L2;hJGYF^bRA>0ESWAaF#fJ1o8|Qn?zx`JxH*8(Vr%7nUWD4m6Cqp+%vcJ zTxVC`Kvlj?t^x4wLRD}S;nUa`9ply-x1K(f}d$Ph&s3QSd^}^1?Fpho(#!E?OdS6@D;J;Ed zg3-_=!4SvjmJ`!dy{3um{xGL6oAZP`?WGbRPAMzsu|(n&6`LUcQ=xOnhVBdVY3WzK zW*)|X-y}T%Xyk$AkP5G-;rXfc|ch#HB2x?l@*b?G2x~5gwxyRM zfhDC2ev9~qZN^S=kg-kK5n{7|I!qHCn$yRP6%S4NY-A5MA;g2v-Y>^FNTq|v83Pc9 znrEROa8@Jhb0th75j$-l=SiO(LkX}7Y?TKSzP9mQWbBM*5MshN_@%M?U`w-9x=pc7 z5cHdrP}MMVkbW4JW-7yhACA_tdUO^TznPI9!h$DTba2V|EgX#BhL;(?8M?N*DQVIr zk-waVM&|*sXwcDyI6KBT`VV2P$y>u{{ylTRlpLoHGwkScksh)S3p_n|Ljd6 zaXIk=uyE74oCx;~8i(7He!T=TiKS~%^Z(aBEKYsBq(KegnRr>B`x<*Mwlf9NRJ2C< zHTC!&!5NKIC$z>0rhfEv<3ze^wePoH?){i|veYvS%wa9lL^Rj5E=BU!E6Z&+4+}8; zsns#>zD$A>V(ZPBH+i2ms=$qs9e!*oUVqjZ4XLwH7b3 zCLBg5D243la@=5{xM6->J%T&_BZ`@x)hH(1i5N?9(KLMnLA^3qDqh?dLAO+F2$;2+ z+$xCQR$`S3SWL)aFIt=)=Ib5Ov=|***O2z#8xDR#{$@bbiAkmaoBoGt~c z@|5O4wXO!$_~=C6clxKL<`UdW-@dh&Wx;*Nq3VSOcA(8qgs{(>IoVX;W{>!5ugF;! zc-}!}mxWHZ(d7PZN0S`xE2gkNS;;#!&JVYaA~ryv9)@^^&6g`17n6%yOeXwBSniMj=HQ zO>jPW46xEmc3iKjPs|zq8FC>VM$1PPHHyUz(*b+`JtOil8pkNG1v$V%db@E^;^QtMNI=}UJf1vgg(x;yED^Jfmo zYnW&1C}A)5X0>;81B?vl0& z+vaFT=l};B)1~z=xAP=c6K-l5>~-&1rqi*yM3=v)&sF`hSz{c19Ak$tmXmm>-K0=j z!bBWtv!NLkU#9p?pan!6h^>fACZ6Gv3G16G>@W~y?FIu)H?+>b5>dBDDUulKf>~@` zVmqc0j~KUdnKV^WM1G=7Xcajgqn~JB8hf0q1g%EpI^~LQ*gz+kI+9&DhdoG2nTZq- z99Kzx3ByAOv3do6)6wC5P(kc=u$=Id^63=gg5wCQ?Gim2r7+V&UdY*PzDjBah(IhLf+`nUX9mWFSL z`K(|l7$QL5BdLs5po_3Wf(f>y`(p|nqM+>MG}CkN%pMdkKhx8(7Ts)>Ro#7E)8i4x zBh_;k=%_+s-$h7okOA3vSU~qQ0b)5193os?BD`sU1aLVOE|Pt3R1R}t8;grWyDwYs zg$8Mfcm4IvE{(a3%){UFRo8WeUtnW#o@_$d9fbBKL^FK~j#04ki6w%77+MjKF5NMR zH90YKT;!lN?T{)(3V^$n2tm{tQmTGufxl%4Zv+VP#-->w?6d{F_y5Fy49tJPx@hg9 z%hN#W55e{5?IfdiYqzON7ROOd9<0|?o9wVo`0*eo+*QIJm+^!hpHIYk$W^d!_Z}d& zM${-sMm`)q2>uBKg|E2qWv6i=C6kPdC`a^d3$K`CIY?v*M#e zbh>#2S`11tDIhwW0R*3$B0XT zWa0iSi}9?RrKpc_is7|P<5Wg14lzY{lwGLB#S_+&9L5XUXM%oUK&9^QwLvx{^jd0m zHPyR4P5yX%!A?oGHHvo)IH-}i+x+LA0=f}!tn=Ly2 z0aUJ5K*!UjWcLYn_uC2po)6ieYIv>)A4%^=J5kN2m;O8?kCOvdHZf}na5G5f*XIi zdhs(&$@soD-94irSzQ>o|5(y@SDUFRO1zaU^Roj!xtz3BHKwH$Qb*`u(WUIh4}$HF z*0PY5yeN}rBP-0~pE

4L?&PDNEy8>%Thd`FiyX|AHs!UW?ydt(|$Wg;$RQGK_%Ir-}Fmh!CsI4d<{J z+^3YHYdzh64|?M05nj^Z0pBEsVh-mr#&Y<*$ABXHU5P$KURfy95C17J-dAUW&; zYrrqGv-0>RTC?`}sMj<<`kYK~PqeMg$~)?#zOXpEGx2fcqw0+g4bZDuiT-Oz`19i` zS(Y#RLfTAgtsI=rS!=bVo)oy?CU@RRnknF}ig+CnFr1(+Peqmh0FxrR;{}3mI_xHq z?9fmMJW!2q2{g6qad7^MLmWb#DJ`C4TBHrh!`B$M6{(p??Npu-+nEWTc+} zS)`Dai$Ie-EVzZDhh(b3E^k9CI2b0K$w?@}uW_;MsN^z73sp&DQv2qMx|;3>mo)v* zIJoxNC*EO)4H-Ht8<@Dem@i_X*@n{}Gv>3ng-5dQiOMAMyP(H0chE)113ZNX7@ff2 zH)qXQw#;%T`wlknn?v^S30Gpf2K#{F?gq>Eu58dC3NBACOoK3j=*e7m#r@J!hw)X05&~U9s(BQEMJ{sCC?8DcMhurV9 zlr&H+*cvlavD-K6Q&+YlxOiU9Q{uku5Xt6|okG`~b1(L7Ce#kPktQR}40n;vC7I0g z6PxUK{e?b1bdDKLDempLf|}C`2c@sQeN00Fd@N{spUqXsfV;w8$oC4Kl);!SSwI7$ z$ny&!*9!P^<)3xO%s(9U)bX39B@@O@R?X>!1cngxRP%B^dhd#%OLLY*qW_=#-OzVT zkftggF+YK)vdK?|{)<%~6pqi(n!}k4ml0d9xT1DNp2LO-ErpQC^Zfb64j!05P-b)| z$L}Gnfa=vBuefd29e9q@Sx43U_fIeMWJ6Ym(UTpMqdyY~taJAxQJb^Nd>e5*@$_iKIV|*Cur35Z&~_5oqDw1)#Smy^ed|!_BdI~F&q#NeLDw0P zmA+uJ<~s3DFMil7?>|NvJa(++M=-knQ}C5jCMEXO;l0daZOnb*&OPEB<_{mdXxo3$ z5seF}9QapnL8BBYo#btbFNuDe4U?rLQk>#BAf2r@H2;IIuiA8z4tp~HLQY-PiEKN zN)6v}Jy}^|bcfof^N~It+XiA2El)OnJa{|BpVK43ps2=PZLoj#WoVsrhJ>Yrol_L6 zNMZc-5R+Wfl>C+9HX%Y)Kb$w%hUx_Jp3nGu8}lJyzxzipG58R1V!c>yZIt(+UhO+J zY~$=%ZjOO3Rc$2{5R0q z^+CnyUXL^!@t_SEUIsCYU!xmt;(Hor-r7k<;UlX8@n&_U~+5Y6ARPm@x zGJNzbm}nO@LnUipU*9P2Ju8ut0~eT;0zL=}#}0avg`pg+VYU0`Y-?BsRyqEws#e9)_5oSHCucjX{V11>#|4XY>T!F=S8k~? zYp_w>tmpIDD?#eMHq%?E+>1Yj3>w{Cldc1SEgl3lnUiqjL4&QDBSVXv8JpFDnpx2^_#_Z^SX&hT*$$5NSCne6@S*anS_nVonhOPC%Z^CwM zyn%@x+Lr_JQPW)0y`WeGRc;ula=G#m@5CY^Lo3Swb765+EV~gUD9FV{N#>9yyn!E= z855-JMLJsA0R+YagS|+%UkRrJb!bHMQjAzu!kw>%uW>E>#}dSAQUFe-bR$LWo45Yc zb=o6>?_?h;Dko7+)F#^H+}5eJ3{nf!_MVtg3%GQ8%?7Rq+yxvFw%7v=RTxCNaC)&N z5~5}Kg`Mos@X37imO4UDPF=Q46xQ&R3i)B!n&^Nr6!-P>XHclyOxi>!RSVMYwXrU! zD>CDEF?X>yix-3nA_HY3EuU^XiVPHSt%ZTIfiX~I{>7ZuxMrsm{6$vBR&73+p06FqO8b|HNj%sdzdBJQgbxy@!lAmSbx{>~qcw~(-uVNv>KAizzv$eTA3nC|{*kRrug!TP`EOz8!@d9U&`$Jgc ziQd#?@7bWwewClljI7-+Ig zIrON=*hzR-#f|kF-!Mw{>|i7-x4aUcr2a&jY1()Q-{Fck92fK2*eV$_SGr=kh5ZIU^``Afdulq9D1W>8 z!Kt20Diw|Pmws&Mjq9IUk!8K|ZLOl{tujlz8a=aVl^nd;2U+xr`B@!u?) zR+V+ycH7*@UH%fs&TVT)eXbhGDP4d5ga4=kH(@wUwR?YmqAbV$*6g@#{iTOsK7Ac) z^Ln3NyWL;w-pY-C1%yhrC%c`yafn4}OiroD!ZEBw((J$|%h==f^%J{~iLj5;XuZ9yzh15+?D^MA#epZDcCI0-U?gJ1#V_-l znusQ9o>NIr#x)dj_RSj%Tr9B8d1>7?htE0UcQiegEBLa4nyFPqVbG=t4HwNMPS^Kw z)GqNk@2>Y$9RsE8Cr2&wd(ig;;E=uUQhZOm^MyfSMcYdn4_|SdNM_;v=gEOPHB~Up zS6HEgGhUn9h6&)PhPQ|SeJt1K5&pDoS zgT_u4at4&crYr>uCJkwmTGTo?%9Nq~sKqD9FA2n&+)Y^lHJ+~q`Z?1{TTKNiLQUD{ zEkY0NKbY3N@~>TzuWl8y9Wc<7WF2N-kH2eaERnjm@#9hV&u1hH zJHI!SP6KTRO2ESD@E-;^^KWMYV|jlL?PB!hT{nW_G}hw@?aA`3sqF@Wr>kYcuwtdT zHI_zcA0FNse`yhby7oC`cYfCI-(eP9tR|FI2U)$8uhWTp; znu=hk-Ih#YP2k6D=mx>E3r5calPacnJ};W$@-8e>;3lpJYvWOC4@hJ(OveqtPy2uH zGMu^YKr~LfiV2IyAr>)6?%EnNuMK|lf4%|+0%oNRE?~9Y!#>=?d%Bk5+p61adEQ#W zUe$c;NQXL>yW2>xpbGnzp9xr&qLg@b4Ko5%ciOeF51E7eG_I-JNN5 z&QUt_QJn$_7CQ8CifJyX%@L{e0KiBLj(xgxDjvS?Uedb^%spTps8jfnYb5}iUVoMa za7D5jt6Z&-Hd-Bi^MQ!wuvkX_hl%dz0`NbGUBDMDN_y!22au@-hS}0fjgc!Btd7qu zS{*m^tC%kfA}0|V4g`@^CWiaQw|JV=XA0!R_lJ!1sCZY5oIvDR8((es!4z@%5_P`` zb3BHFVjVHZFa(EHjTFBy76c(0sesri192dQd^sp`E<&UqyOQI{^yzff9UTyygx7$KV8gp*H6?upIxs^ zUmFvI(>GyVA;3ph)kzS8lJU*B2}*VI6MS~zJp2}br=}tO{PZtqAM9C#QnxZF3)YKg z3!p5h10Kzmc9P(MXRzlPcr-+GvSd$(;L+I2t-TR48#0C%C;ZR4y2yzDah{WMLU3!~ zJV$5I?`t3RYTb}sXP3~T*V?mwHdQ+%MEa<^+_z233>1E6y$dEAQv%C17f<|cCF-d0 z(G?V?F`~PoK`iO68nHem>;2?GkuS;8#x53~JB&1|{c#@%e@83r-i0E3{tSjG&|a+m zU$OA9iVaOf2;%~C7JuO`6l9aMp{4T|vV4%XjlwlHTj1;5sar*`GaZRpAmOjMs4sT` zFuc$t`vpDlPfS)!Zfdz`#4CDh+Xl71m&8jA)=(&sfGB9)QiTan^XbEtaQ@R+M9pjCzW?fO zYWVz~DdUHwXq&-!IDjkP$64a>t6n8?Fx6cR&S~2qFoam3&J#k=aHAkt zb^z);y=hAcVBOG7OShX?;G{QvLLd6NZ%TrDut_-}VE7h!Zg{8D3FB*iDrYaat-i7P z#wuKBLr)2Uphq8oWuMOCMsv7Qcw}JxGmjQbJINnw=x|!7WQP0zJ+7hGeT`^kLI#aElbnrydUwTIYI&X*x zQbz4~1=DnXFt07e`tEewsy?37o@jzdIW1z<_k_(=@#3F&lGklG-YMKET;IlcrX}`! zLmUNJ@${Egyd*b87U&v>BL>%^tpIEojNyQUfpmiX?7%MO3iKAr_9`^bz}5z5uAVp> zk*=e=S9JxvMe&WNZpmgZ4Be|~9$K4XrA59<)2S;{c!G&lZ1`q3sq-?n%)I01{Jm49 z=@Vbx9WV0up0X>ii|7ltcJjBx&bjEykcfidE~6?dns)z{RCnWKMafv@wAntJ>!=fRHp#hI!t0+XrSg-N zxYWOP)N-^1kZRO9>ND8G;zv|f_F&TV=90o_j>%bsvIxDv-HQ3eL-19+78z;%h|q&{c!)>%W%^;relXGql;x z!TxEPkou43aaF^c&9c%mCrZLu;yPmuZ)-oj>ew|QeCqzAgROFx*t4dL=CwBIzs(6$ z<9K+|N3=S^`fFHn&c&Piwf=5C_Lg1F;t09u8uvE^W*WNgrpfoFmqW*RyY0tH?pE@v z_6Hak+<&&Qe^x?d2ygD#WqPG|R^KLFtVThO@7c`Y#jpKiPFSK@3gjB9tEQmpp~ z+W*vM^XNMbj7?L@?tqO(Lfh;_J}5a7E{)~BBU+^TPV<_Z@2bWQm0NOUatdG0`y5nR zAtzT+KP9al|BSHN(lfF%y4?TnxLKyeoz%hSYQmg_qly?4%Odx}HKi4*La{9Uh7g#r zo`W{+RU}*JkMD)rcIuSJTfUL~Q>MK$3x!MrIX(LO-c7H_xjd&0&Y%%w$MXVv6BDXG1gS1-JGF!#?) z?3OD)0R0V?c*?kn3osPylt*olp8$RoaM}|V%DSuzU_mV{HxleXF~}(p7DaF$!0~~& z9X1FO;+cSky%$_$K(G!@8-`4d$8*9tQ0mnVPBJ!Xbqo_#^=wrkNE*~ zOfrjrw-AhH7^VOM1Z`?6rt66*k-KrGTdnunH_W_i`dqz{PuQEj_Hz2%)w^}Y4ULD1tqTo~s}v!e zr7tM}&!(^=@N6X4a~w=-a@~L$AX|?{J4WPXK5x7C{vkh)rNZIhsRYygSAwG*BaJpm z1qU3t@_Oxdre{Ccf=@ypeKE9Bu7j=)x{ppm8G0|Q>F35hsUFq{uUzb~pq3+F`moGQ zb>|z?&Vpui8P!KI5%fka#4nRBUph-q8S$U7EtaobFeT9~jF_b%&PlODQVqos3=nf4 za}R;jWlvS^Iul*YMi&XYI74$DblXmT_2Z7b<(HYQw2m9y5B4fxJ3JuC4zUTVCNgA^ zR`-P=%Ytwsg~fqpGEA3~^-@s?i~rB-`gv6IFzZR9XHv(nC*t1}#hF(l#Q68sd)4+1 zAjJ6Ob=;+>KpUT+`dnGUSNy$B+CFROZW&^Qm;@B*is_7Hd^3Or=IHBT^Au;}B#C z6_3QYaE&E4c+f;I{X|_cmz5>FR<`a=t?1+4B;#7;c`n5Jh`a5?R6h5-;Q|~QfXJ(1 z^-!%mEI@@p%!1UAAyb4{$C|9CWQ$Ad5Wp@e@h=MkXt%aAF7kMQb21h$vwDE&9&lovER z*DxezJ4Cb7f%QtC$t3twPQLD+ctH0={zte;*Tq^~^4Z2Ur9$pZNe-)h&aS9F9p%Qa ze2@WuC*N+LEfMq#Rdvgji8T}0K4EPsU1m-WQ zXPfw?+MVg|4taN6C{q|O;OHO50*cq6s_7ERQzy$6Q~JSg277kxrW=R*E0g3KQi7D_ z12dZMX!D=cH09`T*xIi0!cpVtP7A+P+b-m9pPKF@b`B4O^SIlQ6;*d{u({^?X#}s= zA+0kh(c!hT``d=M6;&rzf??K8mv<#M*~ghnV!vP#owqe*k`*j&OT7uY6_Q4&z!qjo zeQV9BHP8I4)9pz~x#`4GwaHQGPzj&$+A8B{XSKTFYatgz9vE)n75+T3GG%44657hl z?`8XKyUNC|M+B;?w(cId;dI&Omcj>&<0ElznT%V3ihPDV=bkqt`mGW=BJ@6B^z-nP z(s*U0m|Tp-`md?e{0BQexjhya+O+BTA=Ui+{Arfgihdm_dXn;Wal0*SF2=^Ky4c3j~3>eZ~G8F9)oL+_ODFs)0>NV6&#H%{M1$p<_k8C zh}mU@UMPGMb@(V>rzvU!|I64bt_c+~?3)akwx_Lmjeqdu8SZ+bX}GB0Y2LGBed{`| zprOIW*@J9{^GoMv-x%w(tdCujes#!RrL&$i{R@)ObZc=^BHkCp_{gs64TT&&`#d*))c;*_>WUYEzs1>(LRcW>$ zf0n1XHv%wGoR@;zn@-2f^_-5S9Z`ud9jZU?3UZ8r<7@RqI4;+;xJ$60jd&yC!Pc)mJU&Z`kV1j@&v|B&G(;W?> z2-<&!gNG~Kc10I$&O^%ki2Err4gW2xr^xIYLzcf#4 zLjZ_BQ3v@40Dvgu|5S~|gP+xzmCmH2!8B_LhQnEMBjV988?1^6fs zWw+oNx7yHF3%=JFL=d#3u2sNVQWW22esy7P&yhX*@KX-hcw6@R->~!x*aHeo0q}k9 z>-(3QV==Gv-)LTzNnZ5PE0Jv1|BNs3>Re`!$aTZ9#ZUvuwi(*~u7R1bt(@HxAyLks z;XwYP5efG|`9@wc;zS6HOF62+fzaPlSZ-*o=vNTQFLzKxO?)}$O+60;OYz;{fsl-_ z4wktlqFmz;)Wtr4AWKQmyxeo$2+*o|g#hNY1gZx_k6>O~wKynnI^Yr-B3GN5@e|bp>4x-Cx)rmj=`S;8_($lL%0LB8!>S zmmY+;ZlN*rWi(scw`xI(zmnrB6fUmeOXywd%fd|9+e3DZhzLcfY>#M|Ymgvwo?wB} zngGr|S%vxA2`NgEd0}4GUE(#_504HycTVI z^_KJBe(S#_F}1B%;Z3`t;xroZ4|Bi2-qZDu{oNcXgCH{!9-wYuT3k&XRpii|j^N6k`ZlTfH=%gU0GG|atud#co>mhvGp z=UwwWnU2QiT2C5%jXe|gI$o>w6Fx|R%==B|gqXMG16#KXvMo;{d#f{93j#{cJ#unA z-|~LO=BCSgpC2jXK2yC_KRWwBjJml&q|ioLw7kn@u=XbVRHD-D!oZ71C(3SG4hwEd zkYW!~(uy$p;Hqq-xG(-gQByCQ#443&hi&Thx>6(45_9eA%V;(Gw+@E?M0xfaUh6Ek z7r*_`*u3~dw*Sr4cWE3q<>dI+^nZWk8Xxg6+rj3wbjbXvz&#k&8;z}PBlGMH{g+nc z3zskrqm_p=-s}XK8y&UqmsT8MW1FGyAgM*4rn9 zrCTiganH>>D?aZObWGaIYZmj^roWYSg=Nc1_(}a2W@3etoNY<?@0 zPX_chqloxlbmyxg)4{s*!F{c+l-x39s`=nV&J7EGHT2=oyRnztn-@D9lg<#eA&(i1xg4G= zGvA0GE^^gXUJXW<3s#yUba~w#?_8!x_PQkxb@sYFi+1Y&r{69n@8Qq?y-j?ec8?7c zv{+O@aX}`#{Fjo+RnzeHxMurx&vEJgh~@_Q$AWaj+}#`u!(875!`zCdMVRiQhYRBR zm(2m$6U@RP{$2LzF~U)jSY(UK5ojZeb$DY!cJZ>?z3HU=Z%J{)K$)J$S~Ry5 zfc}vGa3v*?fMl8Iro;%*gOO1mTZa-K7W_s4HpC!AH0kWG zc3Jy&wl=M2$z(O&?A?7Y;PuM)J_jblTOWf~|2Gw!t1g)p{{`l>6_#v+)zbY86@v!E z3ZxsR3D>kTYX7dhHyFNwbRPD*GQ)-YY&(+pG9DbGI3k&G597PdvcN z6|rn4xGYaL;oIT#FH;4$W0w2bT;Te+(Nx|e9XPR1yQ7y%SS&9ErkI9MU#k($L%0bz ze(TaHO&XABVNjaJ)=^iGBF3-CXp3%2784r8AYqqEqPSq zwZPdu_!c3hffuqYx7am5U#qs`u+5Q9sB3(lAd+ltb>tGKo1{&JIL|~|;im6HPflf@ zeuppPmE!5LdBkzJGFNM$E*%e&Q^3@axB(z=F0GjoQ~|Zs?q9mUr+H zOKaR0T!YWCY83QSQqaN9sHC*16Tw=KoyLWw@nl_s_|g^@>^x7xOEjlryfvRA^U3j5 zE${7X44tx~d>`%^3hvw{7JihOR9~Bt`F=Ed#FS6@_?wo>h>ow*|A?doOf^$;ucYAG zX?<3=opt>EZryHC{U|$=&U3BP>2~j(d;2f)-9&BcJHf9+J?)C#%;uim+nHX-8{yH) z@xFfVo4<1cZ+E>v@TKT5E1z#T<~!9qBvCS|krqA0EXT9)(y5V;7eSQiRqpXbTMg(4x}v zWyDD%fsm$d1Z0paqOal~i~N8OL1-`?kVTe54e7yZigKESr22~tF6!{)U6 zIkGgU?l8{~>OD1B;q9I4x8>sgkoEHOwBRc9wDh}WRnx`~9VjX9AN_E?6@Sz5WTAD< z;X2~jx-${M&U4g+)Rzqfde&5$Gp7BGOl~Vr4Q6z*X2vIEWW?#r(;q)k8?!5}SJ~Z2 z;I^O!p3&$wVDZS^>KIleyW8COMXMgCsBlKMSN_Tqs=|Sig}qUeCC9?ikEs!~y;v6w zS}WQ9skssLd6&fme;EF0kMW_YiIQH!{24*jRnWL<4`2eqeUsc?0Q?*~djw|5v9>FBBEX;78APjtB3uZdQ#uco(?`Cfo};4612cjvo?u>1aD zc`g%H%kEviA{UOFf0TP+J7LVAh3y2O>Czx(U7QCC_0Z~n{fjVZwf|+_L_}EW%dO0< z9XVkkpm21Q0ry;X{(E`|?s{QHsHo4V@1w50e@__!+`_|q*DIE8gU#GD?L;Wm4#F9JA1EvBCESzx)elNuX!-?@S z{Sk6OIY~D|b}1MS`xt^=OA1IJ;nhPr^u;yA%5I0~JQ}^v*Y%n?L7>1J)v+s@U`Bn0 z<1)c-D)GXnC)sVoq|hq6UHy)qnhUoYZVp)Rxb6t9r~78TgfT?k&untEg@(w z+^UQ;wfwn#BR-r+0SanBi~eFv>IwZ;+}!E@nZyk$?f z8i!@s_gar^FybFHZsCo4qNg`1X2jTfJhZ)ZK5PFnho&fygi*STGO$A$=Y3{?JE)v(00R)~b*h zfT;uK(cyfsVo!qVBNR2pR~D3{&uCw=bhyyc(WY=>PAS4s-knj|c%C4KvY7qtSC<~&zQMpmP z&R(bY;bf-8_a_08UG)WN#vCrZWp^C&*#iDcvl4=gk3l#1kZv-DKGmTAWItJ8GhyM|4NxqeQTn1ZFaR7>e}3Oui#NTKU^6 zk?cBz2qHjaL^5@$9$;ow&Dl^T(fxcHs4ZXLvpQ$LsXwp}48b7|e@5j%Ky0DqY<_na>3M(iu+^z-s)Up|sZlQdE0LNvA!l;O8ihREr2;nq)l=K6h% zUsT9d!Z{pV$^GFF6$Is9Sl&Cq|9ncY8au&AuW2n4MQn1OJFe4!A72e|E<3L`s$mVK4*|yOv;8L0K zb)(jh&xt$Qc1Gr1VbS3)fnn?6JqIdZ9>Q{mj@R(q3BP-AlRmgRmA+C8e;jKiS1xT7 ziXv;$*@XH_;)A(UN?RZ5@n&lcx<^dsvU`FEc3Od2x=<`>?nW zUw4VM-dqPT*|dOKMb&!Yrkf|2%Ka1dupjy;?LnAek}x_?VxD;kS@flsz&bf$!2g?d ztS>GN181$hx@ouy%;qT#kBG5Hto99OKhUbk7>4r=4)*2eHnYVC!l&}cp&5Ug)po0!*mFJ2lV z{HlNMsWLMx4`{plu)NaZ1kcvZX|;(m&#~442cvmZSInIev;5*WB$@ozHqB4`EJBq_ zOC~F#w?NiRH^mhUS7j`8ljtta8N#M*#ze1H701TU9}8me=9 z=k~L!E&sIC&D}$IL4*znG#|<4M?$%feo9?zM%dZgspcnMUR!76dsyT-eMF#KpDTmN z?)O1{?mtbLT3t8TUbG;J{Iy*Ed(KdowNd>)ZlC&J2)z3{F$Lzckm0!K!$?4|h8Bm# zIFSLtY9Nfh{@tqigHNZBTz|k}p6TCrc>_A%AC^9Z8qISAX$lGh8tB2Xw8SynZO&Z}!*Amv2t2d!)bJea+6yf1$!7+2Xys@gO=DqIn7;Lk+=-|A(tI=u;Ny zhDK)bYjbFBx1I4DkG(%_eHXX=-Pi1sQEi4NXIvlYW0m*%KK$pw$AnEcm@xNUln<|0 z=BoP_5gK(fbtd8u1^%2q&~$y_gm4Cwjq6}*>M-wbYxLKAJ0^kD`gmHK9c|Broe%6$ zIBlq%65Mg%c+}xQE|HT$tlx^Y{EFSs4n>5|3bjXn(&U6Xs#q zN&r&nfqR0P*WBkEJJ#S$SvxL(bP4bXJm^R?f-ZrFSWM;H+N8jyj(s(ygSoOhp6vNt zAoM72N~RA1`y-YJF7SI0W_l)SOt3jslh(|>$Y+?CVVfi?Xy6Gr0e-3P5)v#c6$-rXft^kR?H4v3KkroB_Pmn|kg}|vj zI<+Xa0K2xS<=DQQLY~vFZWis??AUVUu=bsegcRmHwyB_0&YuP}Xjxov zl-AtvIe034*uO)G6Dxr9Ro-gRD5bZ{y^1JnLHa768UG*Ty$d{)Yui3NlBS)kHri)e zm6Siw6TepQIaB&Fhz__lHD?6JItp4 zdEGN(*ZaQD^L+2~{l548f4}F~ucujK+;iX8bzbLr9>;kc_-RcSD9fZetCT1bl8FJG z=FDUYST?jwpRBwZ^)&R5Vb!o5PyBVxk6V+CvzHo?tVbL_a8$NX zb&Ho-dFcT84f=#pO91j+c5A!gxceL^SVz}`ME87@Dq#*6%a9EU$h@PXTWW)XJCR6+ zluB-eG2o4fx%6a@y6G!Yc zXKOZfz#u0Hbq-EI{-_Mqc1?^z2}&#ofU-=0JUK-YV1#-DFLN+Y2FNLq8Hy!stl-&d5c1!c3aX9l-2-`#`g`H$m6;6E2e0`EPnEGszRtQ-Gz>00M8f7V^zQ1;=` z3eC*6k+aV$uQgPL3|_H>Zp#H9i)p=Ike*gjx7g#X$NTA*ZU^v#vN&b&E%Cm$=GVRp z`)2FCEI&Qm_D|2Hn+WE_7TCqRFvo=)ND?r|1&H#pVHR_2n1uvvOD}9e>l)PP5~1Uz(8y!m4K5J6J&PhT+Hs= zEu{r=4|QaT4vQx8F(~RG0TKLexnhQnEqp52A;au^zg0z^)QeC?UX(i5sMC>g4X4CX zhFFlX(GM8q2dM#&A9LpAh_PAyIs}f^BQXN$$h0AWKHv!|R1r|cQ9+bsNfi@gg=CCy zW8F`I058)NbtA{f0yw|E3j06{Lfs`lg)#pi2?%;aOCWKDC#Qi7 z&B5_O=KYjR2O0c_;VMwJ%DjCGBxV(Kel7{bwP1B%0(;$ZXJp2Z?*I)Mxly?@GAc)A z>py)`&n^#e5jV^c&0{gzs+|ze7NoA@TLhq22kwnEr|Dl0fxNVP3UY(D6KGYpXxCCM zC8TfWuPSbG%a3nr;C*rRb4pg)^mRx1D5Dh)2UpG|E!XkH^^EM)g(3kmj{#%}G$P4h zO{L2({PZ&wUp2KN$ru+a&MV5;`0HK|D{SsFbaVdX%m_c|I@;;aG@r!nch50`5=Ipi zMW{lEVZ!hpG&N9&`L390)}q8;M(CMFml~&|`c?^e*Ow_$<8;fql@ZGndZSTX3==S_ zy3eIsBz$R_4)T>5CiT=1c%FWzOGdLb-{32@t(X<3jcytE)suQieYec}2kvlzmt-1m zHt!iPAp{h&#BnX)3!lff3rJ~wdSFI*bUf_`4mS4}uG|C+jmZsk145`nk++D`CvYU? zdQhUIXC4Sgr;tQ%DP2JFPVVfqL?S9baPI1*_ZU!$GVXBCYLUo!FbZR zT$mn1OLBjHBc^B9FE0C6&T5+Djq9Wez$2ZDG2WSSi}W)CEYj_P(oFI?)4hu6Nz;4K zIH8A=66}=puFYu-%lInLvC(>*ns7Ola&eFod0+_^TJfGpPTllWKUp%ag;H)I*?bhP zbKjrrjt!lBOPp$Vm6(A-EuzarP}S%gn?yKc?Ar}&}Vr#85Um;vs` zs&JH;mynv3wIzP%!8}tQ0+B!L*-X|#&QWLIv+MQT0^f6&gP%3#ARl+`gJIQ95C!c9 zT{mEWx-}uTY}^O%vz3%EfNoi}z500dUY+J)-7OURAGl4o_X_nx+3weuWTd%q3OYN@ zFfNLjm<4A+1})xjmP%IMn7!6HtQjAjry@C2ld?*eHnN+3?8Bua=bm@P>vq)xi4*-c zAaP>9Et>%qMhy64WG$y-PB1d-?g0z7M*GV0$z^0eedA~c{>UQ_JBcAKbH`dAbRcT_ z_;0Qnw|PGM_ojAoO$un~Oa&fnyL1e?q$>r}(s{ZA4hyN4&V5#?%*&#Wf~Y3mB_Z-8 zAvK}nnl^HrSS8VWn%nnRzJ2aEVrIAf!xEzDaAb0(>b%ZkU&Xj=o|_?;JP56PPap zg4XQ@O4syj*f`c?Sqk(A4KE;7QB-Lfg-N0GbwZn{6B-lpyWZATB)g7xAuImCe;#58l3a&9c5_Zr`X<_rOIk5K$4;7HQ+w$0lTG;L(Q!6W$l%jJ6(k1C$ zf47HZzw*<>NpE0d_?z+7%nIT`{HBY-$rrw`5K+&5Wi^opaGTGVJ%`HNU;f z+&5|5!!NZNClj{~3kYtN40AdAJD&_AHXAwdtdjd*dL%~-4$Nl#PYUQkU^@V_tLH<~OlBYxN|aj?RPr zdALEe={+-3ESqxAsv0K$_W$m`htvcA`jk8RI&}sM1*VdTjA4g8W(ldEJU-XaBVBDk zlsuAg=0yGKCB@DO2^aElG+2jY{hDfR=*gqif}-Gck&#s&n*$M)vZ z)_fr~!1sMq3iUSk%lng+kV{LZb0v|`p1(kmeB6_Q<$tE8un909wjK$@IsrwvficUa zehaUPm-<*QjM{75k;wpIAt0h%f?UfI8rg_r0zQ0LTvI~w`aGZ z(pj??)a!KKL(xL#2>Q#_;^_Ly3~p!_SL5i{4dp3$)W7Xkwic!DgsJIh?1Gr0SfDos zt6XDO-zQ6cX?;w8snaz^_lqkeKh6e+MaYpF(^I9kXSCPDdU5x5N*S zBtU=BT1M;} zl8GhIVI%Oj`huMVrlj8fmizQw+ZTh1Pb=OpxjWO1T*TmU2%Yj@#>u?}HtY0(FQMOm ze8BIASuFCPmt4s?X4e?JB+_G2&1TT352*(s7cS$QYZyg1#>ds8ry$97OJB9D&=Gx+ zeRyJZ>lpi9J<%M3gQVce<&W^npsqz_9sMmbE`LsMSY+AV zGWdlZ3UzB_CGl<8N2nyGsX}mf>s7>HvM7MbFb6NhwU7l?Pti8ma3T8^6TSp(5S=f-lvicvd221c)8o|8SNf#K4 zEFv5YjLS$*nft)cqq$u_MJ46*I2|85yjoyK^uXWL29C|0W&>VXcA?AJfRy7yuhtOa zMe|5}J)uSyJ*11C=+T|W{g%-3od4YZz0Nrbk<&nV=?D1rIJl|03{c<0^$0xPa64Di z>onkgTI5_)X@1A%dCedQHnYCalUSwdLbd!KxU{w|r+^i0I?s;@Kjlm#Sp*AGWKK#@ zTw+#A;4n96dlX4`P#_p6Kop^9g0M+1NU%a+k?mt}bbuHJXKOBGnGVdr1>q`jq-uY9 zqq8imLE)i++Wm; z&&iKP(4GPj7=SUglV5vOtlNodzY7nr5jkV=l~gmgzm++q1g6$K$~5^5=>x;E4t2 z!uRgfKF1zKs&)vaPXAQIeoABXIJb)mblySF;JBYQcO`Qt;R$J`pq$V>8d8>GkF42t zuOTP?7=*A(W2DN@Cv`ci4d)p|)y%E&OA-6QVm1bA9L#v8((%BI_K!(4iDN5V!3AW# zB_Eb5=*1BmNTWUS>M1;y-$TL_cZP6d?hLkuP>&w;ZMM_%^bc^hWaiU8Q=$l?py&-k z^5&>-jm<0%aAsmo5tQ&+C8|N*PN%3Xq!yhu{(F1C2>0~gt`m<|vGJJYxg+3vePKIv+g}gvwkyK&$Mkh{VfkbFI^Ei3TB z*_;-+GVcP#x(hsRAA}JA6e!&$?o+jp2QCwHg35w?A0AC#8Etz1t<$VZ=0vLvZFlzX zo9c>F@{X95`hHT_YgVomPRsRx(dcm`0i?mKdW z89Gi_{l|$waVUNZRjkx}8G{#75xgi~2xD)$pe-rjf(;_@R}<)%4dP(n6&%<>4D=^F z_`mmgZ9=QU&b_1Sw370dc5iuhYQiG&jb)4T{Pl2|GY^hu9Da}NKS@2B)8!F}Q&1m| zJL}c#7w=%D^2*($X-{$UsdBrbsH?W=p}(&CX1{6Mu5))6uIOSWfS4DM#rh$1sWUg& zEe-}^WY*VxXk}dcen9i#_`QTVY18zisBo;nuj_j8q9m$M*srW2rW5tyePk<{n74>} z&E;Iy!r4{l4Z=CW+YLumvOKXGI|j!5Mg&18{#?{7o(>1?hBY|F8ol!)0R!nnkbb^! z@a*njmaX3Qq=dCpa9(JVk;Hlu(k$82^>NW-mR1dZY~+RWBYQ8{IKs?o%wK{t)*KNG zCu$MQK`xF({nTOua&f2Sw$d@u-FR$m&NF6$eJf^912&LOu&L>= zsV!kskB3c-bY2-~Pn*G>CimIdb3xxm1H(-%Am~h@12mr^9wmVU{{D^8#563h9eM<&3Ad8E2ztGkN0c(RL?oU8j`kzgfKB{_F2w zOg372Vt9AMjzkQc7@F*)rPUcM0$c;&#d9F$vL386li*~XWfbk1zR%fFHJ@=wS9r}8 znb9XUgwESIZEWOXgml6)8XEF+yX%okG)q~Yr#3<4CVk$;@T$!w@Io(CGg91xn%U)~ z?-cvb_0%>|#q;FW-)mQV(J3Yu&IL9ATDW;~=#!~1a8#8U2-Zy>_}o`+8rKXaH3e&2 za`x4;E?u1NHz#XLnrX<@(*-k<-xS_HqWN^@IGjc}^9H-xdSIkVL)1x3eol5yfi)~e zqRRFiL|bWLdwDE_w5duP>|JuMCR!_-s6emNs#y^>kXQ(S{VikuA-@ zv}a_=rCMswL}zXwjoI z06$CqmQ&vMRcJB76a9T}iX|tPk)kc{i+3orCApcp<$j;q#cn_ z#9VxYxgQS{fk0&5x_b8}se3PJ`*$XUpCNj^C?XD2mwtf52D#BgoR)ze;+`n0=g)$B z8y(}`Mus)oIjG;>xTr{H=I#Bi;H^GCu22!tj{f<)C-ejZ1V1ODh=TxovI^u85QoG~ zE!x<)T%5dp*$BD8koQrvB_GSe{;Hx7b~Ug@Wu)@Hg)F}_>(%Yx4e@ppb8Q2EzchFD zWKD0q11q+z-iH5t2o$V70zs)XHI`!MR&UW~2+4lH5}2uP4CmWswp9DFT;ioN9x=|S5=~Fi<_An2 z@m=Q`E!I_%b7x~KD{Lx}bokjjR=WvPCMewAzc~}mp*h>jzF3>G<5WyAKg-F4&YJdJ6>haR%y$-oh1Gx>1^| zYblc&f#psk9f)%Yu+DfI1j^N^?AyDzliS7z9-3X{=@GsSU*3m3@5WRD`mkG;2lJ!* znU^**IY&#I_7umU@k!7n;L#>g!=W;h)U30Oso&qcv@ z;gJhUI#dvZpl;gN_Q46arc$mE1}3K^WTLdp1`eAmR%VlQ(MEDs?W%9CtzwLBAT3gID8=)e%Z@s=o?k`eIplqv+fU^PKp#|cekWy zN=nvCet~%&!CF$y9pRZWR*Bdb5I^6rtpz%{<6i_aQGaoo;QsweO ze8U!x`7S*lIr+u#2}>y9v-f*W2Jby#jh$cm zK3h<{Kb`DB&{2AEQP7fTNM9(o@7?b!JR@CXB>?&am*;SMc8f0+4@lS)7O%JS0jo}_9Z;snMAl=fD}{3TlP@o3^26XBLr_nj+(tv6Rr(cJfEi~6P&Z}4g*Z6vwG zyG#Us8+N0hCpcyXRAkaG1YZhi;J*gm;y4?W9Kk9RS>ikbKEO;ikd=-jdK)A$4v=lB zQk*>Auk!7R=TWn|%aU61JDa)oOU+IaH%p)O<`p=V@Nkta_xxdpJ<&Ig7tkPFj6vao z)Z#(?^tTN`hk7#w+hT493-LvkxwKs<1|HF}l)QidWIj_v7yF?iC>#r`WAb{)n}L` zR@}Tv+cx+=iM035)O>(bf@Lu*l`GQ+Mh{cw=N?W%VkGnyAtE2uSx|OJa@l-}-y~S} zr|H%6g({yt-in_}Lb}`~03vATSEQVN^?pfc#2Tfu0^ozw=x_R@y9@DPZ~#&U6qHC5 zKq5i$;H$K!74-kI+*%y z9OkdHoe~TW4N+8(p(AFnb8C&mLNhB991&=41wD%^r(sPv_1o#O2@b0Q|Gr5JO0%rX z4s15;IWxH^(R}{Kai!)X-^_C#6|PbY`^Fm1UzBzA8_1(7YOvfk5T#|vETWMpOn;Q_ z1cshRpM%be4*mOx6ssXGBu4Y+uHyFTBuCN|zre2f19g@D-G5Yn5=LG*l&P|^UKnT= z^zHhW=i+Y~g>V5LN8BID=~Co@iA`tc-oc5FA@sMrO)#3Bf`be@TSLJlA{(liLI|8i zyB%9|A@Q`XX%(#1#|+6y|B)ei2IzD4H*Rsg37C6$?SNKp0;#W)3xJ-PiA>KW3U=?O z$=YJV8fOf~XL$?h%*uM4 zVx1dUH3$wuoLm0@q5&KYN0}t(B`y;!D&(h`$Ma<}=V#Mn4QqWr8G{E{dXeHR3u^dubE(vOy39@wgu)SX7_6NUt8w zTYRUwAjO^CYy-GfU>%i9eA|6y`4aXlGm}QppQe`wNDj)B277k0B!W5~c-9AXX^6Ih zjWaZ8f8csfp$;vyS*0D?E+!Ga@1_BUyZVaNdZIuQc+(z&cNs@{+yYthE@*vU#Q9D2 zn?$##zgz>!9UY>hT@S@xNNS~JNF1Fip3X?VYqw&}LbI0R7ho9!_=GvpZr@CS-;lM3 zjyV>ihP#Q2#ZG`pE-!OG@Md!DwkMZcbCF^BF9u(#01iB+^L>G$Ig2b#C4Do2J;xQN zFk>BaB`axjVFyKvufp$UH#3{LB*|WVI2PZv!S3I4Ag}wq`vb))MH{9J*()eQB~TR8 z0^u_7^~%9dm?TcSg?-EKGRxPcN3cQSYKS9vl`xiIeynuC3e9- zFq(hM3rnD_t#+TWyUpOe?u-RTMWI3wdkLKLSbLmdQYw>{YH#%=`~sNTZkPR>-A;PK z-_6`^hnX?HwtTrROmR9Qes^G2FXtNEB5Q#4f~24XNR4vp_Avo}hRUnav>%DU_-6l4 zbCaEB*OvJSHtB0U{9Z}_3_#(L`-$z~?|Z;unFx(TGsVb)G&tcu8XVXYdl*DfBRbGpksKK#IW zbUC%HX@8!)65s5XV*oi2wok%U6fl;NDU6p)dkVQ(10}K(AX1$efd{>MDSSYL(9q?q zWIh<~0g}M_&_%E8IV&nHe||{skJ^3o646l&*xi1L zc)ZdH`oQ}K!=`YvF541#UhdZ<6R0WlSLH2X)KAG&F(>HhkvlmzL(9D?U$1zJ16&D4 zPNrAU3;pRlM|8*F=bjNd<}pOm5!#IFz5fs1(1RGvDoOPHj2`u1khDUH>@Q?C$I~O5 z1k6#2P#JCoFh}X(DmXEqM!+7S_pwLFWps?~+BaX9WjHEWXEO+kIKnvQS;;0lY{� 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 Y@Xzeky~B>zS=Gpd-rH(Fd2#dq0f@);u>b%7 literal 0 HcmV?d00001 diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index 9a122c5b..b6682b43 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -149,7 +149,7 @@ thread_pool::~thread_pool() } ``` -- `stop` :修改内部的标志位存在使得线程池能够识别何时需要停止接收新的任务,然后唤醒所有线程准备。 +- `stop` :修改内部的标志位存在使得线程池能够识别何时需要停止接收新的任务,然后唤醒所有线程。 - `join()` :等待所有线程完成它们的工作,确保所有线程都已终止。 diff --git "a/\347\214\253\347\214\253\350\231\253\346\227\213\350\275\254.jpg" "b/\347\214\253\347\214\253\350\231\253\346\227\213\350\275\254.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..f2c960c59b54eb5eb40e819e8d840c9b07736946 GIT binary patch literal 354705 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%0D>_RfQqY4>!#hakUsr* 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

X_8^;&7Ivr#$!cEMi>VL0`|Rq5n+!FS;gp`x6^ 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 z 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�O0XWD>j#X5lc-QmiCI=D# zK;##Uh5=9p)8#_ni=mg4 zSFd;X_x2zR9L^||#P*k?T7v~StGqqJh1^%;llh3 zNsE~Kv^20--6xq8NM=1I+vrhve}^-&^I|C@l>(<>7TL}g)H_LmM0nDh;4Fu_pAWg7 z^*l(T!+K2FRzl>7D~6WqlT12p(!?*Q7Jx}!9=7E6!FbZ~trcyCy@UcJd#-4QDMBTS znT6rtjsOJ@W2y0PIa$(;+P~jx%I0Zy*Bwub*a!V-uvO+F_vl`pL8>g$JU^tWhM9SibPUVwYE(RLashk@DguDv}69Kkla4FSMALGdzp6$+^;~ zAN@W8Z?5#Vb(W^LhK?S>ao{46ciCuesz^OxWvX~v|2QAy7=i7k;XZI1nngzY0&ZOM zzXIwKKU)^DJ4YU+RCyZqTa>e-=nlS{o3`^xud_0yRi62~bm*;z zzqdd3Uq4~6;@~^*2;#c)x#=-%GrBsYS>3V|ZqXLc(9uQ{>G65&BZN0)B-3QKJGWq& z0T1#o{pp?%pSI3oTv65gXf3Rblb53%;qC2*GJaH^={{!oGQpWiGC6}0jf#{fxncxb zMm|aYBET9X1-{;whHf8r3mCtt8~-`<@p#GEhvE3qbTAGF&`9qnFP~SEk6Z~{%L}1{ z1Tvz>RJFp?eKlK{{J7{!jLEbPSGqM~{>4$$u_zSk);XTU|GsbkQfQ@FVO2T=f*{iK zCp*T&f{`osvl*Hd9MTGSSODFGmQ%0g@DEQuanogJrq<_J&mw!2wi7=R#{=nM>G`$K zbUzADhpZ}k>o^H7>;pQaI z*&jL$+Zp_46e1c!CHv*?e!hHR-AKN#zsKPIf+FSV2TJbC-)BD`%}d;rgEHm;vK(y33 zIv3@{{gAD@J@uR*EepizF7USmfUv-1BH*FCbTjo83w@6Tm{2cwOQ?XcNiQ#TjDrYK z2df`na2sxhcFH27?+G0!*9boNl8@58k_;!Pdi89wcag6pDmCdDIZza5m?={avE1g} zfguQN-YY4*J0vBWJCJ5+6b_Cx12G4EEHx6QR`rj-4ldJ2_J#SoKQHd7V_4V%x)~Zo zibO?@jN5;twJ-HY=RoUa^TFA@Yi%j{|qq#%@uq|ot!T|kOxJw+gM%?Ag4`%j%sCo;xCjWr#`?|IP8w?md($U==>gbm48lBQ5B93mP8>Cwq z9U=~-1XK)KbOyJ~enn!Oa zT!OdlFQP^*L!9*x_GE@D=wSYJJSM3h>1WBJwbXDT-<)ahPwp1$grril^Ib%8PzY4^ z+&^pzy4CfTugP&bRD$G%+NDPLmd^!^mT*Dxw+$_nY6zI!MY`$QPRGWTjq_`@f^&Pc$E3p3T> z{RJ+Q<#}4l4+;OvKs6U;OQF6VOWrZIrVaB5ea{ap2o_Kx<= z`cOAFB}LRd(GNzRwljg5vwz-*-Ti^4JKy#6xPb)se=gu#imU6L;OY-pxt9OrsaF2k z)eAI*iOPi3(>}cRgWVVM739iSeyVCLB>#d9igvW3_)4o4E zs+;E#ql~Afo)eZs0$)p=I%fpjl%HHT4ockoW58=LIOlyWeD`f5M2bGH{EO*H0o%je z0+-XQr=P#JB(uRNq}8VHBz*iSB)FjUJkGPpi>w_06DVV)N1N}i!RU3nttnFs5zt{jJ6~rlP(Y$_sDzp#JsJ4Ff{JOQ(1ji*=#=Q@bPxX^hy^qU>z4xbJ}(%xCSP3^Z;s#(B?1&9iM+Y*1UW+ z979QX*p)IZB?#Q3kDCj-^UIAY9!fRW5#GUq|bJp+^=Cyqqm{(x;2}m+iFIhn@+ys;nRh?z1J%I(Kq?>5EITKMEiy7 z^L+bi))X!Kuw9aymoTfc7Y(3n7rL7ADcW1_9GzH3Z!~OjlAcOvp;`KtT-I!a?%`G& zmboO7wmO5PKTAS>1r~ug>`Gd&y>|njfyJ=S9zIF9Bz?6-kb;oPOD5ukFMY7K5Ese# zLt#$2gx~4Yc{O$Y4PWNd_Zc7dI9+WruKV&C%j&;g$*9b*z_De5b`+dAkjY%Jq1R&6 zCd+c~MjvCkrY!{>PW45MGt*MyNOF2_xy7apjkikTRVakM4&RjM6vRD^_sR%Fw`KEHFL$UX)Vg^ zi7}=EXimQr=7o~b58+%&rR>Q-+2w`(C@E0ppfity?wIw;Xli82{}(24)P=6>2F|@s4L#){e zvY{@?mj|-o$alY9m2Bln4(vlvg@4gBcDrTw8evaj7!uMluNLK=&qN^hkf6OFH-=-D z0Hnq84e(xjy;7`BRsGJIt|?uN#h*rEH68fwIP;-uBRce*7rO6<7NhG|(`9an9L&^HOJ-OuE}MK`x^+;~)FfH3CfkvMywx6M131hb2TM^wTt@DG zLKu7ivRf=EOq8OTmTXDpfK|H_;1ISzX-FYkwgqwgfpiCJe>*SM<~OC% z*9L5&3VoF}ggKVToh`sx#^v9U_r}> zs~=>NZVk6ziSy894Wum4@zVysx&!%f9Z25xl<)1E-?{cmZ39<~G%8zfbaaHycQjig z;dQFx`kb_w^foc(fG`q1%RxTqBal(G(S;#4G)+0xWudD0mCj|FCaAkGI0y~L zJ$j$6Ud%-nkKNtKaJ4>;wvQaX&kbB(s@XijIGQ%XR)&}!Bf7qCp!i75pMKp-_n|Q_ zS7gT0%^h~Z7U+0oAhCY-uZ(nzbb!>vx^<4O&5aB(3d32C;!vNm5nRkz#eE(c1^2=3 zuI1WUTt`)riV*{FBdS|MoH=~PitdnBZCzzXkrw5u|jUlZf#dA(wCs#6q*b`pDGe~D%w?ltTYV?gl|0klSeC~~1T6pZy4Z0*(aKhnAKTfv9~q)h-JH2gNlz|2n#N}?!#!$8T2 zen&bZg4J`L96&jm`#Ijh(}3zDLmJe`WbzM3NPc=6nW8S=XP6HXSW}(2o(&lP-JmsT zR)izS25zbQ29{6FAC{}LuGB@-)7VNj!jSo)wpHS~M%fru1Qo8ukyA?3+DPn$ys5r{ zt-_Tz@;QxPmERQ&k@m*_tLp4e1ok#1RW^Ki>&3tLMp2Ie7}g%wB3fB-x`SrL92z?1 zK(U#mhx?HFryTU&HYnK< z=-DVhJX(o#PHAs4&L9z0%^>0&5CrgSzf^_s zz<&LB@(y5&)X+SEq0H&4^0=qiS9ZD=fnxl9x$ED$^FCb4FD~?PxG2g=GK0;HOED(+ zXo$Z;M=HIny$}Ep<_}`XVPj%F+PYH7gyToW0%MYpfVvwUz8v@R=8Vq#J4@%e9OM8Z zENGDzcVH{=g5OX}(NB}&^GlE&8U1V3@8zU%EAlceQs^URhvz3*#{7&bYdzPQ#Wcnm zLp#9zNLXkRV`yznzGx^pr@gt$e^Y|-AEe}kJ#ehUAEl*! z4ea3ou1~DobrsjRo^E!^UHkjGUR4QB+aY=17baTLItIpuJnQ53Y6(a$e)br{a_<#W0W~eD>%8L)a(ND)FIeYJSMic&F1Ngq1a3>v zxQ`Lgd^&o2Vom1gm68eh-VGoJ&}5X{8pAPee3y5zMs!9spo|w)n&xNx`MO#_8Vj+zwQgC z#_e(~+cpzmT2J2f6a?wszxT*etOle9)x^d(uGFydbv3yPOELfC-ud-;uEA38b^T5% z>VJV`D?kE4j>+Gq(DmG>c~0~7&WVih&f%2vR~iYM3q6$Mz2qQ zt&JESrI`$8DkTx>G#^tSImreYY$NmzJ$Lld+KcU^q>$pmsO)b|4bSg3^Q9WI<$i1g zA(UM9GUgCUBwH*Vc>h=ziNbiq6X#iuR_-}povJJFoTCMSLI!nZW5y*ikW4iYs+&oC z45b8wa3rE8j9Ojl6A9HAy80MLFFtda)RD%em7?(~m4RKhDNOzm6x&H=rr^7JTqmz}p+1&M+ABx~KA;|0u|Fr_BCH#6}Pv`(NqH(ch8Fdx5*N+@WIMXS`=y<^C* zkG8*Y{FsvYkLR<{{7(YLaufpOF>w`Z6bs7Meb&Q{U&s)C!D5kkTyMA89!rX$x^~cD zr(uuMglzb|G?j+}`G!I;W^y9P?2IM9=Gr_dDdambx2e+OS$CU0C>tsRLVpux zYsIhM;3umN4eAq(q=;~*q}Ze%9MzR)q01!{YGQlYZ`m_BA<^ync1~n*UZuZfSjRzQ zO%fZlIi!7!uSJ>%;hLB~TBix6r?oPX_oS1-LVR6`i8Q${58FDjCL9Z*tma2sdj|)p zA@q!xP;J$9R$VC6D91%}CdrU!_l2vf+xMC36 zSuh{q+XQPlT84jev}&C={DAP!K3=J0p;xKamf&a?~h5qxr!HQsIESklbIXpuR-uoH z4cts7n=dHJs#=$M9$^&3R02)^Tjoz6V4-3_qYNGUyyWmuw4Y7?vcsm)ce|TfanY1+ zMK5*MV&agpTaJy$srz(Wr!WW$%Cz}yXUCg}^~)hP)0FH%OELVkOT?&`dI=Oa#!@fM zXi{9;eD4JK1mhz*A?b8#C8}20E=X>#y5AqxF}TDnyN2JgHIm_&MDS5kCP0xQDL&HF zotRJB?|&Zf*Mkd}r}|%7q+H@o1eIIt#iuud`_RStSYskoJ;mks$j)<~o=;Za+kgLk zL&Mhs(a;z<+Z`<0TIqe6Nac_r|Ctw{i^UA}n9_Ln8L_wWw8-~Fk|=)caQ-(Yi$|oS zCN({91&(%;xY12=_l{k%PSO;ByioVMG;b1}Ny&@rp%Fz`A_ZTW!i&_P=>DJJVepGm zh(;Y0!hxeW5Ktj$5*$rF8L_D0N9f{n8EKB46B~rD;%T2bCKzFXm(XmO0mddO`RUkb zY^yY5ux|MVHLdCrC@$3HR2Yh-nxfKO`x@l9CPvg=V+1Jd>lCHOHlKNwi&CXM_d5z- zLHqK8v+Z53?~jV<`A~T>nhh7M5OaJba!O{?{a(S>n{Vk|V4VZ@8IZDucbxBH6yJn} z%c;J1>mM7Q>b=Zh)E~Ib&#&6Rg5EZU5wSmy)8>8Ddc?W$*toREYE+n)z6;ik@;?n! zdA<}Dq-Sc$X69cp-IvJ+98Y~s)d>#}YL9{*piWRe4uYjJFg7~4O~q_+M$SO4BfuEvnup64`P9(kXLh@HGX z{PJxnyK*I!>QIOuN&ql zKAWcJi#eut_!PT%IY8>-+~>fj9Zl~HfGHg*bQA*JnUr5@ou``^4bzqTEdRTGHF?20 z_aN7S8CSPfTxv4H2t`VeIImj}ksb~frVj_)>HjnvxW(B&gm~Zo$CV^re4>86mOYAsf z?vP>jagxqnc|F)aXg{K*>-r#x^GzefaQB0t;2wnfkC3E)J%kioVt-C6A8mHM<%;w? zca}^Hg(4~)W*O=D(FM^)xx@hS5iHBct^0Q*?`yJE7@bV+j793Em9qjSPo>T(IB)<# zZ5v;PWsc4de1GxBT6_b_8GCOl>P6=UNMgzFV~6Jp?>oP;|KgDf-H&JncnDyeq4_Ys zOGnrd%iGD82wBc?y>vkukFm7SOvf5*TX;R5n_xHki2G}T@xo&r#xLW(fk zqc^>@);P$|`E1{r3;=FjcMIjx*;W>`lOLdhE_9t>Sc$fTIcE)EU6HimHxY*D-e)YA zknXV3fWV9ryCaaF9h|4sMRP`vVeB)O6_Hm@^^r(}fB%5x-P z4Y~w9IgjtAE+Zdbxwh2*_xq4WxEAQB#|*oYkDvAg0SJ=$={1F5s>RQ>T0Ioa?k)1g zbRE{D!vAhNZKpm`rT!0CQqFDv+fiMxjqgAp*M5I6nx`k_hp)x+d{n{1S{_?R9xguM z{%D2zB8(8OC-QnIl6;d*AVNhs^97#Hz-A9chr}6j8CWvd(H9Uefb8^y+q1Te zcxFF+I%0V6jdY}Cs2NXD!dZXfwLzJN6Ztit^jfra)GEUQcV#A?oJQ3JWJj zV$;$tOPklm4#~4?DLd%(OW!INNG-Ar0tvpGQEsfEmLJGesBiccHdc)~oV#K=y#Jo$D`nN$%MRrP(>UZzdIbF`b`plIv zG-?eIzHzt(SC&$a`b6z2v8B^B9`_0Sg$$rA0sqd#tovf34UzWMG z=Z<0k24Yly4@^suh6YuB$2KnmfgPO$#$?5GRREgMTlT5}L91RjetKCd!QBjP?&W9I z4$0O%25%2!bN5^F!#r>Lql$RFq_)x>x?ykvj3Y~u(U%#83;8(Ia%JAlzqG1()z`7zVMEm_f}=@ahHd=g4H`Vq z9Ep4yVzxyxzu$?Y`0pJ!1k# zU`biXQ_GG>wQzAZ8jcAy1|Skubp5CzKPaVODj;y&x^3}Wl%r9rjgmqB4cUe!gF0%v zJb3hva-%HvC9dQjB_mj;oxia#;#Os~-^CVM*7uc~#vuqZVu8%Y z7Ts#G=at>USy^u;X_2Vh&y`hIW-~;7%d3Gaib1|-86?w7>Gb9M1lZO7VqV^V<)c*oD6wi%I>KT@TI4WJu4p|tRL~w)M10yYQwQq^QHQy>sN)qelKySv7bC|unaob_~y|HW-{!oZm{z$iYuTm;Z zdjkmzEuSlC)HNPCU2Pmb?3g`otxy;g1$+fN#yFS9mheDkMr7O3fXk5Ge*sEsS>rWE zxmhoUX2kv9(Tt1NlxG_W*@w>5IHAVv7K5%fb|wYL7U$$bs~QLd*awdC za1MzxLJ>j|cP9W2Qe00!Tkw1@+d#k9X2K=pJ>M6|VD*VV>fKI(oD56Uedf@2&_{o& zO19Mcr96oDoniw`TAwg*F%j!GI3GtEk4h1N=pY0@uAhaP%6&-92`t*8pg0wu{+teD zOahlC-F)J2{&xgn2)$oGetI#5hf{ak1e?G43GkBot3Tl_W091{;lWW=D@^r_Fl#MA zTm=qrR(U+^L@)^wD0NzpHt>H+0N&fqGz2+dbMP{#FzYHn)=_n7yv(mYw}>RW zH||$q0Ao`2z{@7DKfU1!I*0D2w<#C0ZAUr8FAJgOcHUgqBNe=t0rofv7f!Z*M(Vlk zfEr)CZTo{4n=QRrEI-GdYtP1i#0bHbVy+L@FbCP6yi^c4qV>G-+@-TRS}Q=X?m6Qv zSA$UUW*pRnIGA1z2>luNu5359c9E4wKK6Uwml{$h1`(-w+3gKG!81Q#qcOt*!V4+p z>C>heEF;Qc+zK86KUHNmU+MEfL@=)xQ^`JSm?q8}Cnp949*(LKl19s4Gg|BN0<`A7 z%$rZItxP!ob<_b8dw+Cp>jPeg^S&Fex#P+(=2*GMxz|jt-uiRVVh_$mUA8g6IMnK- z*$!k{wdub7b8jy02_f+cOL!fhX@S#0lM{40cdI}r6zcK!rpjvP?_cbJY!97}!rB*} zGGl6>=J=67!b=T7r8jH(#O8+ZtOGni!M!GZl$(X*)X3*Y{ccX=9)zv(@nfDX#&0}` zea)M}PfI9|b9(x&T2wvXwU_85&a|M=(VK1YxcM?{&&c4FT2cvaWts1xL;R$s2`39m zK0hC**L|1%Yk0s@hSFqhCZ^Wb=LRktA@`4QE!mcsHMgSX0x*k z80>~tF6>fi*7svWC=uZO`adpodQwoT$oh2rnsV}Tr34ZIb=WwKlXfJewdw9>OAVk0ImL(r}txH{L`z4WTi6QxE9H| zS6z>6cr)PAB$M{BDhNul+Z@?o=kn0z8I(DnXIU74wpP^N9Fp)LI$wuA46tJ)so7a3 zen|w>hpS&$J(r$IYU%e^H=k7+deu~%0KK<%-1wI9bAgnouO2M$vu@BQFreV~K$&;H zZIXn|S5O@TDqCDDkO3G-S3;h7t#_b>j`x0c#O;~WEO=I62*3xU5?1k;T(qhbxi5&kZoJO_>XT?fyQK;AQxh5)E;FWb2j82U#o$pjoQ zQyEal@qsGTZHZl4_)w3l(@=gkV-RQnAwk^W;N0N z8Cj9ceJmj3+G%(b{WG{hB_5h7znGrm^;Q$=5lN#+^p&`}eWL<>B_E1Y6l!0~W(;oL z$g<|EJNi9L)W<|^iS1CELy;FRrp_sR%xu}VY4w_a2!r5e-8cQw}wzSl@ zcaGhw7ZIPCoqICBusDBVWi_L#nbJqe%+oYpz+2RD=L%I{)!l;O4}1HM+gcyIA>QGt ztf_)9Ty6dMv+Vr$#GAcbOM;&s0XN}0(?W}4OH99lKac&3kvUp|vOTudjBoqu-0ik0 zWv(&x1WWJ6tseJjmcBuch0=3gBQ10~Hw%jTMEs6g?VzK9BS`&t;RT%3*}?m{FHj^^ z2KD7kU2vBwa~g7hPH5I%L~IukqEB3wpG3?8g2xpJk@Ao%GK zXsqVi>3s&UwuMvT$CufMcF1-EEMzWn=AA`=0`K7x2#sz?cz*VK=5Nq-)HU830~vJe z<>{C=E_}quTF-+6Y#}c>kb0eD`vO>VVvUvIF%CMLy%eQCf+sqG0E*51&lwwcCLi)! zo&CW&_9ZV>#$bs@<1Iq6+a#?V0ONs2EJrr~752DtRR_goNRg2)aNW4K?>U_AnTS=0 z6$a!2n1A8CTzP*DX`A=KmjID}1?>Ws>VkIaXed3R`Cjrp+0m^W?ALkqQ9!g2FbYWjJP6;X~$ERg9 z*^KXJP$`)2t}`KVo`mbwSq9Bf>Zm$GG||+1;W6Sp4NjG}e5w19^L>nVB}H|yUr8w- zXf2FT`S!uFI4WzINVx&P44ET+HIHrHL=$S}(&dvX@YjD(~=%icEA*=*f`t}Er83|z+Y*Cb7}9}qi74s3J8kYqGW^j=b?+sGEW?LMbqU5TiJ~%& z<*$A>9DAJWj0{-?Ue__fM08-UEyb>8@@2Cy5Fw#IvL6SD#a}#wZDD@LVv*}7T)Zlm z2JEpW%9WCVGHX?+ipfN(H~XjonH{M!R-Lz>Ws5TT+@!nP=!Y#jtGzP$o)7jdCY;~T z>dQ&oaEf*B8a!!;a|A z)MC!DR0d4%n7*9SbTZFv$jKsN={14i5xRODOTCg*hX{FOuJB61T|o|o#;yPxDoE^x z#7fHKzu`Ja)o>LoFC7~^IFP20x@&Bz{gAig*w3!{qQJ#X1Zr?F07-dh%C4K3$Yc?2 zdXVLH{o9OLDI&ZlL{L)dIWMI1i%+j3OUgP7572V4=9G}YN>mseIyH0q+SZogLw3VR z&5!roj>HAfOb(h8gF;7{)O-O$5}N<=^Yf31txX~T)ZHraw!)5DZm0ca)6Ba8I?p3s zCBq7yH2@M({!)fRk6SNmf_HN4bpzw3HJE|Wytlw>02HCS>v zDG~C_5Koh0QM=qjN3TKzX>m9z4Vg0Cd+g*1-n2X zTqh&8L4~=ZoC?_0trKP@Q=;fa<7N)K>yCSM5y)=AawkcRRUNqft80>YB{z&TZ$&OE zHuv2k9BqKbMbG#0vdTc~Dq?di2ftwoA_5Ka@otO93NSYILv0cA5=O_uKZ%}1ueZJ^ zB<@2we>g~ip|SSQqJRhyp~lxZhe$R@RzC)%-1)TEP&!Fw?-0*7xi=WNal`}o5@_1t zg=kS1&LYr~)15oD-)DA}qk1l`)kx89IW9YoHN5v*tXxr3$ZX-Cf68f-0U%=-1I)GvNh{x!#tHRw zN2H~|O@N{%ahHgqbxiy^^NV6)3b!C#s9fG}`&R-_4KH`CQZ9VRWq80kD|~`BL?z{> zJmx~m{4D#tINB(jZ&7~{27s19s-MrEM(D_3Z^MK~Zd*BjKj~dQ>(-w^;Xa4MtnpCN z0}M{IT}W2brY1iYFA--e5?1V%RFlztQsuwYV;7pTGy?h7csqx)9~+&$`;BLg}%wh58gR7^@4%Khq|&HkP9wY(q;u#@>Ucc1BO~VX?)0=BI#1xUFYW*e71_ ztT(Qnz@a%Ap*?~7Zj*3&45Puwr~3*j*~D0$@Xk-eSqw~`gu-4-he2@wYrew?F9I#Y zxZ4U`TD6wS*K}Tv_@u;=y%Gi`D3XR^fAC#tr|=3aO5Tf1)W%D$>N&kBjm?}1)3gtG zR0qy7#y9C-7~U?Bw3+}yll)(OxCCttO7LQFp0k?6z-9&F@41sHJrt1wA%z8Ll$jBs z8oM*~sj zx49Dx&?n{OHD29OkhwZQ`v|03gR|KbL9LLnZ!u?ZR*G-?{|SnFqP? z1*#X>RfPiAm1M!0_$Xg3uajItGZ{jIDZST72Hez1*UKPD&pZKj%=N((L>`~ZlHWxE z9AWmWDVstbKc$F({B&M8=1iSb#re7?yas!YS)c3zXOjs{OCV-AgcTt+@xn7`IpcF# zYFDLIGT8d;#6Nj{~cmcSf8MEYC^3o(B!%3d7+pIV8S;S(C*9D`@N?^aUktr1d@e#L zWUYA#(16wh%LVx)D4M)$flZj!ze($k^@>S-<}3DbIlEr8l0WmJz&;sZ$cJ(qLv!)q z&lU3VGQ))d%8daXr*Nqla*G(2yp#BDrht@cUI3!X}5!tnvDMF2e(WLpCE z_BF~=qj_F{OvL}8+L;TO=*)AJ*{s-nV(;IemO<6-&mi?suoA(nbvXc0M^;w_P?ZCm zz!f0clPnb>zkQ)YL3AC+y>Akp78gCo0_zBWDg#T1Dba|$4#igtHB(2niC{^^#kTS? zKMS7hR0%rP?X=^}=F*DG;Y=9oe`tn^wjz0!x)q8#N7*{{!|10Nm?kkY$5x36BG$hb z{O}}UOrSwh)2fWouI9YyzCLQg?^6FkvIf(I*cs&=`&d0k`$)}JW-qnd6q<#t{9M^H zp)EgQ3>be%Yuv@4?F6K?td;GWV{5cp?R$6{wOH&QV~X=G()X?CfM^4EXw6uybWcM@jB5q2oDq`Tfx- zpOM!70eEG3=doY3ZdTwQ)P0x{N~1hVa!7^-!}bee_r=kbLB#4Ab+`HkQe)rswc$NF z(ydWzE?38J#BKr!K``TJzN%YppZv5|B^2Y~6;m`rc$7kK4)ly|Aiq#pha>`PS!REK z-DO|7Y7g`tkNywkcugjg2y)OE>Rd@Q9-J@3Fi=Px_0D6OIo1p|wt?Sv?UB(=jnTLdB0esL-it7;qR7{6ioz@3`MtJ;*|bR#b(Vf{^u4*$np!HMBGk@LT7lj5?3{3HkhNqe+93P7A^EZZnH3lD>-^&pRldZQgr|)=-NiVCpBJ zodW{ix11l05;pyB$Gm;!66-xY{O;GkFWf`xm$((2{V?}fdjYww1$_!njq~53Q6E>v z@5cQ2L@W{JL9vO1<_Mj_uv_s+rSL>&u%)>Q@As3c?$(d>vd!RkpVOI4q^1bEsBTQr zlO);}gE=UA&Uz*I-&xC6^v?3yW(ttzTX8KWj6C}U_s42dFzKKYA(|))?TaAZ<7fIo)p&z)bwV7xg1UL$p8iq;c)i% zE(OO`-qZ$!!A0OazzZ;dUIL2`tQl^{RFAF|*$DT&5OolM_h&Shsv4oUL#j{wUs1A} zH2Fj>PRTzP!f^8&t1sAd*xD7D04b#t)5C&ox1u>}ouvE-FbKyz?d+m{nIfd@6ES{q zqd_=Pxspmiea=X@1~{xcoc91x*c_p-hVxH~RT|rQFs}U7cR9P; zRd?&&JBa#FAf3JL6zvY~9O@OtS^*#&9g2q_baXAC2$?1P1%%chQ5O22t2|8qIWtZ( z;aA+xOOL+0su$I>%HWrWM?SrOBCzcoi3eGv$=ks!=>7>hu0Nl&sT9tMP8ma9G+AyH&9Cei7;bp(s%!P-lvK5ve>n# zZtrPKl(aaCm%fVePrmeB+rz_wCp?h=!DC2(9|5XBzsaMdVviHEy|!+hB#=H|pQoO!H1Q(HXHKmtDMR_ zK&!x$$9nv*A>M(28cUXv$dtruzYvO8@y=uEO^Ce+o>mV3^EF}U6#HxX zB||)?e^QQ%78c6d|C;@qy&U^$q*v{U===Ct{sKw(5{%<|hhvqRGg1W$Li>GX9b~ak zDI$0fHhW`z+Zpy~i2Xe~0R>0aNHGfFsgd)JYT<8vQ};t_C@dr1B$CmC|^Ga=|Oj+P@@X z4Bj)|X-yWY_!3k7*tX0lx_clNPsL&nNO^sz1<*wB$`pd#n^|9eK0mblh11WKHmz74 zK9B>q^&h41IA>T3lx`Rvl&6TGbjDuWs$OF{$HC zs(t4q2n~7J>XRm(!URv{bXtRYZh*bDTu^?=r17;aVw6us)0t);FM>c!7Kh;=-vg~> z;TVtyD;u9u)XcucrdxvO^IU{&F*tAMQOMk>^r%Jv(h;+8k)4EWSt3+{loVhj7uC1R zf=X?dW}6eMndQ`K5^%@!MgNykul9jT;TRtg%g2Un1E|Iwo=r?VFML?#ag=9Y`%)+I z8r<8P)|CaI1gxUIHa0wx!fARAJO)s)4O9^WR@RgjDPQ}L2pV5@IxoOT)J8aokHJ(y zZP_ZY9s`-07WgMBY4`aeIl$!O&q??{a@k~!Xu(-*y(H?NIx2&A_83*X?>$3B)=}!a zM&YT5SRvBs7Vnw%6HiD$w*WMeMlC;)EVn8*~(J<)20q3GpAMg2(#t#A!5Y_{m5*tk+N zN9sVzDM#+ty@huuLoFl}vo8&pEP>etR--&vNtKsjl@rW*&0xZQs^8%!@fZ|5czeeU>?-!`_SVFw!Hy7^-kZO*ZF(J;! zc+M<=draq67byx%^S84ibNUy9Zi`o|yyW;U4s%V^ViN-<6p_*n-C!t&fv2-%d z;XgmTNpfL(Ts0klb8Axk#~47EqA!?;V^}lM+5J zWYd@|K71Kml7sI5VYgyyv#d@(x0kX~ZCLv&Q5y3`UH6OjVqKr66nREhi&7+0Skr~zP6)7!Tiv3&9wzeZ(b_EER(F6C;en6 z-pxt>;+M@O<6n}$+7$QGFk6NSmrGqmMW}T7FT<8#OZ{tKC zwpO>d!`(o-yP;=b@a#Xcq1vb)llok}2EAv?TsT0GqwngQ_qoPSltoS&GD8o6a?0@S zsMII^p5YOHcKs~QCo|(8Me3H%d_C2qIPuM<#H^1}n#DNbLv`T-nCmceycG`)WXn%W zQSbH~d0hK$!9)|S?dx5wBnpNp|5BGP54b$s2L7hxda3=bmtxoy5rdOvbm{uiIUyf? zksr?5=8M$ZXqA)#G5B{I4Vm=eqEfeLUOp;sKb=)x0)#IGvhGsPLPUUM|Jv%wPR<62 z2)Ti2rbHHAL-Ithn;hC4t2Rv1fi;*SH=I7=Sc z$M5U;4jPyfKlAR` zL3JE?Q4glg2pvpoSXu}7O!F!%Q&0OMMwV`|#E46?g?hp4{cLZ~^d*beVQXb>#%d>o z@FDmjZWOn8*G@~K0nyy;ln?0%kbHpc_%aU}E?*9?ve*0GnwmusM~4qc{s^(}Pdioe z=CMg5rARW7M5gR+l#*g3+i0Sf11a`He!mZEwWfB2hkR%NE(3vRfNsARxKSA9Dv14V z34T0I35>ZKU{8OH0*xYqF1L8>ese6>r>^j`6=z|Dk%xT-ph%gRw|H=@)Wf0qhC)5~ z7R#u#m$K3*R*nPs`ThE1$zxYx8?w|RZHX@!0b?2O5eBFw?!v-B7NE!92=O&})eqI) z7wMOyJ#REFsk=R#m~)(-`$<>JVK`SGBYn7Jz0DBc-)ATprS{*c($q?-vniLr`S}`HnfUZbo@>6Cl>sIC|}- zm?{(bw5)ubLf)Zak^wmZa2^n*AcXk#J5PG$UY!Q%uu30dB;MNI%5g9Gk(4yX5}np& zHy?>j9D)2*ktzVZv-#+|-UC8#=Tl|>znaj0`ZRg_g(v4iR2Y>am2C4>3(k+~*)rAj zOd;D^G-i09mH&2xPnOt>U)2i`m7jI+F)sj}YkXX_B8Od{EOxGdzi+pUy20lp3)JZ8 zBn$KRv;>o1I>c5}PD(MC(ZGXM^()bJ_c9Ag!06h8yB8x6Ih@SP9%J%YPT*O>eykhi zJSPtpeD@OlHX7Mu;laIRW#F5J7Q3*fR$}5I)^i^!)1ZaF=V0Mkw zKg-fWn-5_(BR(Rih&K<{YIdyByVox>S!)-p>woOMipKG@oW}C|$j|&WH zprc8F&g*6kiez8sxR%xcs$i7LmSO}4fxkP}<7Fielk%alOkrZJx1geV8Niu)?9a)& z>Gsioctx)830M;38O%X-RCdmdl**`NtIGC&+ihJ&icjaz;C_5@EI&s_n9eWGC@bYF zB(S2d^v8b0tvH{c3TZp+1^fxMnjTiBAiwl$dcC7Amy%K_Q<`VS$I@e?n-nVgha&fP z=2Pdj09GvP{n8>7g?W-*H&iz^Z=~QjK>B+?V|$a%PMoWc7?4BJ+^(NHzGwblS)I!F zp!z~@s=&6%#O^0zu&b3)E8iRk2~v6K0bfQ- z6l{Cav+k-mBnJI*%2c~n>+ZjESl_v?Z|jgzb$XA&I9c;|AJIQ}>@4i*YONUyL|qKN zQ+Z`720^=2O?^}~*;io}<8H6UBwp^6{6X<8JtXMxADiIlYchH27|0W&C&5kmd-q+~w|{I&%uk6T8$amcyK(#2?(FhZQdRgKndV9SKKc{PDw4nlOny zM&IBrWsk83rcEq|*vGPZO^MkuM?-Lik>Kgh192}G(XJ)6;lTYQ#iQ$2TYHs`f=6o=!qa(ROFqpI$Gp#*jTyd ztmE`zxkXtAYgdLb9%h1u8DTWVzsNw23oeX3`1^np7SmroN$qGe z%(MY6)ahG8z6L!33s_BEB>&dlp&$9$HZ^fN=2D%CTAFHRpZ+WX3uhk_^{J`Fg>#1F z*(0mFst4Dfw*^0M3C$b%r9s1x1v5v%49Jj|B)PQ_g}(^?Uw7``8xzt~Qg_{Y=*Td* zJ8>`U!#x2c%&QB!idRsoynf^jIJkDUaoKVP@M~j02E4K*U{$j^{5G#i#lu|3GImGF z&&)g2$j&digQM{4jWrUU1wSusG2nH?BZ#-oU$KlaT~vRsd7gKqHLt$CTF8(SrbbNp z>RcM_ri3vDX%@ifN3P?nf7`r@0S=YDl`-lWHfo0KYx85h_OS7=A=zf_kS5C6Y#3CeXwH%mAbLY)kMJ5wIlbr#=PQQQ(u_sLw3)2$VzfpE2Z%)v_;8I9wWr zy%Lc`(p(NR4($wE5f{PyuM6lO1MPN2(s%=`^&s|(EXEF`jk3kafv;d!+rpN-lJES{ zzn=G{gB$tu33}YWDMs0p1GfA*V6uY>UOp>Y$IvqbgoP|q1eo_Y zZsPwwSsdczCICgJnJOsDNo{jraKkbGmdxy?G!Zi7<$R!B5ugbm>Z?C5aZ+F5W)6Tj zcN|M<@2%M7FyU%H&Z0+Lcb|To4%S{m+pS9yAcI~P%}68i?RwO}x9%vkRuQE83gg7Q zl6^$t8kul&18sk6SW-k3wTQM|3ln1hYb)N;@l!u;kP-ms$+1tjwcff!AG$4L6AQUK zW|b$Pu3yfO5EK|9^W+-mcxTooNf^@q->$G4`Rl3_lneyt&g_8D1QqE=ubtCBPBHU~ z^4nb}+G7x8TfLgi(?7xIsH~1pyMwKF@6Q8z=>x0%sjrm)B&ols`aW()_th>avq6ur zBROk5Id9$K-oGjM;DvA|%*L*jDhcw;eSIMttevBW;_8OO7O%z)J^Lf1hpFaz>+X$s z>sn3nRIn8#zVhOq6;UqX5y0xg%hQPhjvcUO8i6L=sJ zz?(tNwdIpc4Q#do6PGr5tMoYe*?doXe)|0VcO8#Xi%7ta)b?MDF<*9cl0F?&w7RDz zoYhKJ-<;b7qx>Bi(bkmv^KI&nUp=2y(TCEIcUbHa96v@nc^#E`aOysOWyp19w$D($ z@2$jDQ2mWm%GD9-F-oA|oFEZqB!6!2#XZRf7w`7SQsrFR3gJq4y({xokIh@yF}wJ- zYL9=*iSPQ_Hb7c30VGHtDQt&WZKIxW-tK|)Tq{dVhsG+{SMfvHP@D92VQMGOc>mku zHZYukCsZB-%k<+ziJ8@5)V%oU&&B9fk;M|(FZ>uc`8dEj|4mixjIXs+dL!Epp+!`+b=pwZY{94PUbD*(E}t)NHw?KZqtu_pei*BeK#e_^285_P68yX#SPz{7{L z-F$ktN$@dKfw13*DS0@U0f6f&qSJ-av(TBsIl`IQIaxRJsa>E_!YyG58QI&l|Cio& zPF547vf4mq{xWpIt-=aIIhq4{2inOu(AS@F_ioWprclW(Auig^&a-w1hSLIs&@P{}CuA(ca+L*`s<`hrZ^nx5o|sPVR_DW6lVXYbC0t@E$mkm2y-m4SAL7IXYz zfM!os9?Ds#`}MUW&d+tvUzZ5ku{`(k%Ss&BY}*Wz**x&u^y7VkT?>B?(sE zf+6!gkXD~DMmT2yorVthPF8joE&*7;i~7M_TsCr5Qf1e(vVo#od7w1Z-WE>T@*qkD zt&5&V;Wq%)m=mv}=4Sy5g+f&QEZB*C8UVwh&P@1kIGzu@EGANeZ%x17&Be|bmEihB zhnJnaFC*=5`21?Fk}+Q?noJ~I0Wp+~M%UN_sfy-QJ4kwQ2#wzrD6JjVHQ_W~#FG!T zNC4RE{3_~Hs}KQk&a)&y#h9iZpLxE!J-Brcarp_o&c5bqy11$e7N&~|Bs3;oB;Zv- zbdIIeU$5{U6cAbWCL;CEJ7UlM{5nFpgfGJ185SuVgRnqNh5)*okKGyQ=si!YV1nPv z_i8Jh&F^+_vQwNu4k@J&v0g@~R8x*{P3fcoDchoO^4X!Hh_)E2GK2L5vs3u(=ZHdu zK)Td2z-Cr?cX4}kzfM#n{V2)|arcb4uj~~;_sSv{mkwuS;FkrUl06!21-xfnADKRP zzHO$l)aR00l>F@ScgddG#m0@c35ZT^sI8?2~emlIiGPCo_$-bdhBB5YxDP3XM|?iWz}@Ehf8(Z?X=%S?=GzzZ;DWw`&JN&9C3P zBt200H6J~A(0swmi1AO-X~2-c5RDKWBl0`|QGj2x@(-X3@AOn0CV@=J%u*zpG_3A$ z*NZ7h>96nb7ZI%L-xGyt@ahb8-a>IitO{p{(}$nws5zEQ!!`>TDh>}KtnlCxH!CC- zUnm`4fPeU$xAZYg&wl>wTy#_7EF_6jXA@)0sh5q8?&ZS-8vAhBE`02yOqOkyO~R@O?bAdw-rRF8#cUnb*55^RUsH z8zV4=Y=7|4e2(AvJB7}L#02qz)BX0~uS5u=pNZj9ZAye`dDet^cV=AopBh7n{z^$( z1>&-Nbi=Eg70juqi%?g5pIB=*w;k#FA2gO(tyOe{CyKRblk`STwSJsBv7EfTz0(O# zHB;;>yy>}F~=GzO5HpL8%wqGO&Y5c_jciYwa#b3}7nPP4c4_T^?# z4ih~?w?ptu$FGFuUL;s(Y@)=b;ZI||HmtZFL^TzXylCs0AyQa~7Eps3hYm!B7{Tts zW>iuJAi@=Sz~P^URVvPsF&&N{cjVk&mz+M|<44Ed4$z2rgVY{1-1m(bQdI-9C!7kK zE8f>Nyq0F`1+Nygt_M}|_)HW9gjy4BnBTr5Vueo2!jb^HyIr3Hu9=Qo3>xNTZ;o2 zv#)x)!Sw0a3FY8mBc6Yp{{3)>ZPxmHtM8r-4~xEYW9(j6gR=Rz+FgMA4Qt^9L|JryAa%@s?|4H!#afQIs zep+%s3HZ17+Z3u2R7;Ns@7_zTbTY#ID*gNM9E+e*$x+4EelG2KT2`_)L+Q1Cfu|qu z54Y@%Z2laLE}qUXuJT#y{9(}P3bZ~z2nk|Hp78A8q|Ne1<2Z*nY!WWuY`kHPc|fi} z_0wHc1fJhcexlRuwqyOIn$!A;UCU|x*$V`W1~Lt^DKx`$B|WOsG~XwfAs5h-tIx_Ag3!8x_hT|&H-9E8>8P8X#LkOp z473|=(2KdY_dvbz3^(XG7%@-GJH2J%RPwUj9H~ETDH4Pq4KjR3shqq}b$%xsgnH7U z9V)2S`-g{={2>igUfmas_15@CkG)7Pt`?O!ei%y!fG8q~RxtUj>D~LPHiAM!xJI^m zOxj~MN_UD&Ef(OfiK-?5lLil@Ns22nv@f*P^e#l=>5>9&RWI_V^EJQw?}f>-#F9%P_>r+Qz$vSHt) z&697TRpK-rplKRkTgjg*Oy7?&J?M$+>#N_CvR0S&1D4{B989AB$dOI{E`r91Oxg4z$=1eis+{ z5I8?~tH&tLz6rST`oFEeUAWC?p#}fOONYYOC)F z@=JifI=bIfDOfV1dM5DJTe+Lc7m5w=q2KAL+k?GlvPCT5Ry4g}{Y6-+O8dIIy=v4P zBz(0EF*qQ=-_BAtq%yy8A6U67(fHA*ba6OB-&+dlbC&3x#UpT>@DZzgIhJ05z}rDFnJbHy zX*U{DH?I|o!8)3qUNu7l4!c>I!H4w5#7xenG!CM73Hj zYu>!7>UNS$2m^R_P?*7s=Wx0D?n3|ug0+30OII5~ zu;2Qv5j>$>U3tW|k*HoW$jnTHUYUV19|sV*IBmsZnXt(wBN@qNjIWz0 zud!?J!&av19M?uHtcK+*u1FuCCBjsWp(p|a{09@vC7VD7{9R%rO3K6nLHR%)>sI;I z{uCEucon|V_*wM>9)uC9K(d3A2G2h8hT|EEA2?*^LaBW_K$$;7{Uh76wt7^!R{u5^ zEdV?_rD}Q95bs&ynRjixzFYTD7r6}t-4x)_J0<~ob6amR?g@R>Ssab3Y6w^9WH0rL zPl;t4zs$8zY8NMD95WDbisij;Dh?Axi9a>$7cWbFP1bqeq$h(gsV{#-S2kwIh(ceR z)<7!Yp|rpmV0@l&6${{sLmU@XUk)n{r{iEMD5Lq7Y&Aq^dq(gsevmGu`n8aDeU9&G zPSFbNN*peHp|S6(zSH{>BB`xW4MCP_|Jlai^z61Y7rizyHe=7hmH@EVmnf=4G#!RQ zRK1zrf@PXvO?J1Q;!m{34M3j-59I|E>%>%cGn-oUBdlgi(8pa&SsnW5$Xv~m zjJ;djS)zRus`CVV!<&iC7K@4s*sR21C_S!p%~{3Kb|Z zleh;n%~;=_B%;9ePRS2GFh)E;EM4l`4Oh(|wM7l7y?)b^YI#iJC`Al{?14#0A{we5BaHR zyB!UEw79oyR_l7X`>7o@Wmo0pO|fRH+~y5+e=aPF9ag4C+%UC3FaT22+F_tq()8_c z`jR9O=Pd7$>fiLjMt2|j+&)=EpUb&6F41w4!`3caTSqprYiDLeX|?`2BQ}QiPwMyn z;fisH9}{*DGXPp0RjKU$`qFFHo=06|kRD&izMr&BKmH}}4vBZ>kH7YQQH9I+WBu`T z{P>emjAnDH#s>O>W=Hz(@n;+lO@0y;@DI2XFCT0eoEBpB*M@d2GglZOZup0GN5-Ga z6r|NEZ+TS8NV{ivlgdJA{7sd(xOyKdk2d<|7BO(xqbKI8Q!le!p{&>Or=5Gh7?scn zUjiptwb>6L7v|$`L-;SR({L!%OtFcCmmqG`dgPyz7}C_9ej{S@^|?J(yVt(4&uC}5 zo{i=%Ay0l`z*bs9@OZ+eX6Da8k*fQQjTVDD|Lk9w0QmLMeA< z|Ng&*7?ptq0s!#(|Hr_}W@bh((9l9)09aWCLTzoqI!HalR{myNdq?M;uI`?@Sr!UH zif9D|U4D#!04J9v3la_oVO6$`O_j~nbHpd)mDQ&`LTI$`#yV9J`C^kIq=!}E2cjPa?JYEfpnKafM)KZ(`FzWkulf8(B;Y;xElFu0mlv~Z zs!@{h?l|o9y8YzT zukvbp?iR{X!OF;QH-lGf1csKPmRACOWMsR%(}C__2RzN-fYD2j;onny*T84aZa0Rk z%a+67qp(R@UbA{?Xhtrskc3`{+r5?TS0T)*W~PpX{Sn^0ban$KpxWqY+u`S&x2^rG z0Pk>-4QjyYO2&e-VzbX|uw~NO1OwiN8tSbN>t8k+pT=n+<-hU5U(6)l-~F1qL^-n- zg@P4dFe=HZpZkvr$-(|JK@KEu@@!}lm?4H(k zf`Ql&2ZVFSy#AVH8T>#W+G&Q)OL&ld;D?@fNP#j?rZ4Msunx&osl6$ohY&(?TOw#q zdBx-JnbV^3Y8t2|)a%sQR0+z?Wj_})y@zMd&?s>9~mW#aT zx{C1N)f|Nnb{{0>F>MN_A7r*aNI;`0VE6NF&ET`vmk<2UjYo9DKImN)H-a*2Mc3=o zao5j*jEYM%1e(Mzs=JfFRk{vQP5i%L&_6V5w;m=!zPHxx#N_pwTZiBGSKzfnOC_ob zodn=bgEfU_7Xfikz~UYY2^136kxE>U_Ci*Wy?4rB%|g{EOzbh>#gL1jVny zt#1vJI|$M43>0aQ%2$4DbySZ$K9MbyO-R?`F1TOuT-uU9Ngo(`Z|?WRTobR z>KPTazr`-B{!?;398$3~v-7~>(?^rDoHNKD9x;mk)id>%*QRg$wM8ab60wj+6{AC; zoswaCqaGidHKqN()ryktbvg%&0}OBh^M6h9b7r0Hw0k9Uiho;^-IeUwWZNLOcI zA0gY#f)<4jcm5&u2(aS#hD6?0=YhAba*SEQ@x(Oxq+pTN=k`%uro-R~#_AZpq@|*P z_?Kdkt}o&<2Kz=2v8u-+I*}wZu~83}X&P-37A9C!s#+M325V1&uv4qtM&6+su9Gkk zGIixe389IDXyrRqF)boil;Xq4lD7-SW1;ME;kDH#di9Uz$0-_1u1yR*HaEusD|prM5cDu&V(-*UUdK z*sj>HKYRXnA1ZeCl=M0*w^ei#Us&Us3bEC+ms>Egkc$M7GPuD2qLLy6i-pOcSm{F~ z2xkLqFBdKDQFwxUJiR!YQ2TS5A0OS7H9E>keJk#iy4Q3biG^@uKqe_4-y6|I7K1Ym zBhTogIbN*eM_DrbXgIAys_du@c#!;$J-M!>>+hq<%Ggm>B`IzD5<(@K7=X|72ZXYwQg9a{C55O@F)Mxhh_x><9*jNO1%-L|Ak zgh3c8sI16k-R&Uo8an9;~%`5APRUl zo*OlJhGMhZu;EcN$zCpC2q5E6pM4gIEG5z2oW09EglSoO8}_xcy(1~OM~f>JlQf=< zWrD}um33lZmLu8)j>|wqIR&7Pj_yw9W{X{VB&wV=-GUf@%%@Qu zJ^)>|gy&Mhv$h}|h2nXJZS8L=%kQ6O(p^vubS|U?wavajWlyUGP@>ta=YgV5?wLPj zapN<}mbtr0EfSJ(7o|p0LuBN|MC1aKsDv($+EbyS(ZRj?SA5xhOs{PLD)KVNEKjk6G;f3QeG=5{ox7pUSbrb?S8(7k3Z1*zd3&wY_@h=v| zW~QT;tfcCD2)ei;9}Eb=-Qs!i7T=LIclTOgZ0}qeUsPhLcUV8)l;TP5{fzYV!>~Po zBR0HJwe{5zfy2S)ddCeu)7lw06ea~bY`xfn_l(<-%bbE^#hUKT6PpL~V5$hl3<<`H(4mhy8QL<;neqWS(d?DkC)WGT8NY) z$q#aKW{|s?KzshmOdBgb6OO(73Eu<<~-&S@sCyXfzJ&d4D_V_hAdvW z^(z41)P0Tv>taJARY42MXokb6vOU`nN#j^UW4CpeF}37^U(5}CXW&U7GygEe7{>;Z z06mIg`WvdFO2M#%UWob*HNYp)n#ur^8%S{p;Y!(M)r@FkciUrBIEL^XXJ~JxZO;iK z0O$i@^y?@NzozsZE_Xi38`dYWQl<=w6tF-s?wns*(?&qGn%R!sjZ4F6tK>9U@6c9X z8@E2zw|&UALi(R;A)mg52tecCU1cwru!lqS#Oowu zo$h@4p_BHmAs61w76RkOBD=5hvlD`)xdg3-vPwi`W_Ar{?2y#2PxCbQASFmP-I8%S zscADo3C{DZJf&+h&8U&Tfe4${$9#9Sga+aO9va2>E3X3T5%fStgoLECgpbc9(5a#jRO zDPV2T?<*Fq1V9&;G&Xo5Z`-xpSe|FMx2O0f{&-9oYw#4OjZ+s`K; z;BuyimjN;VZBc-Z0F|XH%HwjcP5wF7P-ejW+qy zK6{s%bMhpVsh;h>e#1xl03#7v$13?k>7v<6X_kw)c_f2mPSM6Dk`_f>CPBGK0Jegg z1_e&HWgNu{j5h`-wS)VsF#}C!dgsMVsZCQuSCOot^TUuF{(kBGw+I_)F+nqgn>}y^ zR+T?b&xVR+Xw!8c_Wr%Ej4{-Dp60RAujv;A3Lh5sWceMn2z7M8R~W1@bGA zbYz&8YSElBPbT#k(HC>`-+4h@zfaaUDZs-*dE7Vyw%@N zXVHHR_$iK7K!Y!TR-paLKtOg7cljtMHY-MQUtGJ`hw;_7+p@<_JuAYGgqfAylAcr) zUv`o|7kiPJpu@*r3>WopAOjGWF!h{U0j)`fQv#jndfu;r%RrTuKEPZL`!pSAloKR3 zE2KxIf~*xUq#)0R&NyhWAeMxSJRi{!8=E6x%q`N$IwZOlk7UBx07b>Wx1v|x<_S|j z^WFcUNsM}fs4YI5<-Fg6)jFEF>#cOCc61}pUJBln_ahk?Qt@tax!LkF^Dz7B86Mn% zCb4;!lc5F^u?h$8vpFgA4apHN=YPSi) zV=~j5Vzg~g$UotXrLA^Avt8sgZHa}uUzC>?cucasvO5|u0P_XH$Ydi?b_QZeDRMr9zPb$^+q zMNS5|t)IdDG_SNqm9f<4*&QmrbO|U8ifeCUl8-zJyE2)4R2k;3ui-Ib7j_Jug=S{k7J_Et6QOGMritWAPCD zwdNI58Q^lSt)Hrs?c3%9HJkzh!cQrGxGtq>RK|7(DE=M9x!?1zBjLX)b`h;U<3&?; zH17Ivf_!Sme5|waNYL|o)c4mFLKj$Q-OG;qh~e+5%04~Mxuu9ZYZuhxSJcbj$JKui@cK27S+7j zfm}b!m)WnSE&_CEL&|b>4Bqu+pU-k0Xw2n|Op$GbNnhe5N*=!JSCCD)OqXKz8%j2B zp?k0AQdP=K4yxTNL!IYiG8;8tAAy8~s)YjV?YCOTKCE696C@Z5s39~bO_B95kG@ot z-`InyzKQKS^je+qRJ>|Azj1ZM*>u_83eUO3sHpR40s4k{o5uNu01XB_h`y}Ad!}xk zI^N%SiyIj(AlE1uBo(4bdh^J^bxdsNOBlG?;`K;uz0}M*ioXm4L}h?ja{ac+^r>2j zyR4b{UquXgiewJcKi2$2HhpVK>Zz)(Mc@MuL!Pagb5m42l&L$d#`~ku6B+lWhWhw+ z`i8*StFbVu?viQ@)knj!lVAoor~w9MKpnTDp?M!h7w}?@q4M8-Cl8)CiByc_sTavR zGO%`8-lZ}AD>k}q>AXqriC^+GvxDV@LDg|kn|kGJpU5gQq|``&$Bkh&OK_M+1G$GWjwK}Uv35gPTqTByhb(yEf-v4Kcr{uAeP(mSLeDO^DX9y zYRkV|y!SNpQuQ9ETDPegUin96sdhT=nRYLw9jMBm+dgVKm3;yv(E{THqN!tgx9$t>OuJl{gIq**akB$qd=O-Kv6__s(qo**y|(E9*(G3X;R>J@L_o zx3j@GFS3Bs8k?K{=!Q?joDV=p0s`Ks3SiAy5W)_YW&f3@s%xJk4tDQP&G;2ur%aT# z-m8hH9+#vgosHLG(iS$h;eNsIEr~J~YEU0$K}&#A(%fnF6bKg8k)F zOBb**Zs6K zbZ_eAlIgn!Z|U5Bq`CV24}Nhgsyh%TqqxK92!oO#I>~pb;|wluH+cjT7TqK;W4b;e z%N)4Iu3Z>8GF2S+y!H8N=kK`W?1;sXi@gFl{d;GWM~zTNb&a`5fU_25&HGqp7vd5u zWeaN#D42OKFK^;9!TSeq^`d^jEB3u|MhX2}F`Y4p{%dup5bg)BSZV%rb@5{}sK)Bk z^`W)R|5_eyZ_Cb?$^3h9r(=rwwjadnW>$ru?@qMw{rQpZX^fpfo?{}ZGj0&%I>3g)+og4EU0{bv2^=n&rb{=|GzL!nc#fjF< z?QQilP1$=!)~C@w;A(^4UTc2b9>j=`yMA;Q}WQ!k)jl35hFF)Z=Vxo1monWwkF!7 z60D}C_O%@rOwg~sJp+Ng$n1TI>w;$UR0+oUN!}+ADxows`mfZ|?(!?H7A^KMHlaPJ zNzH8`9*7FMpNaqLQ59MC=VlUvha59R&<@OaOphdj4>Oj!)E{g!7HQkQU5(J4sb$=q z(wM=3!kbA0iQ-=Gp&Xc9IBquPrp;FJ%yY(0wczwgZWd--?M`wAZLFu2$8ie#mc{z_ zu77rYIgN(hZb=9pZ6c7S3~=DbF@0x=%ya$xpCuDLRkVLrg!>+eKbhqUc>MUVMdEfw zpDrrTx0l}+FzNlW9sF?!qHa0Kn#9Tau8!~4jMnerpI|o`wNboDFgU9MIvp*X zk(o)YiRES7%n}yLO23(1oSj)zj;^S@U0GCeySB8T?6z#D0ktLu?Pf_6uFe^?4NqC1q!W1-I|7v@hKnZZ9o;*h2&%aQ=bE_i|e63M)6CuH9T* z$*Fx^Gx~IH9^GlC^r9Qag}wDsk#+b;u)|0}EG|)mvOp9E!-F+VBDi$C3fFub$_jZ@ z?XiNeZ)#SCLk`dSavo*KzwEh65Y+FN>RwYSkTh)P-LrEAXthKhm$0*4=(82N&VIaQ zf$z1r*X(aO=TKuDYqsLmf>@k^)iE)+wri{%N?hP=aT_$b(m7*U9L3U7p}K+)Q#YY) zUm+QeT>B96Z}3OMq=OGp5J!QZYivx(Kldzk>8s*SIn*hY1jvy9pjLLEI@l6NGUpI& zG$}7qa9LQ(HyHE`YCDq!>*-txzgHv_DkD;?f~4v@@Ca<&a?8Tt_8UKPMAiG{Bi=?v z8Z3h-dZJZgK)%|i)iUoIW&g8;-mRsvSe9`RsV)BK-`>?A1%8$L0#qrdO=Y|~TZsI# zmYpl45oL~$+hKUDERvooyHC^3boTn0pH?6CxT2{t{vEfOy}c|kb(4)jyCplgp*i5O z2p>Ry@UZ+$_-B0*v`{(V94rG_XINqe0~n9~%R zKk=Mckb85(qm{HE!66kpdKl12nD1w))MQyHF|_z6<&{kq-&>($I)UK?Sh-PSvMc&$`=quHZ+XT)EX_-gli9t;LM%N zfj`cuFkRV0paEcYC%2~NFBp3X8yCTFu%oXhFP4wj-}633OZh0HYA%B4VAjtgcsPhV>%XEU(JtxMD5 z-;RZs7#EZsm*kNt_ zsY28j-En@8 zW`0w_c20vwPI9r4MtViKfb zrI#-v!KAP$2v?#xXBVkhwgOU4Jranj;_1My+*`Bh@Ehj2!btcWKuj zmAEo)VnuR>2M`*_8_H{f1#;ZgdU9DFHi}9>u%t2Y&q`jL%B5F5 zP;6)sXFvLar>T`OqZh}5NI;0WlW@L$b0N~jOM75@8WV0mRcJnMy8}Y8p)bxSePam*qooHr1jWGdObV=e_tiEgwPbS~&+DQT{w!*DMa*so0<>eVBv8p?@hx9&uW{3Hq&WP<;asPtTD5?$eewFZf>*!nA_u=UK)(q*S}nX!0)4;)9xNC( ztIL|%<&xj^IzWCejfS*W{$hM>l~Z~^=wk>*EYss|vl8Sf;$#NqOf!xWEld3`|DlW< zjF}f(Q>#J>(2{?r|Ek$)M({lpn+-Ugof_`?ojOi;sILO(Y{im-K=g<>>WA0jdL1+o<0uK$a=iE_8n$M@H4 z%d_p4{&)VfT#A`5W5v^W^S@QWvrgkx5yQ*PQW*>~z&mGdbStjI_fK?{Z+=f4&H<5< zN8kNc{yC+_M5Z>Q$zH>YOc_$*BhgMkAKvp1O*f78OprRh;H%H_w>$D^9RV^di?p@&mvsco(kcsI+Dj?f=_>J?352*tX*LOFv zP-1V)iVU#tzZ-Y^$#X3VaNRO9M!SrD=6gRxUtt&}6?VIz3#GgHa+;M`aqkf`PFrj7 z*(cLGwm5Wvw+}wzN06)F*{9ILz*3ns%!=<5w(UDZ}N|825qI(V(YG8@&YzG+{-iy|IL0Ks^%X!hmU00K#DPnuIf? z?MIqzR?-3&Olas#$ir3fVD)0L9gWyLqb&)rEsWDCO4cxwIVeP3}xhCRwSR9?oi86zzxD~7M-2C2`u)3Yk_35m*>lIyb=VIvLNnJgZcs}r$0A5u9*P~~Ox_7!gB_8Sm+_I$O~ybkcJ#8gZe z<(<&aqm!Bz=i=boVrrZg?9iEAqLU*x)fR#bt{gd^a}7-E76GwkWkO_-c~u5N)E8YS z$HY5*`F1U!!6)RWU!<$U$LUhmUXz+@)q173w>y$F-m(2lxj36Da8*K>iK4OS9C{^_ za8Mb2ToyY7E8Y89aUn`JAiM5rM_py5YJxrhp#ZN&6v_HfI7az}U+sUUBybYDc!GO&Ruqv6l_bJSBP2c;xbpE^`93RHF|TBz8qyv0mi zH4{M^ zvf1OC8Jv#*OuuzkAPRqhL#W;p_IrLvGi4da+ZSexEOO!-e+D>86rqWP^-jd*Xq_1; z(@N2`?l(@mz9*I&5FB+|K83S-2Yi4F?K_3EB4U|G&nnty1sy9|Qr#>6Y~R%jaj_Ei z;Uwv&OhMt^wjdFh5le}ffTFM$Xxq4SR;;OmYb|V_N@>f)K`2!6)^@ow0S$SExFh(d z$p9zz_ZY@#C+)K9Dv%+94XA<4fKwqxjQU+xyAAh;J(iskCFkR=NV6F{?=}9@Bw3sx z$T8SNNVwQX)$?IT+!0!s$N(cV%YB}bT#M5-&xhOUH*<8JeepCKW;nGN@c+|fLV~3R z0V<}vaZOw+kfsK^fY}rmZ^b}r({L`9Lo4*^t5V-y^UROI*)yc?F<`ul{x1<07^{dD0Z5TnuJAbbU&9%Ay^z!EARwv2EUTllfE}V6G~8a@JrrqM z;!czA%1s2~)^i{?lYQ(~-0X z$QZzRQQ3Wt&NMm6BD|OWX_ELWeV`v_O_jK~ zn}VQzu4p0mgHd$S59oe+P)*3l2&bi}b0_jNJ{V0YJNo&bifxm*NN6*!yeM3XD5a-9jAh2U4c5e@G8DJ-BzmBoF zJE_k2chCvf{7RMtKB^2*1}0C=A{zGE_Q$5*9jXmuhLp5tRJss`!xL{e0bUgJ%{7~u z6p)^)?j{Lj#!h-Tb_H1i!|wNU#A9bGdOz`)+vneozMryX1XCxDam)dnz*RmuFvU}6 z)d1h0F!K`_cFzwdDzYkYZT-y|9I?=yGnq8P>0}%>2bskC zKmV?BCNCVXWWFgi+%%L8PMEhW%b@T9^fuMm)d;G5VFhlcB8h8&+H4VP4LBC zG54T2;H-=H&Ne-kJSXzk=h)r?MqWZ%RY(NfuYVTW_8uwfJz6`r{_4ce#IB1+2g!!> zY*R9*<;N^633WI2WwuX$m2+U4s*14aR#@IF_-MC-e4GmBZA+g#pT^^+Q==;{omxU% z3BL4Yw(PjdG)VsJeg=AuM*3f z8@b29Fgi?L&C}V5erIUOWOK7dAD%@mS> zNT-D7F{`FmC8@ndbf54-JO=$Lx>x8hV4nY2i29XB%Wf{6WgaP4zHYqQ%Gu6HFaPWP ztd21<-Shk_%j9kX@WMx9^HKA4u2TD0&bM0T!u6Yf3wGNItVcgER^`Wr%>;rlYCi?a z0wCSsp%6Uy%6ykW#!*(M>0214k@BL;W6D0}^_*8linT-DmZm|62O20?Gt()hJ={z7t;Hs ze9uLa1l~sc+uxOX`i5J<+d5H*M?{g>s7-7n4whUzNR-Mfpv{-Ld!VEsh)Q1!nH)dN z??ITL`?D2=PxESS94UT^j~GdRLo9#r>E1i(rJ_vI{#@4ktXyjcI!v5#$3)U|R))sc zk#hdR89=fIgQFhvNBw&dOvOoFZA>40cyBVv9*|kt!?|9$x<`M!mR4(X>swjV+`?eH z9psO|oo&GnzcK0EF?>+ch=p93^NMa=&f?g{~DjE%grxj5aRug1Dh&~;WY1S1n=~Vjcl@}3|HQ`x&5wm?N6!I zyBC*FwxD+VznqWfEMeeRz{<6-M(>C)cNMJXm803`j}d`*7Y@(9rb-25En};+ALVy}r}c_v{*< zfz-E8PVc|pUpIP5?=^gLU7|1GrC{l$$Wr`o{ZE75vDa%1+OyKpkXKCaR-)cNzvtxt zSJXpkGxTiSLD0?oIpTx$wno4~i}kOOTLK!tGY%dm&IhucJljhe{bRU0ey>4fxZtye z%i%5ob|Ux-jSWbT?*ngLksx!HZHG3}1MCOelG!L7~iaWQ`@)2U9L z{jwpy9#X4>y-2ri{XFU$O~Xoca_!uaEVH6f@?yGBtP&$M*^`VtKe-w8_o=4*YqNJB z#-UAeH(bt7&U3zLta&fauNNoL`Y#Po*4(dRS2mY<(fmr2cgEr?NV(8I9xC{8-{jgf z!`FWS+n^0)k;1U;n+1>YF&|AX$^wPCCz~B_ zU%D9k|NAG?8F~2S1u1ZF0ZOQ_v_xK>lY@z#3JOBA|CcT%ropW1=`3|H0wsk*#l?d| zD0x0EW;*I_a2mAkc=11Uar+Di0pWcXg@Wa!6gB0uf_Es4AO|ZP0RpR#I`Gx;kCUI7 zGWs)9^$Z+BPsfiSoRD&b;6k^vepD4EA#S#i>al4@wXwa7(jzY0eI7X%I`kO47lG=- zy;ZwWy%a#uZ5VM zvvk!M|F^U=4XeD6hdMDnct~2oR%Y|kkC{&kebncVPh4V3OlKZ7fZ0y;uoAF9jt^OSx1<5;Kg~r- zvRV0(>!7jtcGV%}=K~nG1m8T4UI*#?${B$1`Bn=fN*k=BgsE`}^1#K(T=n<0Y*$h{ zY<%BDeCvTFd(ol}FI~MY7q;~vvDWw9IWv{p$rwa?Z9?Qm(3H4Pz&6=2Cti2jbc%+b zGPnt0La89xlA-m#x%JxXSG zDXnQMAv3&RNF*g8FFEB}XqucAYry2}y$S+BHmH^c7k<^=072TjmM!j^tXjIjGR$-= zR417Iz})$gTaN{G$?bQN-9}J3;k4am?Vi%=kZ0^zFaW;HQF6m!h136GyK_cU+xIUl z-Z{)2#a0QE4z+<9Ik9%rkSf~-LEDITyLFi27lpZDo&TgS(W9}4fX_3~F-Z5LbkqH- z^;YDOI^FRG7O%NEZ=s%>Q|8~!1BVi0xRnf?BQ{8{*vhMsa?+PcRK0%dbPbPGGZ(|- z;$OE_SlGj@GK&t0WhL~9^jVXElubZ~Nzz6z;?c<`vG~{VvBzUb;eu;@aY5WrCXSq6 z{K^eye`)6}45SN{V6rxLJ*scaSYFumS&2O@b9n7AD_Pe%wXA_Al=O?mW}(&)0&a6a zi_OX-H&xHu2kX8U+t%XpYf1l;W>tTl+iwmlI8UiE2d zd1qmM*6+e?ZS^8WXn16Uf%NpBA2c%vG&hQ+EOq!RcKW6!&-P>9&A5Fo{Pr=C2K$(l z#6%mHV+pUZ;ANz-)ImNt$38v3YIZ2K4_yHHv7cM&?wc|`Np*U}*7Z{l|9F_1(+-^g zV-BWFy-2^c3xGA=(VR?B6bWQo!~CZ*oJ2J*D$J$hkr9X_ z09-ie*AM}VtLiz?a%~}k=?Qddgale60$AK+K?+n7X1Pn{K6;!bm0JS{I1JNhqwx%n zBlVw6DW2;a;?ul|9U%8yR>qxK$A2!+WWit@1nESwnyr-&h?X@nhSWq!OXfS1MADci zhnZ1zW0w*?=OI`U-F-I!!NWb(rrS>cB9j{|gK^L*!Ze`9T4;Ay21m|huhy8nPn_Q> zd(VwQn(c~u3e%PB>L)ThQUYkuFOu_JGuyo>X_B8w5TpivS9FS?%${2IR@9b1V6UQV zNW_Ntdrf zH9d&L!B}q5*#yME| z6_IM8jKP*yzAmy+nE}w&W^mvPBX4|?znQpcNNZ)B_gGfaK{OWivNR3e7)x?4pA_@E zG$SQI;=^-jsT`unpk+Ua`q3$P%BA3cGV;;ffSgF&0w6BO@X&FmS6e(q8b-dL12wjL zDl^IJr1}k`IOv1*-V|vxS~k~9HfME2pcxTmAa67C#F5d zz)%0ON>}6HZ@c7ZEZCeJP$kSmijX6MjGtFLZp$Jx%_J4dZ6+vrs)|$`c)UWVukr_I zX6j23$0b?NR8 zp?G##x(XiAnA;sh2Qr9b0hB9p@`(;6vVlf@0HGSw>UN2Su0D4@fZYt##meA&DZ;isL*Vvf-&=i0^x_UT#-XaVWJ|F*VSG zo4-6`F4gb-frN*0J$^TAO9;O5bz%SEnNsz*cgB3{R$oYqmL&k@nYSf0o7LPHW^*qC z&ftG?O`g@9p#r-3T%+vxK%V(&YsObKgPYVn=?dDVmqUN;Cs88pB4&DLr?j>xS*$tHZC_7if6)6Aq^Y+Pf ze#2NmqN{pL#xrs1U6vthvs52YmdrO#t-sEUFTy|Grf~AZBUs)rZcodt-jVhvvVv81 zVZv`!%1Yv5g?}&n@djt+G~m9dgtwa|<;qh(#$=IuNVRC=^go5(I3ei+B z&v>2?*rx?%N~vGIkTP%z`mmcU2Lnv=dOeFVoAXjXw@qI}M6jjd3X2rXy5w%wE6p1* z(eAMtlX;<7umuX^CD`$enIGcL0ggiy>dZ<`@y2O^>%EQ`(<3(#E`=5~ZQ<*h$McCi z2?8_3V0t2yQoiQFuzNDQB^g8eRDE5dZoTL97%T{@-(_=-6iQCj;89gPrGW@-C-Z<( z0yUfz#V|h#)ct83V*@Zq+$^cSLoT|0?BIF9DWXJJadunmE0k9N$q;;&JZ6W5VSyBb zpjEUJXE29;I>mTt9Tky$=VxH(@f8I%&3d*Q;tBWzN9opue4h|}xyb}*MJI#+cgTNejpuwDBr|_%seaRK+VTvq}D@XU~;mpHc zwD3b=RB_^)vw*Wb6&pK5(vkrKik5O*?Zd<=G~^U`#&J2Pvk8k`JHAih?W8BnKr$dX zdW$)Xf{EOjjTDT~cTe-MRO|sX=D`bO&~^eXVV>MzcCkJML20PB^*dDOOM~cpJ<7@9 zt9OjkQn65DE&#l-inS&HOu?W)PRP(l8;Qxd=#Nt0t6**90$%q^qXnEW6gU%+hwjUv zp1jv>cn%#>ES5}_O!)-9-41%|QzV>P{-Z!`^D4X3G&AYK^*^OkP!+@WtwWYdp__!`iI~r30 zH0No|HS8JagI)6{a`0RpKN@kXJ0(p(@gqr;(`GbRFz#ujOIc$fd{>V%3c)e&65B{G zx_mKv6>2P*7}XG_4Y@zeMX#3wavxS)MYw=99-O#4Nzp>Azf94+sjHimn0k!=Ynps4Wp<&v(7} zR!L6t-NZBvL3x1Sox!v%X>`XVt{I+jK;krm<$EQ#KKHbFd`3(G973V3^PK(%m~c^EDs;U5NeMr?!Y-MV{`3S zvn`IG#nOdBwwJFfTTE<5r*z#D<-$KrPYkhXG|XtmE5kbdp<{N??F+GIH)1A zMJ5xPf6=T@#3dLQpWnoDLZRbkkY?pc=IMq_Gg`FP?UfurB4A%5wgl`?h}_ zv!VsjTqVab^-I5;vQOgcXy4ZZM5?3?^&EM2(T6bh5?AF*6eNHl6kKs`;;+kDUZ_#` z$S{3%PlIUoXTY4_fy*fbXc<;HlFVRvT-XZ2_>lyiH`4k@m>_rM_s5Nf)tOt)hErI; z`$4Ms1DOrq&?lz6%ZgVQYz0fYRax$#J&PO;sz8yd>O1P^s_QWoNsTamaz#RwX!CT3 z&q(V_AKLrfy*kG(VUhqF3F>?|0w|8gi$>l16qEG@JI%fF{}Fm!I5*uRgCE zJ%$MScKxW9v5GAmEJM-zcBrcsC)ODva{IYEnA?%+4ku6!Y1YbJS9 z@|s-{H9D~ywE~f~01rm$FISBAGz)LA^feWLE%+fgD51Pf5qm%E-$=FC1^Edt0%hHn ziNUm_>2S~FtGpR=+jS*5`d5c#HP~~j=~@f6Mwq){7faeH(!)b|kXl*X;?Ks@$)LH2 zPH2_#q58wD9Yq=fuw;rj+4b3^A6;`4xg$Dl(v1hD9!l>93z@mply;(!pc7v(rSoGk z?}H7`QTbE*Q7Qz<;`5-C#eLD!Oxukb1-2|q;RdP{BOg$^hQIjCYL+8k831I*BJ~<8 z@oI9~gwWeh7zA7f%vjGa?A$J^`O}j5xXQ234?aYnmkus{e6HIs6J`~*D%l1c&GHOi z(yvO=za5h@E@25mX|d4=kpZ);Ec?DdGvx?;V8+ovVVxE@5o~kO%Y+4Mq3I{Fz?;=D zGwV5rAXG5Vjxc#CKY?kyjPlcDBbdK=6TJT^rIbY^>`IeQlR`_Ag@`lnpCsrw&JW?P?Kk=*+I`3D<0BnRx*FDTlSGiF#_xvrT z`M=&LxQo}7$E_vEzA(R=bMbdp;yTN51@rfA?Cm(U_@yDOHkK$eQI2GaS75qNyR+_W z$kE5;+LsMk`t#MP**>k%w?0{dB2RDe@GSB?sNdEEm~oMaCndx$X*8>`F4_P+5Tky1 z@W?8ULGS+kxS2PrN{2T*-7@D@v(`%`ZbSN`28o*#V7^U^5=|RW{@Le-XO`9?xK<`j zMXsOEeXD&5+3fv>^RmlLKB4~{J?WEj@=xmB{J_PAL@!I5btV1;F9u6b z+JFo$7X*Za`blt=Oeie`T9Raf=yiqG!KPH6Z2V$5_vSR?@z;-`a$+ zrU^|xj{rN3ugJHzLOlmwX&rhn-pp;DS(%<;{aT$f^zInq@yBLY?T1;ATUYjtfqEmb zOlc5ng}+0Fo<&{U%*G17FF`^Xji7%+x;{OO3N-s+AO7*%i!~=(ZTqg~Ld>Y~Xq}_|Zf5 z0+%|sHXhiasAC8cQ8N;UO2qe9$Gx38$pl#8bNwG5Kc+waqw4+Z$E=d$)A!;`Yi6yF zDb6ZldqH26+#a?@za+5Y;Xu#JqjcYIdk8oRB`BDflq!Vcp{2wGQEo_`q`T>fLdj_< zDFs3WsN%aR`Kg4`#FECl59^AXYwK!CY6|O9jX=o#Y-+yt%A(GS-n66|9XL3h1yY}L zU{VFEM?1J&Ml(CIyDP62Wcq2lf4+xoK7?v}cDjlb7ByU%11 zNfA?K@?O(yXSA#P`5nHa4$nzBxYr^e+!tm@MRd@Mhq=z}M>Sn-b^NWDuS_<3%?i@T zlRV+M??y{kxBQZvSjc^;V!8}$8uIpvqDu3+`m4ZY)5O)Crs_2F5&V_=53Nuz`UkR> zOXViFI3pw!Z~nv-);^$j2LM`Mtk_TM_a=ki8;!e6RzzRMR;k7H$gnLlcmYVg;1H?m z(Z@9zwCg0_5+xXq?@!tNN7uKjL>ID8K1&H$a5}uwjWNI>ObOe;>ureOf^*N;$)>`g zI^QY?LO}(_IS7~QF85P)0yPK+Uh>p>%@4L!XYYp=Gy7Ol(z-6s}OG*zd_IsK>~X0S|s zj#}-{SzY?zR#g{<{#I6@2l{JF?Hi#!s=Kz<0g1pEOOR?VDc@1}+_|A}NG!I{iIdu1 z*jnx1^|ulxhf((O$ZkVXwR#))EDUzNCljV3k63Ts{~)@bF%Z|~rIy5kvjO1Y=;eTC zfJjMowPLMfa)wF2SY9Ji=&C%kk>j<8PuG3SVKk3b@Kmc$xIP6v*j3$W$=Wm*vlleN zXItt`i|r(j=&kGrZ8>m#cFMBdKaesFK3jw?AkOAP;y4UO!9BjSNeDmYcWD%5w9{A3 z-XN3L>{%!oP@Y9?@Dk2%+t*w(h>dwwm-PhRI`TKXbDCC7wuc^SvBteS);osN2ebD$ zFZUn)-eqdf4f=dz^p*)99SvN?5e?0ZYw?QUZ8)uq-0(kF?{)&e^U)TdP@6_oAs34m ziIU=w;RHTvoWAz)+@DXkT>EZqUHi_kTtGDo<`e*<#(y8w{2O!G(Iflw5^j{+{r0(M z_Mx*BfZ>7_I&c>)xJ9!GNhNjQkq-a8qj1q`pItD>HhYbEU4%-Q_LExZal}`Z`DT_1 ziIfNS{3Enlm`)zifXlCOpNIT{gFL3u0VmJ}XkHZWndV*T|-t37Yv$a?jEk(aCW>&N0$^Rnn zvbU1aPE%$X)JjbBJWMiEVPIpgSk6ED2@~QLoQV%v4#D6dI)ntis9=yLa8i?+GWQyd zSJI>Ma@#$|N&9yjz0wuK^JP}EGi`HFgnTwI;Tk{&C!_pCA%SZ)_cmd*VlLX+hDXx= zJ{$+YBuM}jiWJY&Pe;WTV&r{yC1gb3c;oLy^Q$Fu%eEt&NT-gtGOc;oTD|BPGXp$u z=l(EtFevhK@n*w4VIaYFa3LB4J=f6Y%qOj}WcG{!mN|%HvggR+#`6eCW!j`A^|F7j zckd?>tC3bGxzx8CO-v15zFb?Zp_)gzsFaBZjzgaRUK@=bb~jmHtj~vHFplaA^n>*f zIaNx}c!e?VWnnEW^A!NkJv_D{ zl5?61|BUkO6@hTFV+c7f4THbo*>d=E^0ki(Tyn;4z_{(zI( zu#mpN(1e5(Q#2my|4*LhO+j5~ zsB-O7yc`Y<{PanuBa9qIj*j3Ks;}c%rOm)aB zTHBFn>0NCaxwL`*^!@sUb&u7dAVCK>22^yoXd_Rk{g%J^_Ip2@TSA#v?S;5pgIUKO zFc?4h{^)!K_rPIRyfrn;CveH)`MR&+@JKEHhW7G!tz`#jO25{>!Xx_2f=RlHSam9y zHme}0=R4yXx(R5Rx7PXmx;fjfEAw1!niT!>lC=0&vW!2I<7a$0Odn}9V=z)#%SbWm zcKRm@FV1J+rW~LIl%FVr?_E4_3o|Y9W`7zRDe)pebdA)`3|!H>FbpjmGOD8| zx2~a_1)F2C30CE4G_p7+2=3s(^|De%@2iC$x;oRU8-a$Qe>1oa%U9zfjKYxh5^?VX z+n~jm+0wtSe?0H|T9d*FkDtfi*xkbRtF6o%mi_p)+5d7_O}%%H#^28D?~$)Kl>vgU|yAh|u`oEL39wHNju@G?_M3R^+HJ>a^ z$r3=O*sLX6rbEm%AiVGx*<+U99k8F`{z-?4$B`%&VoZPS?W^LJ*iA0^`E#IIG-etd z0Z#z-#cbZGspv%CG-l_?_{dwS2oc3VB+1FL*mRfZbl-7^Z*PLGqu+1{5M+-}3I@G% z86PoAI~B2%vT@I)3h0o4p}tVM0=lt@o6!@lYpl`unh3`fQKSaMq8O5zp5C3Fp1Bq# zTf??@C=!?_`U45AT{M~d;XifiHT%=|FB$6N$&EPCV8-}D>MmU~jVhf~t*o+SXXh3S zP8J1HGMw&_eeY#9rhFN_%(z1biG<5z?+casH8#y5$XaUK*k@_sboqo&Ss^H}(uH=SuZL>iyxfr!z19cCIV zKZtRC6lq93pH~6}{a6C}jBZ_t!sAuo7&3%1#6=%`&5{V(W3;nX{T&b*pM1l<7a`i= zDW0#39qbBq9brBVg5M0;QixH%tLY~rvl{y^rJd#?PLl)y7={EIe+o_h73x#$suU$y zy2SYq4Z;1&%GNB*X-e_(U`{fzyo-dgVRL_QoQFSz1;w8^Fq(Q=nig43IV+nML4Ua{ zsjyK9c4rOjVVb~wO;JkXb91Y2gsmMl@Y)=FeA~fvR4Z{(TV!Q}-u=pPg zSlBVf!QWcc3?+QEmMWsB&lP+C7sf!`5riHoLcbHCPz+!rhgPD!QW9k(iUTo6P|F+@ zn_L}MAS-P*Fv&cN!8greB%+<$n-7t2-c$`vSG(+`dv94^Spq)R(LD|=IAWnB64QT- zV82hs28mr}V==2Rm9KQnQi(bbBcyOx`Bz+$E|k?G_=?w6@0fikLGaktgfs}V8p7Gh zb$eSEDK+zNF;~9(+(yULe-jO$^1;*FLZpxltC|hrzb$vuWy}ki%(hux3fdZp!~%TWFCTZwzSQOO5(~r+Ms5BrwA~ z2bFMZ#>|azMEwT_!oVR zb{Woy&8Ldc6Tr#)d-)A-@`NSeS(Y!E(Mp}fJT$T?9x!7n%y;AD7!tnhcz6&AP-_kSgFA10+9;BkMICZbl{xBvx_8t4vP@7~VvrkW;P zut+RpK`b1Ve+vf(IVDPgT9*8f!kPtYcL@&9t5Hz7UzdqTiN}v0i@? z+~9!8zdh*hPYORUffk?`c2Oii6>OWb3^+4QFJUlWV$$@9rj>e}XZg4v&R5bz-?${g zK#WN~I_I(=!Ytee0LK9crjDoQDp+#!$K=3Oj@m^@Vs}|*uXdk9GE5!UJZ$XtsYmi3 zPrDK%4a7=+6muo9R;GDIPu>;!CXF3o4NF6nS!h4ma(Ys5%a|tDl=DFoeBeR*7WAA` z>{(vZ7~KU?Xn^lQ!wqP@kaTA5 z+x3bz$8zZj;US8A*_&FUDz~2~5glyG=x7Nt3w72gGK3WyxK-tl5ZUZ&i&y-R%aw9| z+bDf3M_g3=&ls!h^UFgJ)8NP-%`Qsmk_{rXU&(!_)+Zx<^mOwoh^XRI;nM3atlrao zD01a7-Nb#Vi7+?VU*`TIy58BPp#xF43Lr6yj>sZj28!rt2w?kZLs}Z%+YL7_<}HRC z&ao=YbsKibmx2(~Yu4aY_(x3va7B{H<2N@|$%9F!KyC5+ea2DvjIc!j;-8zj1<%3(x+;YrW5-nLeh4kB4EFt&lrxs=7 zhj=E3PGOLJ4!GUWm;vD+dhU+A8YRin%@^pcr?w@%4givw-8Ea-P*8hQD&|L1t za$0jPX)E?hu`)knfk@;m4fQTr=kuWM+fAu(M$ z>9j5&L>EoMqd-~Qu=b+ zv)DgQz}4vdf2B7zNZga6!zqgj|DIPE-fQUf%kX7h1+q=&C&9At(+IY*<|Ta6xWkRpN7d z{^9iT#rG#yo+s2V|JuHOO5`mdLYYY{>bIFGZCK93@>?eO?(sC^%o?$IGNZtH#76cy zl>dQ8Thwci=P>^-h!`(OYG-gLcYO0cFEM?c*_R$-cJZZDd|AFu1~q{>fvT!>2f~L1 z*^%Ix7s!J~q&HPM^u;pt^}6_1rU$Qdxb4W6N@-mIE>N8htaG)6Z$hMY-)hime~qjC zbZfc=zJp_&@X%{8!a{TV=wPUF(_5Lw(nU>vW7GBI@5159G_((77Gm@o-geWM(7;mI zE{evQl=SxY)R*${NgkUi3*%c9|L$$AduHWCHvf4Lz@1w;_EJV_$-+1kLx-yRx>p<2 z6tD~bQu>bQvp1(5wE%rjM}23%cp)o@mSX_I@buRABzqx4ntFM4QiF=Dxxobh$NDc)C6O zvcD0*liz=@bv12vZ|2gs{1#hg%4B@o$lig(bmnV<^Le#?Y^dVLhQ9pIx!T{T75er_ z3i-;O=0g-`h5kN+Anom9;um=}j(z4UO}y8h!0_C>;kUb_qeA|BOdl8Zerl(xp?1XZ zE%eWK{Q|3=qvoNwc@+A@~!%pidlDKW?*JX{CE+1 zC&c0;_w%4qQQEb)2exD4L`!$cFSf$(UgulZ}+mjitYPi9_!xa8`da_!%bvehz zGXnqW>(fYcSvQ>=oFv0@h0zZRyToRrs`@ab!h!Lfy~9DvO3Ych@4u64JF8mdMe>p3 zkH0;Ox>S6AReXP}+v%M5!eVy2V`~xr%31&7E1em7%Oa)oA@6@DHxIvVoMi}{6IAW0 zCG2c!v(V)$CpUjNp|^S6W{+ax+nD93^GZ2d&paIgnol+Xws%ug5Kw^Vbmty`8vU~umKD}9{j zqc(FNZ}RC0a`BO?#d}-d=li@AUSP&u?E%?TV*m78H}?kzvm0`Zk0yc;|4KM;*mpcY zN^o8yi4wZo5H&x%o;MwNY~RRk@rQ{Mfwdy=di1*|^eVnZOG=uAj=BB7KJBQ~E`L@v z6J#_y?$S(2Uqs4NC@W+36e(rrUVAF~MTpGzwZGjrim||P-W$2*YnA7ce{QB1zLSt| zUstqV-WGE#aNA`*9%ZDrI-NKCp(>dk_w;f83I#4AFqgofkr?Txgu?1C5Fu2B@pG_pk&?;(MEJs=K*N!EAqDuEGDe_o^jZb-~Z8@wwH& z$Hchh>DjiY2*sDJ{TgIQ=d^K5L6*ycSCQ-HYr8sEN*@2!iFcvLk+5LmdvQ+A^Ck_o!f%bd zLCHReC9+(YVt7k6@n*6!?E=U(Miwt1mi!KQ8fdYy*~=riy5Hi*?A$3L@y8*Vq2KvC zekM>U)f2C@u7i3}11Y;)J{%dI05y2ddN6!Jf+ajz?D_tcF~!qT6^Dt$HOV=Pm(_>c>PC(^a*jWdp*s2$hsoUr#1olO4S(gE@h8lU9^Y= zt8e$tAwtA0okrtBT9t6N;u|gd6#=6XoBs$O5;XG>PKY1K*U@$B0o&tf);~X*CI{4H z6))%_J6GI_=(T-i>)D4D9FHFDFJ*4g*WpLMr$_dUr`z!i<(&`RKF8%58I@AiZIpNK z{Wa0*(VOjg`|Ww8)T6nlZ_ltGg!)Rs&Jvh3fF!Q75h^_=VH(076p3Pn$?$i4MPysSPV@A%Y-87)>Ti>^_ji@pGTI*CdP`@FOt1wp`F#U3eJ$7aYO~i_d8UO1jHizcKEo4r6EWV-!0PENfOO-s{m@7H_wW=dhrNKqahd%cE*o9&>@p9 z#4$s;l8b0`2sPC5*aTWD)cti);N`5--L|KbAS)R|&xbYa6*%SBU%L$OQKk>qneJIM z0xQiAunK;Oz|(HhIaMV79g`cKr&m&`BoPin_2Z#B^LQ#gBJhd!EIK9OkmVBK_$>Rw zGkPJbw@4`L=hUo-P`t!Y|30OlgaMfe7_=_Zz|7t+{8#LDs@@QY&>^WMU8DmOgOlaG zMkLW!;VfLe+(Z|0Y|s&aWRty;;=jvLB8!I>l9CwvNnS#>TuT1TKGsj2cZZ( zn^>&g%&&qRUaoqt$fGMpfR6m;Kx$9|Pr1l7NBuBmP5`7oBc(Yh+Q0Cvw^NICiGCg} z4OKdq_G9`f_psEZM?04w1B1WvKoN#vJea0xFQgS+F(%qZb@r7eHvS`G!S-z}1EU)m zq~Wq#i!5G~5j0x=hR(~6LP^uz#6u8HO%5VkSok#@G+=wHnN4-bD9bkL-+~9dJOH8% zL>)HSmRuGRZbq>s*jh1Tz;b7L&UqAsF8w<|IgZfSpIyJ+ROWr11h0wffsc!5UKXQVGH5!a67W#a~6IW!)KYc(Nt;L`-`g;)b!^}jh#TR ze%K@K=CbfcT^?g1RYX)ex4yM1D-9(QoZD>5UA{aV$HZ|7XxG)c*DT22kGUJ*C)LgR z@2E?%a^CSj+hTe=5P90#;Vy18xR~f1Ko_K(zR z0GdElKSOvWbWFWxQ1cH8mM4;u-HL%8f#9Sz zK`oXa9yvya@MA;nE=Nz3@DK1XE9?~?^*h&7RKg2_u1zGICPq~FoLk%&ldErtyR{l| zeyGv0g#KKeXpT{lu8FQ&xItlK3E!hy7VT<(m<+1>jCV?MoZVVn@^yAp&R~Xm)^q+G zkC%3W(Rv|3G@KXhvr;{iuBoT+LK7W)b+4>3$rE9SQRJsasQNr4FV#b^&J~=8sG$Ml z`ScynYaO;2b`123r&?Y@(Asyy0O6EhH1Va;cejdCY%hm7P14dmNH>Sbbbj|yT+X4j zzkE#}wm-@8aL1m84BTf6OoYmpd&Nq3JCD`-MT~2F^USq0m-su$)pE$#Lqa<|*K+EK z7V^<6lF+2*rZ`t%W+;aH#Q`TLND7U2HzEI@`}LqO?f1Eg!nJbfrQj2TPAIl%c_I*d;49kJ)sB@Sx29|?QuUU{P%(?U$9q;-v^_B+yqO#Uh zv5;7VR=q*)@UbECBlG1%{)PEG;cfICdlq+Npl8{oTg=jtTPe>G3Zh{8IOsKJOIi$b zg9m%HQ_&eqw6pXUO0xV3$_yXSOCQLwuD?q&=H=`5Nh$#$?5NE2hWWZlz$AP@T zaVQ5yVH1#v04%x}`t0SL7zgK?A}Gu>JA0NfEcU5L>=J8EP>EW|aS+p?=OZ?d3m*)L zso+0OmGo0oT4ikjV$vP1HBxa5v0bN3xd-|x){w4KwE9k?*vrd-`e_CJ#XNh86=qYu z2(A2JR)NJOhC%WuI>;*s$0!&%5 z=+9os%H!I96z|r2g}G!IXK=$Y^kR7gA3G6HnJU;Z0&G!NN1GBJN@UeuzHbzs#a{*U zNY|+cFAIg$RN9xTP3VSDw`?t@*3UCOAlwu;04j4UAZywWHKDXQ$w!Zq&-4LSl!*P> z{ZBtL8-9uE!p}4Mc!phykyx3FUCs4#im5A@)SoD}S@X{2O@GmwkPLvNnlw=i*}wP=3h*y^GsEkI^pl!$8lBajboyTGMubkNi5B3Nys0$}bQ3;Sr9 z#s0o~mksM}>j37*Mhp)mNkvZi3M3F@M`;#Hsi&!v*x&HbZ?AT!oKK<2z!^_Mx^ z;#qk^bq9Exg&yL)kSMY(OpmmPG*LzG*A2g6xIh5$lb!H+C&t@Ju)PxFgZ82ff!Y!= z0i^ThEpaEYo416(*^tIfrHj_DO*q`)IXQ+CH3Mdb=BB^y>R;!iVAa;2(Iv?8s_QKm z%FBQDmp}TWlFWB;Pe_0hE9_!;^Tx-9VgkVDM^xq=z33b^&Bd)}t9j2CvE2=@*Rk8K z)xR>7Rl)bVyOpqEjYFw(WPevC9^WdycekRLk8hqbwxlPrLAfx38r_K5sUw&V-gox| z_l$T6Q&z-YC{8Y&WpHD9STVVo)fH-qRv7ll{K{H%0})^RD~jjrywy3OXQDQA*r`oy zVGuof|3~9}gP0!v9I$jFPb3Lk36$mfbKg}%fTFB12ytRC9Cve3Wu8cDVUE2nGYv>u z2zG!%r@BbVI65WJwVMgIJ6yqfn_&l{0K81XwEy4$5ILjo%LPt9bL2z>DA>GU33gZi zdFP&XAo@*-6s>BVdA<(acw7P9y=Mw<+MzT)G*^o|2jrYzxVKjD(r^$lXYi|0 zk`ra0I8O39skvM(9auZ+)?c|^y)3scZi&>qB878l34r$Yt-Y>?>UJ$mf*)dL+o6sh zjKC;bozFw~9L3{t7o$oB>$-f`zrPs-tXWV|nDk64Hi}6@_{ByxR0>OZ!Et*{l znhrV@X6M5$@m-;kL8~y@1DvFRTfc&{j@=%|a^+7xq5Tu5(mx7q9V+-d!etq+au|MH zT4wuJ4Ezup={!;B^16D8g-HQj!-mW z&HnbJN*td&7JR>AuR_J#e+aytt__$j($}RIEe3<1KyE(AK}fS~B8mTxsk4r1>VN$I zz1xV9qZ>x2NVhN=>FySg4rv4(JyN=3bfl>T^Qrs zTu$@k{chPXBx^(L0Ue#N+a!Vgj^U)!{RrUTeR^=C|7q)PMC!z~{Q%`4jg<4eht|!l z^tNgI09}x8ufnsjh5oiL%_s=LS4Ye0%>nN4{)jIHGD9_UYgqMFLQB>Nd8F%;a)R_6}*L#0x zH1Eq|#Nb-+5c!8sMhsbi%0t^LPQWzl@Uarz+~%0d+->E~*JUv}aT~0eqK=?&Ys%zi2xurcy!$_io6SDbs0Ytvr%I;87T9|8!;G{7|>Z%4P0m*|2;6 zHy993vSZ>tREEa}IDCJqmKD&Q|2H_}IT3bz!Zh8h|<(f5h5rHSxUQp62+`?l72 z$wZ+*3&9vzW&nF%1lKuMtP*+OH3d?g^|#&wh^^j#{kotl`Fu_9EA6f1V*kWL2`+p# zh>@1K=N@|efvWng{g;J~83}?Z7OH3KJl$y%0bj`#odNYYI6)_@d3!9r%*aGih;QW} zD(d(<=}NfaEP)Qxs>Xl_X(!j|sp-G-zVD@$;X(`%EJ>$!^Vf8X?;a8dP95>C0JBjF z!S6((h5t)39QY8N7F(DxX-TX3gced39RE^zLCxt!WYKM5W3BrVpmKTO>mOfOx>4eCXXf77#RaeXRZ#d46k9->p!i z4?8Ch9h=yRpXui}GzdyFrergN89;(23EWI{qbM*>H3TwHv5A_oS8%uUKlN#V>a%`3`F&3}@ZmziEt zF06@$6F+SX|Fc|SHOR0L1VXAj@QP5d)O;={nUvV_4!ER? zOK>eHD~2YEqOikZ3eWa#LX=X`YomW%NZTl^QdFXn+v0_56gj@uDCk<`=W5W` zX4!7547jg+>Xl!CZNB>$@`E6s$f%=g!*I+QS9lvD$G6t3w|HppD*I_I-a4I|r=ymK zjPVS%fzNL8ifskIvROapuu!OxSzUfsJJH!kOYS;(lgjev3cqf}dFE45w3djN-Lz;S zQW7X^>D%DdX{!O-!~7X8o^nvd^|>NL2NVMSJIzmW6qo*7xJY1CQ1)${gkI({Osg|i z;UYzf+(BTkMGzzr*MMcnDmuvM3al0fQyH94g*a;=jYmm@TUG*9AO4`FV~tfx63H7YtM!T z>#a&aF9OYXr>L%1)kWwZQGz#5#dMACvA|rT&x28gY)Vqh<{UuTzr@XN?5a}{_d@NU zDq#1PBzZ!sva229L)02T#IG>3MI>sDXjUE;z<-P6vJ0GLu3Z<^=-0Z}3Xu`p3!$N> zBR<)~np2;+tZFrX->RM-ykAN#B($gI#cwnf-)2~@I66-prA_DiT{n_{Bod-WS6Sof z{OLAy58K|-+h2FzCtR4uvMDPU)|&U4L6yH!zO#_JgF_nTSf zgjyqG*IN{29|$-J7ep2;L*{r6c&)9Jiz7k&YG|#ZqZlCUNVNBACDfJ0VB4>y(8W8o zI9e&SkBu`P+olod7a~@8f&zxmDAQre{S~Y2Q~I>@s^>sp-a(YBko*Lk%7DJ;-89+^H6U4=fv=-8{rZ(Qtt>v>^9 z?)YwL*&DTzO?&xD&EOL6cM;s zA8?e26|h(=p#~%-n^L`N&0m^xlk0{dLexuae=&cMOG4!YJfhhdS3}1R&1!>E*aK3F zxO!YwUC51M+Dp0a@u3(p96%C?h83XW2}Q6TLZ?LJzC@xmnD5#VFruONEA4kow0sj- zHOMec@kzwTnKE}N1(iAzjH~?au?d$c>0k`xD(YO1gFp&)!6EGVL0rpBaw8cQboR63SS0;f+@EDlkza-iLzqit$Lmp)u8x*i^kL21 zyTQq`yeYmhruH0aHdG!sS86d;gX;aMP92I8*T{QhZ#>zQZgd*J=-+%mj7JO zsh^CtS@V#83^3Hiyxp22uBNtt{Ttm;jljh%u%KaI8Q=lg2z%ew6d%Tc_Cb3r;YR{O zQ09=9gtHZp+Zff1_$cZB%|DJsjZW&{ATd?FVS2n+fRHV=8Wu7gmU#xgKUb|HrTU~a zW$N>|jcBvYcnr!M=pjt92aw7+gCt@&St=Bo2(?6X(lQTZguDEyC5sZgvs`-<$0LmJ zj3CgrPEr;UaM5VE6s!bpvtpK4I z{wT|@^**Zv!|BX0_YNcYrWWz5y~h2X^#n;t(NCS*H~up0DflJPx?_%wKItRP*c_KR zlaq?<(OANS4m#2kK*`Q-w&nC|mx?f@()P@_XMjd5^45PXDey|way?K#LyEY>riL(t z`&EndzF{`$=Wp$H28k|{1l(ucGM zsT)7JC%BR!5 z;GgCfs7tjZivVZo?tV4oHR_(Q;i^3iQnSj9RsBS^{1)&(-4{-}Z%h90KdJXwI~Sit z3Ld-;w{BSy(gNmb|SEw(J;KE1M#!9thDb-%i#;==o60p@{TsfD%AN6M++J_?be}1MdHp7Vc#uL1neqL zonLh;?w$$ynnn;f1I*Lbo$7bg#|82&C8ok3=f$fe#YgsZI%uk~gN-hlfx2K8An^h+cS9^+YJpeDluG^TZ4dxm^7ICAkMnEeQjR3~>KMx#)Z3;+ z^_SyBiD+LR+x0Jj@Ic`MNv4-Xclv3d6kIW4!A?l*4U8rb=+Us*5*J|jF3=HryNiIz zsUS`@$@Fxbk*&vhu9nW$Gp0rwn4*LC#tFWE12ntyMG=c)a8M~{kS-8Z4%C)A3K|`Q zl6GqRS~B=!2Hsh9(0gyP=lBwjh{)8K{_$e{}Ke>NK*5gl@o+IYVq?-3ceTj zFsailP0YLNl}5iwiuW~Bp%HYGKy$v6fElq8+DEhwF-;HPe@{w&hO|{tup^+H2;_^N z+&eT1EA?4Taehx^!fQ;z=Nclyit|t=CSV{Shp^o}2mH0ggAYPsSaC*kNvb8b@r`7? z^3tgE}83;0lAY{H4cx%x(;H}<-{j4vi zllbb4g=a&4$qVmy@(~~KkuDj363u<>hj)IMmmOn`)+{0ttsq!{BPlnCJ92F^hAI^ZjZj2E zv-j^m>bbaU$nQqS7xf}Z@l=K)=D2baStH61BkI+zY6SMy3#?TwNnRs(-Ww5FfO>}o zYz(n8$u>XFZ&E+GgzQHO915~!?N=J>SaejwBy7`Uk@Zw0bbB8{NDe{~spj;(+1EIh ze;&%FA8oD}gel&mG1Z5JPKH8{EyE{~wVKVW>a%n|c<>Y;gck+j3xwboML!L;pGN(! zZ@?=C;YLDkiK~q%w02J2uC8NC>5BH?(uPC|b{BZjP)EGvOUFee79OW>7v)N>OU1+q z;JF|OZy(er&UQZIj>~2P+ukO~4CL>TN{YO|xF&K-7dA7rj{=Rlk6MU$^7voN{rBf9YmK`A4D0 zNAT&l&%Qjznf)Gl=>t8pjxe`OM7ewPBvff8=2Hgx<0Ig1-Z(yfYZpFBV>bqTi$nm2 z6WYd6*oQWw8mD0fPMrSM7p)#{t-{^e<8=52ihOmC@Tz zDs$NcpY+O1D}B-=>6Z`Vep>3!JeIcZ!vPTJmd)rdK+?9SZi^&|OgNefD5RsB$&x46 zy!1N)RrsIURHpafAXp!rrgAZer|+Cs*;F)PAX#@9DWuht_}9erh1 z`e9*LpO{Z<;h=TqNI$gBrjs>TaifHk1ub9ioxQ~wX66}Cx^Q#nbRS=lq~gIn18*%s z4Fa`+QPF%#2mn5rX*Sh{W{^aJY&;hrVQ^tOpt#vLZ~(oi(O3Jf_Tsrb`qqOtE2% zT|o%FfGw#7M`aE0_&R>S-}7Uxqk7eD5$CWIC;ygI5A{l`p8X|Wv);+{x=iMLDyw(- zZiQa$@9jlyI*0&zCU|iqbSI8=%1#$5C{E6z>Ty7NidZ83S)X6|CyPZyz0)%a&X|Z=SudAVl%+ z)&k4huwgsLeyzu4NOYBOgR1NcFQDJ zjE1b+3CU{DcT4uR4tBPWZf)*{7rb8{mA4pvXJ6rEGooq}mzcN_huHm@@$Q-p{SJz9 z9D12@$Bu%)uW_fq^oIubLPYwP4bp$l$o&f|LF1pkdo+CQI;r(Ux--Fg55?xnm$Azn zUq?9o3uO=5^ylI~AH;v$X^x+@!siLeyerk`#Cd<<{Pgp8zt+8ZwhJxA=ds!b}uVBrQa2vuF>qIV|p@3 zNfow8AQB_*P2Rqj5Sk4Z74dOQhdd{5>meFTy@(zN&onM)YQ{Zq<5Mb5FwDR=PJm?AOv-hMRuspx#;zS?;09YvqH z>4RtCqh6_ss*vu?wn+}}3;Qh#b_P*b3piTqsY_;vB^;oDmbI|j=gy9@e!J2#82 z-iBY#cZXUn4t|_`jy!RAb~i86>wSsX7Y^l{GYb3rutx%6pGtzpv7U3O6r@y#jz`r0 zO&HSpkwjIbl?0ek9Ga$Tlp`Sk+c(ZvQ#2b-ZtXH+3U9q-{3z_TIvR8=$^N6M6;|~} zAi{F&V!k+5dXJa_!6)|l3HkXES!aOkkLj1MDrMhg$=I>3oRd;qu#r!Zycm!-{EjDq ziI^bZ?On(JmNme4e!&OykH1iq{&0EkgIwD1esSqQ{+0gKe@u=uO?(fverIzGZnLx< zM>(yV0TZS-J6yza;TzL%jjQy(TPa4n8Ni;s>)E}L>cp1??(cGw0_HG}uZt=x_{eA6 zRCbcjwN7LF%3m(mKR)8#OXl`{?Ot>uLiuOx#PS-v^V=`e!r@;dr?tW3%8PZ$2|Dnb zu>CLGi(^KPl=N3Wlk+pS5BoB*E+_x|nWSjg)K%X9K=r8gm6Q`%#EXfSum1K>5X_DI zl5_l*$nz)7_1&Gef8tKBkVOCa&P6;|S_P9c!FB7YM?L|+VD2HY^+*5dp1&!U5!L#6j)z|E!8_tals1S-$XhmZ^JQ+S43F|6t)huZ~ujt7w|4k;IG_DKTm2?(0jqi?R<0jZnf_3 zPl-il!1Lzv#WB;h%!%Xa<*TV!0N}ia5s&}|fCvNtfCJzN0ElkT2LC@0oGhG`os*lF zttJhDW|o$fS5#uFs%w(+>l<=KWT7DBf5wY$Bcs~BXZ-_%RgJ?Vnljx_JH}uHM8qV| z{|5x8jl3QfQ7`Ts!=F%KcKS&*ZE9Hv&y2{!ZW6hEoO+F3 z#$VB2zt1|jW=iEaGPdD&XQW-W2$4moaaUA2gZc_>#EKIcqkIkf(Oo)Igzd!QlqR^g34RquvHEThfYz;z`7Dm((o@=bHoBs!mX+lsTOXhlUy!~`wOee!Uuq6@$v* z#@)8}f98bqOXw_{G9J@GZYYTRsna}UxDvRHG(LNh$1%=KGvuHKS6;=_#)X=MD|;HF zEPFL(7xF6az(^r16M-BkXDvC)92c1xE`2&Nv-AQ=N=zfQ3n7<2yR>hXX0Eg zxuIq99tC3UzMHqxds+IHdus2GO&FBUc4>O{w~E^p;hfNb3*;F~`P6$smx|nO-QDaE z$S4TGKzQ4@S5kj1i&2SKFF(t>%s+CF^kb-SyRZ%E$U@p zTAW8pL|U6o$OLav)f{mEhJ2FxWHf2Z8w!7nl<^l8uIY(tAztNC5k4Xb-kbjPU5T1{nP4dhfUnf8ciMC5 ziAT~*uQ&wJm!9Mkl667^#F2I}p-L*+xY&ZGI^Wue?YR$aubZY=<4C0h0^j&s%(rDx zt$$?%AZ%h^!r$GS_YEo18HXJe*~#c}kDI@3?AOt7)=9@?BtAc1+NXYgz22@c+}gr^ zwd7>qOQJBSlcb!0BXD>V>7;)*H+g;6nT~Y(-B!l)*A!H>X&EQag{3Ace<)FnejjT} z=b5La-%+}GKlSLwm57QKNr`<6vmRCp1TQo|hFZhOJ#|8+vaNH?K`ArwU^t>63uyAX z1$>NjQcDlSLCFC~x+(K;`cG-PW4*XP4;T#2iA z;+#1Yv8n_DNRUtp36@Hr0SYm+Ju?z`stSOJEHt4Q5<-VVNj$lZWt^$?%6+OshSh3` z!mqf0CJh16Jb)LNQ^u(1XtrP4-kjv`EBoHpXZ5*O!L4!7 zKy)lcAXdC*Xr5B)?9IoR+M3tMu~!Ka`o&D*gi3(EUWW#oZ2o7Xp_|Cb4?4Ve@@N5& z+~8ULcB&1}ab{Z%SY7^673w#A+M$ zVGB71^*1{3u4_phuo(2we#3bmXt9^zPH zHR3pgKN7}*k(~9Dma@r955nnu%#n=LS9e+}R@>^nXI` zW1a^7;~q-n6{@bL2S?3?wHGQ8&Fl|uV8v5!%y}WwQW&(7tEx?3*}*Mt3N#HNaIYmy zoKYfh41Ws`j3@II_{>m|Odh!LP;a2t1q~I!#>;QfPq$0Ge>uFq18-o- ziYE^NV1;EaKmR>@@n0aCh`AF5BfQZC$f)R9(4qiTL|&4dcBye*j=-}U+_%*Kf^Kqf zx-3J+bJB9cmrT4XyS5BZwtgB=Z32w>5ib>)e2g+f)3bAjeZBlw4ZbL$U}%C|I1;%G zAoTkLRTHAd%v&VdC<8;!L&uqnO)h&)jQqNr*OZ6WtZ=h)%<*X9rG zu@K54@*WEZVFG6?@1HAG0ut=UM7=R$1x7*xvrqO;?##<X z23U=;0-MG5gtzkTxc#+l9?fG&)!;uoI9?jSF=)~SIOIHIpe;TXMs2w0*rrRl^rp_u z^@??0pN#X6YxBx9U~%;ZrU8RqJbgDeA?N$IO$6<^{q`pcfRect#TdUMgpI{!Q?Rlc z4;CeuLeo~K>98QB^G9mp^mtw!B!nD~&eIwLUL~2m--S`BbX+j@%T-Gv<~FDR8bn5z zdOTEJJ+zzVJ;Txl?Eg;Y58nfRecfR`KjbE3-TPuWafcf37G5J;0!TX(pcS`T_@6>y z$Un}Xrwc-0GKt4kL^who{~*)DXQwLSc;C0Q$>wXNf-x=n0fgmdaiV*WAAri_8gsFyyJbnPAxzMxJvU&etV?%-Sec^ja;i;Gxtq@#x<9Gx2IO#D1js5P>8J) zw!Y#opvtU;&>*iOXKi%-=FHo*$8DdSOi#miFC0V!2L2=RyJhVEe4S>!o8<++4PO7C zfH6A0mmFoP6}fTeI?PhqO`iCQ&8t^E`B0eW^5L@_VPO=kRPGTq4mw)EKwl-&@LEAV zG(>ZqMCOcM9rqXu^&>h1YBj9lHJDmJonQ&|S~;2X{j|tsji~P$jH+^!DC={yyOHsY zN5xXC>N$cC0lx6i6G%?9<6_$Df>8!ZhRQMn;V9Ud0R!Nh9KvzyP+&DespUXmLOhxE zh-h0c7Mlvafb=#3JAyuH+$N;1WY*8YcA-4YV|l{E<$4d}30nIDV^-E}%bx z{7v*{jNw8uSMFiX!2^D6bE@~MK#E$9iLCaqCr0H5jK~;tO48V&<~xs*0jk75P2STY zGP}%*|Fx$w!>{v!R&nD*NZRYR=Czu(py(EcAwFJNF3d;sCp;UWVzo!ET3E;}ZR8;M3|Yqf?hkV1_6QZA=9 zj3o;tJ0byy^pxa$Kx%GEP*X!(`EuSSIzjOtp=X)fGa9C|Lc_%+V;;1{OyyJ%xdlNE z%0|nJRjZ*M_?>U|#IB(CdFfx%63LHf^F6=vyOab-f?Fm!w{qmKEi*hMm9%KX+L~^^ zI5FP~F6x^oeA58F&P~7fzFZi|R@)6^$7^kYF>y8t)mI?rgvDl!^c$@}DO&Z!O#vp| z+(%3aR8UC@?*wtd1nCI|R)jHJGye4$v1Qji0%K68FFLd_F*p1s0J(=B5-f|5Bn||LE(oU@zeNz`aR=eDos?wPAuv&Ken+@fj^F}>!778XI<_)4u zAA1#XrPk(Wv$oH~&A$dFFR+eHw`FKWYc{Kl^X?|u&@(J6V0f7LbEG1wIZnpy2@b2t zU~v!}pp47$8 zC!AJZ0LgiN&_L1ID|f3M=c@i0^SvDNht)_^;23pmZ#dE|o19VuykO;b-P(eMd>JIg zk7$zdy#t1`$aR2RI52Yz3rGPnBTTg=J@w40;AyTvYkoWnuI?sR=qo0=V;nQZ(;$3L zKQS*WoVit`xHEzTvhs{YsfngoKpTpNq5`vinP}xvX$j9Vh*R4r^?4z%U^;areQi6s zNs3`Y^}WqgR^1{R4H}Jl5cS&(cPT*J^njM<>6O~kn=|w(Q8BSun*Rgfd5VxAb+y}J zJrZD%3p5yxqb3AE7H9tGNc9H6gv_7qHke-TT3(Jb=-iqN^upLG+3r&+eoL#d`qXC zPsw%KT@UqYcFb6JE75ds2!=x=55%T3T;)bC!0mX*Gqv_-R#X!`rL+ zMtS<>>+$_@Fsa6UKn8OX5!+sDQWRtlCl#?1F1Fm75WGFEP$Vkn`_{y z{@~sZpI5&s{+Z1MRnkxVO zuu*g~?tPOYh47uXtxQRuOS5kPRtgfC!hUrd(VzLkbYEI?0!qkfpOx8$*veUjxp%W& zddAiL`c14LlpK|a*q2^z9EteUf44=!^|{c``I4jGAOamOUSK@bnnHyg=Jmmi4-NlC z&fVYag*tPqcfjaAd8>@G^MyPkuKBI`nHA z241pmBBxn#W1+?bIJIrxrGXYIdX(+D*ggB^cEvxh`#z5!MfMy9RowdmJen()U7dn) z6ELT|jxe}c6&EDF&%^*d^RZf>Vu@_f{RT=Zl?tkY>P%WSsXA;Vt&2>f<;@uyrh?!1 zA@s(D9sL#3Kj%CSXG;c00yZ_$GlE*s-q(i2OVDGdK0C{iu|4{r*~B>520<$m)Y%yAAd z)%@nQWO_TgwH8SuVr8>m$pRS^2^!xB+DQh~H@AsI*Y-YBff`VN)afe`EZ?ojOvHCE$F;c`giuV=WAFwI^Dj4_|8JjNGRtX_}$tT+wt>J zJMwZDJoJ6J=#H}cp(#wBxdby?e3Zy}7H%fbpCjrkl1U|NN)qZ*Nka?w_O*Mleixq2iYzWAXi;+#Mft=;Hnc_&6kIaqPM6LvAn8cya-Zx90^S4aJS0Q-Z)R zp+SpVKgJ94f3zL9Kt%;Q>YF}7!0zh)oT z6>o^+t5%Xs_4ub#@f5@$K7)lJSdpA5$n^A74$dcd+a*U@L27C`M;5Xuqad@QFfF&Z zqP()SCZ{B?{Yh0`h7vt7G$C#<9)v;(>2sb|PGmHcwPB}PYmhfeOt*#c4hRSc7(vKI zpDr|~GZ3u~tr0MEx3rAaH9pC%>7IQz)%B@mvVHu&vX6_q^QTIh52{@5;sptW#B+S8 z*f_ZOA2z*s>FPuQ}BTy@Y*_nhStzRBYElY#@~?Cubp%SV;3U*=lzri!>x5 z+=N57bO%DcJvvU;U5UE=eg3D*cmgpwLcn=%FD{9r)coK)9KO?8p&vVh=F6DTQ-v^w z%m|&@VJO8#X*Z-#QlRW}j^fL-Bn1XGC#mHc`KfF#Dl&n}(>)XzM@Vm<@Mi9%)4SSq z`+oFjEYY@G^xK?nd$03_FzGwjXICa$3?A?^`7T^ z2kDK&wp>%HabORj6i}6XE$r$3l}GTurkwZx4Nd=W|GF`#L+&#`AA*xrN+4y0wT{wv z@^JnBI!n&-Q*r+Jqsza4C!P=zV%JGwIkBr2VM-|l>4K#7T1<~WU-9qqv-<&W$RQ^l zRrb&Pc$m|d9CKSNg-RFilaAPL(yM;QMkX?Vv>tSh9$-RVk34@J}B7>c(KEkk|H5y_!8`gL! z5#tQt`<*I)%aL5&#H&8+2Y6}0E4IYY|MOw6_t^uzxrn`1_eJN-S4QVH8)M$LN&DnNg{Mo$0=JnrCNEA1F zj1RV0U8dfFiICoJ0UmVe0CLYPnqKl zSl7R_$Yd5TI{(JSuK-u2MrPq4di~hOZ}uNjcJV&S&kb5q)B(BQV!52MzvmJV#_f^9 zC2-UQ$pDO^U}WOIkb^0O%Wo+djA(EE@NYD7M+lFCH;}nTJBK(*67^}&jr_SzGX8n5 zuq4k4$IwP9fTU7u9@LD5mEWjQ;hh?KVO`{?{e;jul2?ZRWXKro(ZJ3dO^|E3K;_Gx zMrRXYR(r7cgP?}T;t-47b82pUa7z{U)Lfb!$yDEug7nL+>4~6J-kAGhbW?YZJ@blY z$#@{1ss%_|W6+RTi%RvANd?+vib|eboO+0hq0&;xWbxar2~IK*)B_m5xw+Yf zO^Yovv~ddMuzW1#MY+PnqdaY%27(09u@b77Sp$7Zmm6c^ik>zEo%j_;l<7r+lNcJp zfQ==T!LKW7h+Eu1fb~QFdhGCio8QDysa@vBY8!N|756AlrM1S)d5jLE@~Ja|H(`== z3m!PT2SABsDSFPh^kMyz{|z4J5MQNP-p{2&c!j>`TQyEw+nmpOSvdNLVh^A%D&c;B zLT3|0KR0|kYwVbALC09KK4w60UJ8(S zE_8RADDGoFlJN3l6ZbU>fAgWT((x!|8s4o0No>gQb=TE1IQ`pf z>YSzgfrRj<_J&R(_NEnW;(Ox&i5`rCWXhFuKyrBM;Xi@Q$-7`T(fOVEcma1wn2JrY8Y zaAMTRNesv)*R|a#c>Z-^YGdglx^aMh*x3~KyNv&bz(*|!Aim&7ZQCA-fEJCo_@@Si zAKWe{KZKCcHZl`ik43rSphWgpE)VDK9yzjo;ItDN(EZ)SWKMM~H z{&)hLX`Hz4I;D6I=bofNd^YBhex@Z#D;fxNC)AUZoRzi=Vwi|9zRK5O&zRby4{cL~ zEuIyXn=k6-JepJrbul|+zOC3T8rSPe#1kR?LI zoJHi@OyOgB1*?aNM3JOqOyPN>Kid2YG{}a|R~>Ii;sC0Xqkf^5OkTP4 z5cdMX%f3kWVe*~n!-?VQ`HY(VC#T6A(Ifn>Vi$nf;oDzxQ)Ju{!~3yF!qj+C`LHf@ z=*#BU=_kNE!zXFCJEK9>CPY6S^X5+T-bL5;@g&BE|2TV`#Us7P8M?#oE1P8)OyJLg z3>K1MRO&Q3jkoodA>NRb%%M?GrX^v(dKdOsBrE}AYVxU40`#$Fy&g)m=MKfZruwq{ zTkf~or-^rd2E8#hXIatr+z0ro+}n{1&&49s@`bF&{AJz{i=!M0;(VQ`!5>mK8|#u= z;hsv|F;GlMgP2g4w1w_dVtGdAj%);`P&si)btT9s4|M|-twCTWEmC=j2gg+e*NE9s zP-C}H{Jag_o;4_G&lsC%Cn0u`sFJ4{HCn}UpI0JYCMn6vV}MtE|IHo2V~}2q;RyTa zhKHDJ50$g3Fnmcbw9behlp{PtSd9winhEezsYpxYW5sUxQ%@|N#>A2oHqhs? zYKm@tA8}Cf&PVCox|Ba)uc@Rxq@9$PKua*#P%~zpP$;~?62+JB=7HIJekVSSXe2Ie z(H-Vg^N1WP__~ma0b%>E$1(8?hOq#&k7Z!mvi0}xQ>{nG=@?NE*ojOeUZ^J)#k*f~ zW@;Q8vM1irn?{B9CLduPlghwsjy;-q=kj@KvB5DUHmitB>rMm z(W*y;ogjKuP~<}FR6C$RLzjNS`2wR-qwQaJUtBaSGO<6Y#VRUgCO=I8&JPdhJwl%` z0+i0w-eclQfzgi3CP7!c>Gyy)G(pf5jw|9Au_^bz8~&?c)~ct9*CfWKpuk(+Yu}2P zdP(S6Bbijz{V)9~vj@`FuG-8$++*&AN2)sEILSygIKOs_r)E>{@>Jhj@x9W|B3f!*MlW#|W%AML}V2VwYSP#h^(GjRSU7X!C zE7&b>E`kgYPo!66a8n$GI^QSP!YD4BXU;u{b1cfYD##e)VgKwUq-I&9b&ax*bl(Xo zS9gc`-DQ9xbX-3Qu{i@OR*!>Eq=^xpwwo9@ufFQHC#?(xdMDXGi#-3-h<@Irzxv1= zEdcN(n}Upxst}RrD`DYRoWc?Zk?WSlHDj z?3H^u+yp!dPn`o%il`2R}$r~J;vo39g;0=1Zo}v#`=?+S(W$! zLBU^-inn@0A98;p>{EZPOb2gBrivTn)wJqnXHG$P2vpj_bLyw)ziwjWekrUlA#l0_ zEBnu~WFA7CLAM8CL0iQ5w4R`|QCR~2c+1bAr0AQw(`H0?Lm0JG5JpO}h2gDxR6@(>&kO8qMR8CDG)N<65VyjWS5+5UYpEM2`3vfJb8I<=)x1=MaQ~l59t{yh zjR_i$ahE~(10kID5N_uevoaGA1TsOxWSfboV-t=G;Fkg%__HBMxKnG z3;BPPI7A2s5kdNzvQ8SaPVz2{@tuwRDIGd8G! z-#GaEfOt7IsctkRv~_l9dtMj^sURD_bHP@#9i!fCe|_4vsoiUF61^Z|uN7W*gM$S&Uw3K~931uaqs~ zD3dtLZX*h_Eb-?5G4!`c;4Nke`4GD zIo`+N6}=piv9ujV#pRHw^Mvy5B|(DwNhyI`oUxqp1QH>grIl&f=pAUE_R=_I!O`U9 z5)VWq2a;T|68dE2BEtXg#uKT5=?lLfE2>@FxZ7D{FUCP}1yrn5Rup*z^`;rszKwi2 zTk_I{0|NhhzLvtbo`HbmIXsyb?`D6|i<@c+a2`*;^Gx{Dy5|cBNxD3*Aib(h)C2LX zz}YxMtj|#nV#e^sOXJP**~4#%lk!r6Q8a@CWeN=(k4msh+kY3{XFdQ9i(d>jO+-6n zv!@sD%`|kYi7grN`_K`~L!+$T{eBcrgM81VQoris{!?H24rZ38rv0%!HZ*OV~ z9&a$;c+L8+AtZ9~ll07F#G-diO>fBPxVVri-?pg6_UMs2btU&o`iB0W@qjnNLbw<5 zGOrY6+P7xgf(BnM#YyJQZWuc=gZ%GLq~7Srw6{g6!Ya1PF4t6ta0xeMRvzzI%DlJX z?{G9LdwBi4yW{YceA-|S59A_pZ$)a?oxdZqV%@#@WrA6qvQN*4<4yd%7eS0Y#=x`q zn;p*fYjj2nzv-RKf*|F8_r3WJ?){l=WRvelbgGF5zIGrqZSCh&PUW>fxv8C=?Bir` zP5 z`C(-5L(N8C`H-5Ac|-y!&H zMeie#w|&1s?#0H=XNqcgT?q3aJpDtC-@4%O7p;3I^U{OLdUDadi-?%P{2KU$^L;^! zO`89Pf|Y}=bB8@)*p;=|$u8Xgk~Q9`(T(mnX0H4e^z>w1ZuR;v;;pPtPtCsPWl^<8 zN6W7~R!9+kuldgW)koCxZ{wf8)gEuzKlrhKj|%L6Kckjd*72c3`c&|N4gUHx*H6&z z!kYluQ>4^X0Kc^KmA7}_{WK#*IX@iI*7zy-`DfC*XhPd~D;i>&{UZ7N*S6TjVjgdQ z!(T)6XC*NeUp9TPgZCq2&Pp%*-sUzq(_t-oxKb@!{(sn46F>?I0KnG&$G)2U-|TDB z|I5A>W)+u|mi;gLnpjv}Q(H}JXl!b3xnI}*u%q>HXIFPxM_+$m&(M>n#RJ15)%uqy zP^{Lonc1G_ugH=*|5JnmLFpIk8x?c!2K00;t?XJX?!GztkiGf2LwRy(VfP0(vG(!z z%$L9IQrZD)w(ln(){-cPR7ywXRQdn_heVknR)Il;URzy!h*ej(TnXqq)N z2$*ShtJk##+e+ObSs*p1X3MpTG^Lx%y)NhZ+;RpS>t=L5i*dwhyPNAwx37;E@^}Pv zXQS?Qy&3HDd-nwE4tuMNI%KH-jx;CmLcY2@%WR7S#3Iz^(>|}B z?R!t$OfA|A{q4yd&duQHkJUNdS&i_#NHZKi{rScd7Z%sJ_C0`_+sWzfEZ^hM_tQ@X zQ;zRn3oa@CAi#=8Yroyi7?gF{_z7h~Af_K)c9~1TMlP!}gA5bVcI7v|pLK6AvBHQK zB>uB1a5N|tAS{QDCl;e`(O$l$2cuFyFiK$mYfubOUnQb^jx~B*!%jdw9T)5 zTkM=^2o;V*_2uS87fWd`6_4xm^v4P3nOU2LbBeI38i0E93H(OJRR6&;BNO`hdqH#S z+FJY~icnl+5CXs8Ug3GjYD``G%~Q>FKu0%X0gh*YtR{NZ7G85hEyQX#6AAZ&Xsx}k zsNMNK>QDI^Y+DZJcBm`E{I&!^YLS7_>My**3#@>>5XGkWdur>3jRU(+bjjXy>{pQRP3d65G0u@s(6@wF=9IaHk|KCQ;EMYPx-y9dY!EXnamQ zlMEdrv&QT1H6bhibeo88Y$MBC^gbuX_NIIm{j7}2v?aj4AdVV(P6pJ3i_jzt*bu%J zd0SC0N8yN-;TYXf+g!c+`MmopIESrVv6ovNnKPy6Gc_R&O`$PQ=-iVpAl0tNMt&jz zm#CjbRmXn;iPoxx zNvbqGyK;URAD7*~Nyz(w(lhou*}!)*T$;pWF>49C>Mrzr_Q{6ur7(Oc)Ogr(RM+B{ zGCXUBxQ4)n@h8lx{+K*YV9-jjX=wb(#)gG(Hhxr|Tc%z8x>DFPAb{kixAc3-Vymr- zlve-Oq4DmeFo8jvUTbt=-#Nro)$xz;uQEwa#-3UoZ<9hgGdAoujk6A&DeG7J84muf zbL|&DTm1A&pkMJxm_3KUBHB1f+BE^{(d+(a9)v%C`SUxfl%1Opj;n83+ z8v)>Ts8ID`0eCROa9LGtx+84{>SJ^?hSj+T8>+7R*ix0IdKi+RknLqCs1X%)1LQ^P z>FJN3Q^_0v3{uEgDijegdcLOLE=Lf3s>4eidmj)4V5i+3xzStOD{BUN@1t-xvLdvp zs=jscTus)dCXlFq|KMByP6by#AW#Vt2r6?~UKV}B$S@kl4BQKDB&k5!or0tFZ3<&> zLcB^?D188dnj0y?&`e<^OM;|7KK3jO$mc*?5`kJb+S~TWqmQBzAbeupLT`lGkT^61 zj^)mVqX;+SYTz&PCZN;BRY(F0j2At{h{4Cw>H-iXW|tB@BluMx6f7!|AV@MmqfUab zuV9&?j;%)6O*}7*xNoQQ$Bn<(K|oQKf}u^t7d`^IzrSs&CtyZ=4nAcpo{M2&nv^%_ zeFPeAvM&|olm%BO3Q!wjb(y}tpcgEZfl&%xv{)OsJpffF40k1oQdB+(G)SVQQW%(; zj=mWKVo45BMe35=nRVZPIV5K!gB}gNIHfec9>Ma5szyWwpoZU(!a3YVM@2wDK`4 zuw2nF?=kpc$-?B{J8>s4$BQx*1i8_%bi7}0Gf9z$rm5Ofv2MU>&@@C5yKa|yD{Llk zn3|Vh5IOmrS{XjB(v{A&R#h}u%GUa6TpRcCWma2_G;kgsihoOHN5DCV?=?33VKr~# z!LccF%j{2*#8qtnX-*xo&mrx%GzwdrH(_6S@lAxVebDkJmnel6{>j81kof?3MNn!J zMbqDr&!G~=P zN1{=uly{l}|aY!Wwkmh}D?MW?WAe#8KMQn_E?%h zR83^00{-Ye4fHa8EPd5MdZ5;xKB;k2POa|n-;dS>+2fa&g(icnIeMbkS*96P(AAS< z{9f=Wfo?(7`GO@@Vtt*K zwF&zjZT&gqAAgwU?H{`e4~loL0-!xl?t=YlE*$>*GhHHfX@ZkN!&FUN``M{Q`UbG! zL2WO+C{I0vws>7b7~D>A!y2RqEE)IMG=FlRC82rA=$2gyzGk~b*#PH6`u+4Dvt>si zZ?|(ge-m}xQnp~wJ&zsoh?Z&OefeH{IlEYyx)) z(D`1w`U(3{JU$h+tnK#8^58QrWDZMI=)Pp2lyX(1+ZXtiDyepLCuL9VR zJkHOPuG^^-AIXpoY-Ia5DYgK09GH`6-%}06Jpm?-P5o@1E9NDi9X2pv=u{2{Kp)nC)@1S-M`p#8ri|K|%v20Px%{ zbv)%Bb_=3Nfco1aIe)6qVZk30StW)UN2rWq`;;1}ie7_&i>DZbXt0tX$c&5R#R2ly zGR+`}%K+sR=u!&L=G%sFlUyDqn~lVVQ`%*=$V-Gg>`%|c!wCx(@q%9zaWyN{!ZQ!Y zp$TI0c7xd|x(eTUc&;VvES{bQ8}Y?H7ADRkhgZ4f>2ARcqK*j?3T_-znpqPvJib1i z_8I8z8}dtONTl1WoPv)IaJAoK2L&K=lJ+?RitMBJJiz>ftD!!e7py>bj`Pd@Q<+j- z+J`Bc!=k0JEcrahG>>`*Mgqr`KoEgbi*&fMqyw-W$MuCqVwoX4NH8!?!`&*%s>j6N zw}5@h@OF6l0GCb?96}j^JTy|EmIGLGv?t^Xd&$?czg?q7%jrzn-T0;%SZMTHD3t^4 zag-d&-LLnDx_Brx3%{z6UYlsU1z`sqIhOf-1oBS-(ZsPEO!z2dN@#Yh>#vC$J_!^w z3HoEKVza;eEj-}nYW}!RI`lbLr)!B4BC$72!jqUkRtBft@xIj_A)-R^^t5y zQ@LS8^yfZ_{?S_N@p$^WyMH{)Kj>N2SpyH}g}Uy*^MHtzZvgZx-NTrDV;k>2Q97fT zaWGMTf>PuX&+tXWLg9)gWgDCJ<$*!vJ`s&5JI+uh#ttZL zcceo~kw#b*r^994)Uq*11-7ZGs>x9)$M`t0AyF^uP9pg2%*H9f+r^8CgC%(QsAMFF z_(d$8QCC{VBj^Kbb4=PTPQbE1%>DiV@qOG-z;~vYU ztHH5{VYMv|5vO-eWbnbyz1?{gP4m#Ki}Aqh_hzmd&?wJ=UKRM3csE^9#ks#7`nx0E zsLgN6Ab|aJ8#b!OFmM)7waWWW? zmK4pe3(wzt7-EGrlx+W6CC=NZJNp9$Bk&>9%UNc+d@fhMJ8WQ86PC%z(As~z)h}>` z02(Jem;``$G~%T}57Y`!!*uqAgJR=C!^!85CD-juJ^Myb-R9R*FQCmR4rNyKJ>iMg zm(3Nvu3+o_wb0+iq+oh@KLOk9c4k=6)%frC31Od97W+Pg*f5P!pmjH$ikRSWVm#05xwK;S!%YOv? zC16WkW&54I6l*h7%?#ln7?>{K$Rk*pZN;p$aOm$y|18mOcx~lpe0j^*t)!$#c2J#W zK2}iQAM zefkQew(t5C4!jQ4lZYH#5`0>~d7j4{m05NbjGNL9Oml!C!6)0zjOj$kUye_=ns$w0Nn$h>(%i`eQl0nhT^2W7EoX&SCehQ==!>;8t=n^ zkE)WhxDx}TyIj5OGlINGtFoZy3^n}JIod_5tZKxl$5$C?j+;JDKfX9SDZ4%%@~1)3 z^0AAGRZ+bIlE}xFI`udLJbpfGFD3Ek8;ps>YX1u*M;HqCVBi}XZ&4q~h#j%Sye zBkwmN029fgp#O;W%;wI`rBeW?TBIqsg47$F9YA74&S`#8(2BFuva5Y+Xx&R$0u zjs7$FKQHTliDGp;3A?vNQJ;%l2)|k$B#>OPo~Tm!^ZufYJ3-==&fk5$Wt84r}<^_N9%^nw`@mAuI>ophPLMKyZ<2#Pp7QGpSs{RFzI)|sKl#eW&z z>t{^tL=T^3k{vJkY!~*IjNA zUt^3dqg3v?9K(Qj@AQb-}=4E+J<&z!fd%3DB z6}r(Gxq+biCzrJKScl8?K;>?2&E9|cf-oD9iu{TLBDV45!<(6PmA`M^Okt5Fr5OEl zq#LIL9r3mx_x2F|&MTWfzeiB%wSdlr2CdSa>4B$1FSp*`xP{GmVq^Li%Y5Xr@N{);RuK#mUOMvhDtOTi}s%zj+FmmB(-~<8#5vFX>UcCOln7jIY-CW*+?mTBssNDiymD zs(XGk-s_|semM59fN|r}xCY?zU=H_%t9fRp?=7ba-eYN#Uk@=8;go$5g7&z54ir}` zFKa%yI^21p1TY?hQvv=o8>PKJx5Q*O_5Bi`MOW|SIx7c$_&C68IOSp=`Q8Hjko z_-{I8$YM7RU@WP&8jaKL?#Jit+de2Oy)}Q#Xw7KA$%vjddKGrnD*4#<*HR8Zt=P|H z@y+&;$Jrnt@}tgAKan$2>oXMr#py0aU-c+oL5*_Bs=ZNR;V-QnqC*2?iFiH_Zs2 z-(>EFmcch zSt%JD)L;{60c8=W&93dJE|ImlcS z6-VO3sqT!N(anO6sfo??9#&|R1r@W*WMYRV3)BKwf}!}gN(-NlbWi_{4;9~3xsy_a z@IBEjl(_qWNaaIvy(VXn&zL01DT`7zfiT^)JeC5w>AtvyZ^Ukvb^~xlw3Izr@LATl zF+**W)k>}LOk7FuL2Fer1m)KF-->L5at!+ARNmcAie?vLuNr*(;dQUJj35%vK_JD2 zj$x06QgcOLRSIZ)ZT&qw_E_MQz8!`V1&ny0s7EUYE?Ke+iFO3kc7CP0|& zNzXM4{<~@uv8@V8fXQ+xUj?AL1dx6>&@%Q`_(_pdY{&4oQZcxowsTf2*Dt1chW1UE zi{Tx+CD=K`3LBDJg@6U4-`H275tqfU3-#OTT-5+j-dG5elqKP^zTSKeK>LwYlONpH zyMsYM;47}CfjL^#JU;u*It;4^YhhNINyCulgmYhpa<#^*B^8<>Ix|!-k1@A|8<%U% zOLVQ`0qW!hUv#RUs==neec3>6)`d~>Fg2GH^>~VvC9r2B^Bf? zd8~j#<(0hU$uNI;h~6{7^z7Y3_c)$kxivd9RZHOXuuo&p*!Z)DQP=C zfwc0UD<5-L9o`TX!N*z)#GUE{x>lc4zc9%X`M4@5b4=VYkWn#d1H}SyAk^{2;4(mG zNP;fpjK7x5Q9GfxB{%$@&8O?QVXDiZ*Cs}S+WPQS(|xb)6Lt78>XiGmYz_b+bSn7U zQtDX1iYR(WJ4MZg!I2&`qe%pqEDIm;N*=Q8W25%hfd~~k!6$K+=?&K1KuMixFZFP9 z>H8PQO60;fT_)I4BgT)&cmeDtw$zhB?zmfU*%{*wEik~wQaNk19tY)izrFmiM(aP0 zvrMTzt$sR1Upa4U=_`El^oF8j%InalT2ivDVj5Je`ZsSjEBK`}s3dn4%rmPjxmE|N@|Ms5g| z@tFu#Gr}mNaRwCKe8>*4wa_N9G(#qsE+ZeY1%BM1u8gySyn60n(n_tj$~v zrN=o{zovfRt-2{`V46V3ftLh_8Zx4o3DA%Ey^3oO4H$VG`N~=KRJq)=M5RVhoI(J? z=~jF(iS+$if#}W#E!Z4cARvltb(Le#T(qQs+muDsKf`RB_t)T1pJvPEfP!|LQJOHE z9-FogAh$KQgo^FENSUM5vfNV(Ri(v4!)kXsel;tKM9m_z?we&3M5L_^-xTe5rB$b9IQ?9NWB=#sIXuIz1NL+C2&%1;y;Kg~P z${M#)$YUl{fo;01neTM=Qenw>p0~UkCVq!VoxV|Z4b~-L2MVy~;yssX231U~)&fi4 zg-Jg?@>_n^z6XiuGz=Vw7d1Ia3L;}XyvoJ0mP0y9UwGU~d3wiTE$!hzDIRvat%L7w z!POdQDR!VaZEF5^P(wtQXBM1xsQbfZM{scz;>EhCT`U5< zPS9uYx{P)z3>Ff3k-k=RmC>t&dP3ah)mIK9xV<;wwP5uYqe%yZAE1m*-Wm^ej(pME zHgeT@!*-i}2*vIft+g5ZpUg0AYuHFi`0sfpdy?9SRQf;7fSG5%u68j~izJ@&%rYJI zgpGInNC`@Gb!T0>17S{oArOUsNvc??^PHkiQ~NOZ{YGywGAZz8L(~%c^&+(GjkwG7 zWRUZ#y}IIoX!sXbrF@T)nrZdU^!591FRX@V9}nG>5V`JyA6;!$%e6j=3E>goWO z5^pWPV*Jj`2dM4Ri0$eAhxg$iMBa7n$zbVK-bN+B0Kmx43QTm!=h z{ewR~+#+x<&&>65IyBsjp}W2;+auOrj9hRnk(HMz0VL$xYD=(p+vxO1FIhizP?eil z}U51v6OWyB1(7X$_)?DPK9Bx+Zg zkdor)ehK|QB#W_-`^nt7X*p?3ZkzE;(r0ToQq|v?J!#eZS@!iV+fVe~rHqkYz5zK- z#n(X$6}Sse50Nxxul*(M9B%QOR4S{lD43r`^k_EgFsOg})N=6T+&}(cJG>q3c77)I zbMQ+EM&t7<{@YQUX4}6;gl^Uu!nb9$#Pc?m@}Fmg>x;z{-Aw#9 zmF%eAqIYX?TOmiX|Ne7p2!B2QQ|LEc*S%A^a*iLOj6cUCn7tkNChXirqXTV(bWhgX4E7)A&b00le@qS$)1wUqimp z@X#1??oh}6`{_#uca7n6`Z*CjlpL$BL6Y;sVo7+n07I{fD4E=2k4L+ycYmm-`uJ@tCrRuxZ|YlV zro@+rMS1PTl`O)IsnYHHtSW3{IK+HeX~Zc?foF{|PvI$4S{Xx$amIcA#mU!c`)jO%h!Y^^ zec2RAs4xa1*pY!ajn;jhbyk=tITZcb;r6@~t&WmLyNCmdn(x?Rz zkVXkSbNCh&ijB0;S+zKL3L=3k_@@++jw`ag6o)Pef6<+X;!NW#=72Io@cp^L{UsSj zd3p{IK0D1jfmBfrp8V+K5rZ^{SV>WdK@De?D1q`|CAIw}A*qm@@cdFs_d*9x_Y~aH zm~Lr*+SlDoG^Gt_SvD|L5)w|apym`TpOmFHS{f1tKbs9g4+qklhv5 zz5c+9NtJB<6=f19@viWaBP)A`a=y zAzJPiB-Tg!t61Fp9jLb4StzC9|lM6X6g+ z0>qZP{=yW*&Nxa=+_AqT%0T%%JP{ze{jT@)iw4B98Gjdh6!QzCiMNewJ-8c|mht}6 zsf`Uc1qT}RjvD?pz`mn0u*UhX4dL>Bjmc?^$jKz2F2}+L5+TvVZro(o7s>Ry=1x2! zak{DEsL8IeG0rc9_7~{l*DRFQoOuvkRO~myQ5R0z0+VRz_;u3;ak0Z4Zb>K{;C?V< zoYCwUi|>=>VyB31>&BYPC#JKqBqF|`*cG_jYF8WPr?Z4|oFyi!6O7>f&259LZC>G- zM8|BLU;BDmdz(?ir$ptK!jST#_8`Q=MO8>hb7ajC{7dS?;HHN^Rl{!lVty#mA!6Ji zE`c{KD|oK}Avbr-kdiy>%HqmtqUtCFkI5rPVc1mZ+eS_{A_N)(sjiVZg8?UjYV{sU(dKJ z1{bmH!vF5NMtSXY+L{;9?Zo4~zw}6Vt=la!D9sP9!PDbj-ZR?U;x`!hf7m1&Kneh0 z6f)`E|9bgs{x3EuPBQy{y?lj5#Uv} zhn_qhAPtWsKOGxycs@1VHu2(R@yy)oj8}_GdGo8Q%Nwtxl$Ai(+WV0=`(uXs+FH^8 z1U%XO_VD0zNSQ(~9iJTk0S^$cyARRLLfT1~ra6lXr0Bnn^!E*45XVflzK=yh$S&%c z7sS&t?ml`iEOe$ga{Y{X+W?B80Z>MBwJ!_}6As{*O`&I*>fzkDW3)CE9jBLl4kZn1 z7NJ}tDDd^fSqE}LEsV!*jbu^WS%hD}NFo!bny~sJhf*^G_~$$#V&i85DGs5gLRcC6 z33YfH>3-bTamn#|zHSoX+f-l;0HGBN#t;9L-JEvU8pT_wtZwD$S>O36M*JR2gA#M0 zHeHhSddhzp`p3x{Zumfx-IOR$ba(GvtB(C!I=xewHENxiF}_|x0%LTn$?YfHoi01G zIh-EDG9#~y-tzkcNx^4N;kSX`P76-YApxL|GR z>9`3kpEnA1@E2z6TcZx*h8QvHq^NQ_YZfl$Wy~;aCNSs$e%G(@F_5s~F^JyU6snQK zqw4m4tbJ{k`W;<;zI$B_78-{WE(R9g3&>dy1cq4+DEdew$V%*&h;3t;Ji0A1fCJld zkXE}DzYh#ZAcCUcg3t)lEn7&v_%+X<|6h21(qwfx35F?v`{$lMJzMK6Q#uwFHY5n` z^v{UnuHHZ&cTjf8xa1u9{$oKIqO&zY;rgh$=_5IF!<#IWCH^?Y+`Wp(RK0)d@Y zGmp$FIksy7Qu~v%QWhXvadardV*&_~`dMQDfw@}y^ie*Zs0#G_Wvg$?ABrycLiUDX z)O|kUhp1Y)1oQ;x;5;`v-1u6X?G=Blcm3P(*M4owR5=3q`8uT0vw8olvtD`Tm*B2xQ4Xf))_K8V+L_ zf8QUbyBXQT!+fOs9>M@f-;hE;PSThgDf3gXYQC81TSGl#{l2fBBa?$0Ar|^QA;HpN znBluHBTXo=D`n;QEby61}#)b*vu3ZEb`4q;C;qyT|?VZ2{ zGo~&;QCO%?$M7=hI9H7F=L9YLMYHhm3FPJ|KPg_}9wwr8ef@@hsOf|T0YC~Qw^=`a zkclRgxCiF9#Gyp+WcMbbqQ`)QW~qp$NB(sR=n%XwX(B@;Rw z;ny^|6^Jp<3GmoMRxX%8VG%BtF#vd}9ylpNMIzZnA)$=;&BFT`9Ofsx=C5ycwk@os z)A6E7i<{6D<~NRfGh2ov_d^ z6|<`x-jx-e3Z=K7>cme zI7PEan?s`V*@S)*vwnP33S7HaKxYV}RfdLPtLtcZoBpz9QvQ)KNSu?LrIb7(H;&r( zRq`|i=Szm(CgPL+Tt3R0!vmBu_I6zQ=6kOk4MiVPWmY`ds{1`$d-}%jQaWLjU)7YAtf5q_qzQ495l2X2&H-8t zIoE5mCPKUZeswyj1y#rZGD1v#`)eW%LkY9<5s2Xe9?D$OyL2hqaDd$(2cex*VW??i z_BNL)`HQr(62pP?L&Zyyp8=+On^K*a+ftO1`MbH(8|QBio%Rnrv1=D>2W;slL)v38QcSv|e#A9f%a$4Nx^cW)mi^Gx*@3 zeB{TT&muN#|0V`r`Spn=3LF2w_kx^I37zQ%d-uh-TdA)0>0 zJlzdM9|UhyOF}VhU7;XPhswOGbIGFleveDQ9TOQMhLa5FElU>#i9pDJ7~HmFL_uO% z{0oSo+eOw5gMX6Eq{Fy4M6LzDM{Pc0XYT;LL8FaPg7ALa_D?UhF|+bVAnUOLjUo3j z4q(jT9$i$<^GN!Nq@`T+rH_>u06j!-%C8+L3P|M>QaA==n9yMLZlc9l(zoYYx4V79 zS2*K`*;0OZAgkCdJi>Q-;`l59yw(jUDV5m3qOJx05q3%+kBmNnvK<>V>0^xM**LJ! zsL+__g*fbK{2`lF&B3{ZGlgUVU=$dMsl##FP-j>h;J_Pfgse`o6#pL_+FK@X=_oz?=zxS|Yg~Cn&yj3Q63~(OD?7|_O z9l-ss2$fvs%KW7BPzPRnrM-*b*I*U*LVy_$ra!kW)6Z7l%dEecu3Bmyvje3V7H=h7 z%ofQfgC?ij5Y92_GdMz@jMUJgjAY%$x^u4JK}Jj90{cxk0csDo-RMh9oy^~aXY~nX z71cX&l5VeCd#m{*|I~vj6y$;=`TKw<+c!pPbef1rZZT+a*x<*O0I+lz?bxSG>=hU0 zI`?v%=cpXUKNUc6kbTQW?x_a?iK(KIFc@=A?(aE7-X^RWMR`^++bIiM%Lt!fOjthT?4U0%8gcA9Xn~?>I@ZAVR7oX*-}A z^;f5C^%%%bb`XV~IjCo<&5e*$CZoa*``aF+F)0WLY7@}!eW3Lku%>ZGVRV=tQ6Bi# zg*o8Gl!41nJ=&9AP3m=+q~=NUaAI|9!ZYW=5&QSGpZJOG+5)B@_Zd?vtY0pSS)3fcR?GP zQXS5D%=7>uq7o=Yxt55BrKgXSvy!d|A1Kk1YIP%$Z`PNja}kXTiSOX0g`#>#TAJo4 zfd`@hJz(Ye9Ym0Cd(b{8`NqtQz9N}c*8JQQv9FY11T}LvS$Y(^v1({$oYvXsGO3%j z?^Q0s0#(FRn6XJ+sG`u<_eTW4?lI<&RCqpGOxhcCInDpOYi|d+^>(LL^6Y`_#a1`p zR!^ZikK|Tc_q5c@__k(?r-5M59#a|`!I#KGOE5nx7Hi}NhilKhy?^VK-120(-jm{lUy$dXZ96q%kG3qgi764g6CnBU1+keMMRfc>BSUy z92mvy{m%G2oynA5PPv?MphPcAPjj~8Yi9pH zTBnaq?>usKuxiZsmf<+r`H{9+<1F!;e%&iXWt5+Z2Y3$M_`&*;1N>GSf+2Td(k8K%n>W(E_+IdFMY%fE8%s zMXQ{nV-xU?`(C4xN0YF4@Wts}<`Ez%PA%1__07>xbZI-gK{KSe+tt5sbk(<{Rz1p9 zI+?Qafgn(8th71x$BtZbn>~L?&DdceN!2NZhqC(#PmL=&U2jl3td{yyx1y%|q6R!W zd#GLo=&geVgQ?G2DDY6g_Zi_qIz!b{yHJTfW=Z=Ki6=k=G01N?zTEm!IG5YCntpiz zNiteXCvBNr*wwXB<9OnBYBr?pePJh;P3rs^c43Gvyg_v=Zk(-qPvVh_zC(#;54D&O z71}W}7JS)oAHj>zZ@h2d6#YgmiK|y*cm&{6wTfAPhFj_woES#6R67r~a?x9I(&d_J zgT(6;<*>OLp?1sTaj^;a=j#s$u0z4%cqU6M)Z|{nUF#2J-6IhLSzJx5rsFjdgZJ*Y zYXTsQ{0NE$&-bCBw*BHmkRAacv>jg_bYM>eV8P*@mpympc*cd|Rmpf({4;KOFz)(# z!-WngJthv01No1kp^Hpr8zxx-&Mf%kg8#7hP)u+l*y-yuP?{VgS*}L+aO6v051kpu@5P%cT1(3j#)~NX}dlNbA0Z%kn<-U zmvZQN!ZY|hH&vPj$qc}DSEf=DGPV7x)&w+}zJJ-|4N%c&3&*+1V$m zxiMU<6&11!@?laq+Tzm6AF`F*r0Ss3-(@Y9GB}h6#_1{G6qM89#!cSJ|019LHk}UP zeLZJNG@X>-!+;Ff;D`E=ic#Y()3YV9N<>lMP2k01DVXUf6D$Wx(9)2h5r!S>My_>6 zL_A^pJA3)>%ikBrwdsi-TUAfvtq^EX20Q5~{o-tplNWE#=MLREW@^(R=i-g1xxi<3 z;NGIN3G^Og`nPs;UMyH5)ua5sea}4UuJAbV!i2V%)8J`O zaAEZozYSP#q<@*gXgb1yP(J^2#EnuNHs3Zt3RrDeE0G{@NpU?fSqWKUpV_at&YxHQsI=gBF;cpkTiTn=qmZe5cGQ z$L9(x?4Cz9&aAw2n7iTM8#DWS@zYAPO-|c#aH23jU3&G0BM4j0;>K4Prvz3@!VHF< zO1`-KZjXi7j==+#vBikF zA9Zzq1*n~>~3JMC^Z%+Gx7M_C(QPozffth_A|OkSv{{PM4HxA}>qUj6pG z44}~dRZ_Bun;3Gk>3>0KW%1?uM*A1rqggeJt$Q**ME`yGr|8k}_RWz3z}#`@_^kZh zdzKuG0r^O2He7yLx`QzL8TGjdGhi;t-$$V#nQ|mAtx3NcXJR0IY8!6yk+N6o05k*7 zPxqpaK$JM5M$hem%GmNK;35v^Wi%GRy41u4RaW zma|uH%iEVhHCaIxOOTJ8acN^E(qkw0-IGag1#ydj+GpaHheY!~%ydLf!q69A1f@O5 zR9P6jonw2ND$ITe=oJU%fbwi=PYk|Pe5~Zs#AG6n{-fV>Em)!KWbew08QW9jC)WM|Q+%kLKQu(r{u%FWK z1|O#cMbJv%Ngh+HwI+OQ zFqEZ~RO8K(+)_CQ<{}5%m|oEisUEK`dZ#!rsj+Fu4rI@n9%V(n(Of8z`M zrMOe4>LJ5IaX`hL-CL~Go9k3lWoYg!Qws$x14R^XziT+^9K!Hw>GM1eCm@%UR81Qx zkA`?GH96(eBbfDX+YiTWX@;G$Fr5q0-;7&f3+WQc@$oDwySo61-xMD*YL(+`)oZco>f%y>)gyspe@`elX zjD?V(h-iFkx=>4{%00m)gAUWFbb> zO3cUMtb8m`xZ&vX$)MD9#(#O+7zJ*3fO>}>?&+u@^J_}`KLjTh!gEz*n}$yv>8w8y zb;&7T^;*~~kD1*=IPxZ+{H!+#wqr_Au5^U*rU~wC2U#YE8-ZirC~4N@z#F*i(PQ%FXi@$oox1QnmY!D zmBwi2^MKx1MUiq9`k9w{be6k25&m(&C>0#}#}3!i-RS5gRQ;n(;uAgPuEr6zDeZq6 zO8}K2T@tq*?G9VVK6!h1Xh<((Y0vloRzkzulG-OROvOid|C|xYi+Sh-%lPlp^N6oC z*qKRS`H>F-Z*a4hOKq0dC>MS$1DYduUU;3JHumy;&m8NH)>i%iG^MpBcGHE5Nz;lu zX7X347nB}N{MP(6uJ5CTx%X@=j5b4A2m@0@i39e5y+r}LH{{#yR^z&G@bIbq?97i4ApD6n92Rm30 z0RjjpAh!SpFdzX9$hJ1C=9^xcY11G~k@z|SR8V}fn!ED4e}dKKs@G3L6y^sP5Q0$y z#Q)U6AeMFGKm|u(zmE3r6W{=;YSxn$^{4gjDAHW`w zgK@>|V;mYlno@Hw57z5fC_(OG~7_~C%YKoBgjFu(?vqO7H<$x`fT zA+2U7!;;x$6$T7O0x&SB#PHw&igVq*h!dIuaH~^lslWj=Vt@#AfCCli+eNTsfD5E7 z274<&oP2Q%4Rs^{N#Ox4ELbb$5a@=rbKKJgNWkNL!hj2DLb|@@G!A?)UWdv~T!g`Z z1ZvKBlRycU1WWVBVZaZ!Wsf{fM;x+0*zG!9`-mAGW25=z7z8Hf52@oD(1h^x^q47(P zgW>I7*`DT2Atw=NB>*j0f!_2bQva;mnlPL+nNLoF2U;>A{R3KwvI2OPj>b-ouv&GoQh6O|H4mzk#z5OfNRKw=p$Q2|{+4~6=K@`c)RLCP7Fc-c6pA~MX+**T z2KY-hRmBkjFhIA%tzYsYVX+?oVY{95QgcDOE~)zTm@sVNRDU{L(Ujg8Y>AtQiQM}ktUddHL7odAQYhsDOjjYfB_0n00TJS0^X`Lnw2T58uDnG z3uCZn^K7C!kvPF{%^wFuP3U1?71L|{ZU-uW+htgAy({i?mCG?{Jn{Cfc%3(ZR|gTX+4MrbC45^>nzt=ruc{fxua0ZS!?Pc0o8<@n&~H@BFyiC%Jeqj&8W>-m+#UXY;I9mtg4Iw$2F zKo<=B?9S6O#Fctrm1X^KI(M#mqwaW;Yd+Q@mN>#!pNTSKehPH2GwESlV8g`z+izDp z;^XT*xBqv&@hjilzxLj_*H1wSrbm1aIc#CW)B5F#_itO%UV7Z8wCJ{;gc6MJ@$$Bj z>ikyuaXVjq@n@gw#K*ebdmXDB19z!-=Kd5)o$`-=8r{3sef@bqci-Dk|NA#0y@!80 zmmDo5e`p7G(??p*mv+QNaa_iAeaB!vRu$f}fCzPJiN_oWm}Fv-exCMw8wG!xBYq&* zXCvox7>GtE_-|{+fPm%*9q57iSAO>AYtnW*CJ|{a7lQw{e6^QG?JVsp2G zyLM8Uq;Qg_f}K}hRAykjhF(ONfYcXvsMmugmwO{vfLhmrj|YZ#Cv!13epQ%jS2zX8 z;{SP!2XZxNQWmmsXqJL_v4dVR4_ugZWC(zHvW7UPgy2VcN4SKbHHgGTh|-6HhzN7k zCJBHz1xrDIURZu6IDkP&hHzJMXDEiU$1aUXJ&~AzpeJN_R)HdyV-B|&{)CES7=UJ! zhok3qqnLSJCvO#Jh?aOap(ue?7Hx`%d(QW6kN^d>NQymnbv}44erRj}Rfl%BiAcy& zEx2bHc8s=|iJCQDBxqwhh-s==VY_yC_U3}GXlK~xb+v+x&U0v-_i!`OfYX?Zy%>*2 z_!>`WeidhNO%)03=sZ%WZPR#$oM??ND2=8_kb8KJ9@dP>xE%lJJXjEgHrRZPL;rXr z70vU!I*_iCysN)Yq9uS#AsS? zxnMv@To?z1d^wn1s3Tm4YgCz-7g=F}sa(_JjKqkMBR~QsFrCzS0w+KMC6JvXuvw?andC>8#%X3dNqb^;njLv> zM+X8TAe|_n0xZA+DiEJ6umbe?p7Y59DUhEifSn@%1p(EXscDE06P{*Pnhr>prO1f) z2zOH=0wZ7o?Kz+HIiVC*d>rg)mCDu4ne@SCxDppQsHZ3=Y=YGKz`m%|7GBX9y^nx~FRrcp`)RNAHa zM-qd2c6U>FhxnQa=?Lq|q>mb^c)FiD+L*#OqMdN5n5S^+b$dnngG(3!CUB>sTB~KM z0w+)cBF2p@$c3u0=Am0Ws09CAOij;6u)YGN@j$qX@-+P0<@~E z+UlhEsjE1-g3c7JulId)`K|vsJF+UK+q$k!ssbi3sePz>;wpcv=!z;Oh+8(R?7FW_ zimN4nmS|KV^NN5?xtzTEE&9r@3Ol3t*{5GR541V3ua~HHDF2pDBdd+Nuo_#R?rIMe zlwT4%gY@^UQFv*nfUz5!vKQK{X&JF0YkbIup8uAMAb_nZd$Sa}p};vJFz~W#$chd} zv6@l>>WZ^Qivs`Jj6NHQ1@=9$m!O^?0w|ENMw_zuNdmj&vP;{6N?@>hDYGHKs8u_* z-TDkYyS24wj?-5-BtW%etFrL{zYDDgxR1wqu(DBR~ms`;Rdjlr9+p$f~!7 zivoRnwtxGNg({K>Yq)xg0*i~3BS4gzIZ+}|w2=F@llzu$ni;a1x0`#jEYP{5xoIux z2qTaJqg%D6Yn*+nWhP?+Zri#F`?>_0l4*grwrjPxn{}n@5|xi&v%R~pzk8{Lkx7|b zy!=|a$NQ@zYq2$3yUZ)9&pWUa`7OV literal 0 HcmV?d00001 From 6647b3567ac60262eb8bfe357abad48211ad4ac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Tue, 23 Jul 2024 20:52:42 +0800 Subject: [PATCH 25/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20README=20=20?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 214601ed..2aa2349d 100644 --- a/README.md +++ b/README.md @@ -32,9 +32,9 @@ 如果你觉得本仓库对你有所帮助,可以通过支付宝赞助白老师,激励白老师有更多的精力和信心维护本仓库。 + + > [!TIP] > 每一位开发者赞助 `30`,白老师一天的食品安全就有了着落。 ![赞助](/image/赞助.jpg) - - From eeaac2849bbb1093ff06004a613c94edeeaf9077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Tue, 23 Jul 2024 20:58:05 +0800 Subject: [PATCH 26/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E8=B7=AF=E5=BE=84=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E3=80=82=20=E8=AE=BE=E7=BD=AE=20github=20pages=20=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vuepress/params.js | 4 +++- ...53\350\231\253\346\227\213\350\275\254.jpg" | Bin .../public/image/\350\265\236\345\212\251.jpg" | Bin 0 -> 171632 bytes README.md | 2 +- ...53\350\231\253\346\227\213\350\275\254.jpg" | Bin 0 -> 354705 bytes 5 files changed, 4 insertions(+), 2 deletions(-) rename "\347\214\253\347\214\253\350\231\253\346\227\213\350\275\254.jpg" => ".vuepress/public/image/\347\214\253\347\214\253\350\231\253\346\227\213\350\275\254.jpg" (100%) create mode 100644 ".vuepress/public/image/\350\265\236\345\212\251.jpg" create mode 100644 "image/\347\214\253\347\214\253\350\231\253\346\227\213\350\275\254.jpg" diff --git a/.vuepress/params.js b/.vuepress/params.js index eee102f7..cfb73ec8 100644 --- a/.vuepress/params.js +++ b/.vuepress/params.js @@ -3,5 +3,7 @@ const logoPath = '/image/现代C++并发编程教程.png'; const repoName = '现代C++并发编程教程'; const repoBase = '/ModernCpp-ConcurrentProgramming-Tutorial'; const repoUrl = `https://github.com/Mq-b${repoBase}/`; +const sponsor = '/image/赞助.jpg'; +const cat = '/image/猫猫虫旋转.jpg' -export { repoUrl, repoBase, repoName, logoPath } \ No newline at end of file +export { repoUrl, repoBase, repoName, logoPath, sponsor, cat } \ No newline at end of file diff --git "a/\347\214\253\347\214\253\350\231\253\346\227\213\350\275\254.jpg" "b/.vuepress/public/image/\347\214\253\347\214\253\350\231\253\346\227\213\350\275\254.jpg" similarity index 100% rename from "\347\214\253\347\214\253\350\231\253\346\227\213\350\275\254.jpg" rename to ".vuepress/public/image/\347\214\253\347\214\253\350\231\253\346\227\213\350\275\254.jpg" diff --git "a/.vuepress/public/image/\350\265\236\345\212\251.jpg" "b/.vuepress/public/image/\350\265\236\345\212\251.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..22adddd49d7e5e2cfb8b8bc4437cec2b11feab6a GIT binary patch literal 171632 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�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� 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 Y@Xzeky~B>zS=Gpd-rH(Fd2#dq0f@);u>b%7 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 2aa2349d..76ce16b4 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@

-![猫猫虫](/猫猫虫旋转.jpg) +![猫猫虫](/image/猫猫虫旋转.jpg) 如果你觉得本仓库对你有所帮助,可以通过支付宝赞助白老师,激励白老师有更多的精力和信心维护本仓库。 diff --git "a/image/\347\214\253\347\214\253\350\231\253\346\227\213\350\275\254.jpg" "b/image/\347\214\253\347\214\253\350\231\253\346\227\213\350\275\254.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..f2c960c59b54eb5eb40e819e8d840c9b07736946 GIT binary patch literal 354705 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%0D>_RfQqY4>!#hakUsr* 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

X_8^;&7Ivr#$!cEMi>VL0`|Rq5n+!FS;gp`x6^ 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 z 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�O0XWD>j#X5lc-QmiCI=D# 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 literal 0 HcmV?d00001 From 9f6127655bb83790747155ec5c1612b4e801f6ff Mon Sep 17 00:00:00 2001 From: mq-b <3326284481@qq.com> Date: Wed, 24 Jul 2024 16:20:49 +0800 Subject: [PATCH 27/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0=E4=B8=AD=E5=AF=B9=20=20`Boost.Asio.thread=5Fpool`=20?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=9A=84=E6=8F=8F=E8=BF=B0=E4=B8=8E=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=B5=8B=E8=AF=95=E9=93=BE?= =?UTF-8?q?=E6=8E=A5=E3=80=82#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\272\277\347\250\213\346\261\240.md" | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index b6682b43..77ace044 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -86,7 +86,7 @@ graph TD 使用方法: -1. 创建线程池对象,自行指定或者让 Asio 自动决定线程数量。 +1. 创建线程池对象,指定或让 Asio 自动决定线程数量。 2. 提交任务:通过 [`boost::asio::post`](https://beta.boost.org/doc/libs/1_82_0/doc/html/boost_asio/reference/post.html) 函数模板提交任务到线程池中。 @@ -111,6 +111,9 @@ int main() { } ``` +> [运行](https://godbolt.org/z/h5G5hTT4a)测试。 + + - 创建线程池时,指定线程数量,线程池会创建对应数量的线程。 - 使用 `boost::asio::post` 提交任务,任务会被添加到任务队列中。 @@ -134,27 +137,27 @@ thread_pool::thread_pool() num_threads_(detail::default_thread_pool_size()) ``` -代码很简单,就是 `thread::hardware_concurrency() * 2` 而已,至于下面的判断是因为 `std::thread::hardware_concurrency()` 在某些特殊情况下可能返回 `0`,例如硬件并发能力无法被检测时,那将 `num_threads` 设置为 2,确保线程池至少有 2 个线程。 +代码很简单,就是 `thread::hardware_concurrency() * 2` 而已,至于下面的判断是因为 `std::thread::hardware_concurrency()` 在某些特殊情况下可能返回 `0`(例如硬件并发能力无法被检测时),那那将 `num_threads` 设置为 2,确保线程池至少有 2 个线程。 --- -我们的重点来到它的析构函数中: +Boost.Asio 的线程池对象在析构时会自动调用相关的清理方法,但你也可以手动进行控制: ```cpp thread_pool::~thread_pool() { - stop(); - join(); - shutdown(); + stop(); // 停止接收新任务 + join(); // 等待所有线程完成 + shutdown(); // 最终清理,释放资源 } ``` - `stop` :修改内部的标志位存在使得线程池能够识别何时需要停止接收新的任务,然后唤醒所有线程。 - - `join()` :等待所有线程完成它们的工作,确保所有线程都已终止。 - - `shutdown()` :进行最终的清理,释放资源,确保线程池的完全清理和资源的正确释放 +> 此处可阅读部分源码,帮助理解与记忆 + ## 实现线程池 实现一个普通的能够满足日常开发需求的线程池实际上非常简单,也只需要一百多行代码。 From 302a53b0a2d2370d7788396b053398e04ef496fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Fri, 26 Jul 2024 20:26:41 +0800 Subject: [PATCH 28/62] =?UTF-8?q?1.=20=E4=BF=AE=E6=94=B9=E7=AC=AC=E5=9B=9B?= =?UTF-8?q?=E7=AB=A0=E6=97=B6=E9=97=B4=E9=82=A3=E4=B8=80=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E5=86=85=E5=AE=B9=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=8F=8F=E8=BF=B0?= =?UTF-8?q?=E3=80=82=202.=20=E5=AE=8C=E5=96=84=E7=BA=BF=E7=A8=8B=E6=B1=A0?= =?UTF-8?q?=E7=9A=84=E4=BD=BF=E7=94=A8=E7=9A=84=E5=86=85=E5=AE=B9=E3=80=82?= =?UTF-8?q?=20#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\346\255\245\346\223\215\344\275\234.md" | 31 +++++++++++++++++-- ...04\347\272\277\347\250\213\346\261\240.md" | 12 ++++++- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" index e6bd7842..08f2bd1c 100644 --- "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" +++ "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" @@ -928,10 +928,12 @@ using years = duration, days::period>>; using months = duration>>; ``` +如果没有指明 `duration` 的第二个非类型模板参数,那么代表默认 `std::ratio<1>`,比如 `seconds` 也就是一秒。 + 如上,是 MSVC STL 定义的,看似有一些没有使用 `ratio` 作为第二个参数,其实也还是别名罢了,[见](https://github.com/microsoft/STL/blob/daeb0a6/stl/inc/ratio#L262-L277): ```cpp -using milli = ratio<1, 1000>; +using milli = ratio<1, 1000>; // 千分之一秒,也就是一毫秒了 ``` 并且为了方便使用,在 C++14 标准库增加了时间字面量,存在于 `std::chrono_literals` 命名空间中,让我们得以简单的使用: @@ -955,7 +957,30 @@ std::chrono::seconds s = std::chrono::duration_cast(ms); std::cout << s.count() << '\n'; ``` -这里的结果是截断的,而不会进行所谓的四舍五入,最终的值是 `3`。 +这里的结果是**截断**的,而不会进行所谓的四舍五入,`3999` 毫秒,也就是 `3.999` 秒最终的值是 `3`。 + +> 很多时候这并不是我们想要的,比如我们想要的其实是输出 `3.999` 秒,而不是 `3` 秒 或者 `3999` 毫秒。 +> +> seconds 是 `duration` 这意味着它无法接受浮点数,我们直接改成 `duration` 即可: +> +> ```cpp +> std::chrono::duration s = std::chrono::duration_cast>(ms); +> ``` +> +> 当然了,这样写很冗余,并且这种形式的转换是可以直接隐式的,也就是其实我们可以直接: +> +> ```cpp +> std::chrono::duration s = ms; +> ``` +> +> 无需使用 `duration_cast`,可以直接隐式转换。 +> +> 另外我们用的 `duration` 都是省略了 `ratio` 的,其实默认类型就是 `ratio<1>`,代表一秒。参见源码[声明](https://github.com/microsoft/STL/blob/0be5257/stl/inc/__msvc_chrono.hpp#L80-L81): +> +> ```cpp +> _EXPORT_STD template > +> class duration; +> ``` 时间库支持四则运算,可以对两个时间段进行加减乘除。时间段对象可以通过 [`count()`](https://zh.cppreference.com/w/cpp/chrono/duration/count) 成员函数获得计次数。例如 `std::chrono::milliseconds{123}.count()` 的结果就是 123。 @@ -1207,7 +1232,7 @@ async_progress_bar::async_progress_bar(QWidget *parent) ### 跨平台兼容性 -C++11 的 `std::this_thread::get_id()` 返回的内部类型没办法直接转换为 `unsigned int`,我们就直接使用了 win32 的 API *`_Thrd_id()`* 了。如果您是 Linux 之类的环境,使用 [POSIX](https://pubs.opengroup.org/onlinepubs/9699919799/) 接口 [*`pthread_self()`*](https://pubs.opengroup.org/onlinepubs/009696699/functions/pthread_self.html)。 +C++11 的 `std::this_thread::get_id()` 返回的内部类 [`std::thread::id`](https://zh.cppreference.com/w/cpp/thread/thread/id) 没办法直接转换为 `unsigned int`,我们就直接使用了 win32 的 API *`_Thrd_id()`* 了。如果您是 Linux 之类的环境,使用 [POSIX](https://pubs.opengroup.org/onlinepubs/9699919799/) 接口 [*`pthread_self()`*](https://pubs.opengroup.org/onlinepubs/009696699/functions/pthread_self.html)。 ### 实践建议 diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index 77ace044..3adce458 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -141,7 +141,7 @@ thread_pool::thread_pool() --- -Boost.Asio 的线程池对象在析构时会自动调用相关的清理方法,但你也可以手动进行控制: +Boost.Asio 的线程池对象在[析构](https://github.com/boostorg/asio/blob/44238d033e1503c694782925d647811380a067c2/include/boost/asio/impl/thread_pool.ipp#L98-L103)时会自动调用相关的清理方法,但你也可以手动进行控制。 ```cpp thread_pool::~thread_pool() @@ -158,6 +158,16 @@ thread_pool::~thread_pool() > 此处可阅读部分源码,帮助理解与记忆 +`Boost.Asio` 提供的线程池使用十分简单,接口高度封装,几乎无需关心底层具体实现,易于使用。 + +我们的操作几乎只需创建线程池对象、将任务加入线程池、在需要时调用 `join()`。 + +```cpp +boost::asio::thread_pool pool{4}; // 创建线程池 +boost::asio::post(pool, task); // 将任务加入线程池 +pool.join(); // 等待任务完成 (或者析构自动调用) +``` + ## 实现线程池 实现一个普通的能够满足日常开发需求的线程池实际上非常简单,也只需要一百多行代码。 From 3e88f470a58a97a518be6beed9ad5053e2ee227b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sun, 28 Jul 2024 14:19:30 +0800 Subject: [PATCH 29/62] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0=E7=9A=84=E5=86=85=E5=AE=B9=EF=BC=8C=E5=AF=B9=20`QThre?= =?UTF-8?q?adPool`=20=E8=BF=9B=E8=A1=8C=E4=BD=BF=E7=94=A8=E4=BB=8B?= =?UTF-8?q?=E7=BB=8D=20#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\272\277\347\250\213\346\261\240.md" | 68 ++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index 3adce458..4d378c9b 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -113,7 +113,6 @@ int main() { > [运行](https://godbolt.org/z/h5G5hTT4a)测试。 - - 创建线程池时,指定线程数量,线程池会创建对应数量的线程。 - 使用 `boost::asio::post` 提交任务,任务会被添加到任务队列中。 @@ -168,6 +167,73 @@ boost::asio::post(pool, task); // 将任务加入线程池 pool.join(); // 等待任务完成 (或者析构自动调用) ``` +### `QThreadPool` + +[`QThreadPool`](https://doc.qt.io/qt-6/qthreadpool.html) 是 Qt 提供的线程池实现,它是用来管理自家的 `QThreads` 的集合。 + +```cpp +#include +#include +#include +#include + +struct MyTask : public QRunnable{ + void run() override { + qDebug() << "🐢🐢🐢🐢🐢"; + } +}; + +int main(int argc, char *argv[]){ + QCoreApplication app(argc, argv); + + QThreadPool *threadPool = QThreadPool::globalInstance(); + + // 线程池最大线程数 + qDebug()<< threadPool->maxThreadCount(); + + for (int i = 0; i < 10; ++i) { + MyTask *task = new MyTask{}; + threadPool->start(task); + } + // 当前活跃线程数 10 + qDebug()<activeThreadCount(); + + app.exec(); +} +``` + +与 `Asio.thread_pool` 不同,`QThreadPool` 采用单例模式,通过静态成员函数 `QThreadPool::globalInstance()` 获取对象实例。默认情况下,`QThreadPool` 线程池的最大线程数为当前硬件支持的并发线程数,例如在我的硬件上为 `20`,这点也和 `Asio.thread_pool` 不同。 + +`QThreadPool` 依赖于 Qt 的事件循环,因此我们使用了 `QCoreApplication`。 + +而将任务添加到线程池中的做法非常古老原始,我们需要**自定义一个类型继承并重写虚函数 `run`**,创建任务对象,然后将任务对象传递给线程池的 `start` 方法。 + +在 Qt6,引入了一个 [`start`](https://doc.qt.io/qt-6/qthreadpool.html#start-1) 的重载版本: + +```cpp +template > +void QThreadPool::start(Callable &&functionToRun, int priority) +{ + start(QRunnable::create(std::forward(functionToRun)), priority); +} +``` + +它相当于是对[`start` 原始版本](https://doc.qt.io/qt-5/qthreadpool.html#start)的: + +```cpp +void start(QRunnable *runnable, int priority = 0); +``` + +> [源码](https://codebrowser.dev/qt6/qtbase/src/corelib/thread/qthreadpool.cpp.html#_ZN11QThreadPool5startEP9QRunnablei)。 + +进行的一个**包装**,以支持任何的[*可调用(*Callable*)*](https://zh.cppreference.com/w/cpp/named_req/Callable)类型,而无需再繁琐的继承重写 `run` 函数。 + +```cpp +threadPool->start([=]{ + qDebug()< Date: Mon, 29 Jul 2024 20:11:22 +0800 Subject: [PATCH 30/62] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0=E4=B8=AD=E4=BD=BF=E7=94=A8=20`QThreadPool`=20?= =?UTF-8?q?=E7=9A=84=E5=86=85=E5=AE=B9=EF=BC=8C=E4=BF=AE=E6=94=B9=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=85=88=E5=89=8D=E5=86=85=E5=AE=B9=E3=80=82=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E7=BC=96=E5=86=99=E5=AE=9E=E7=8E=B0=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0=E7=9A=84=E5=86=85=E5=AE=B9=E3=80=82=EF=BC=88=E6=87=92?= =?UTF-8?q?=E5=BE=97=E5=86=99=EF=BC=8C=E5=85=88=E5=86=99=E4=B8=AA=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=88=90=E5=91=98=E7=9A=84=E4=BA=8B=EF=BC=89#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\272\277\347\250\213\346\261\240.md" | 65 ++++++++++++++++++- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index 4d378c9b..752d5192 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -76,7 +76,7 @@ graph TD ## 市面上常见的线程池 -在了解了线程池的基本概念与运行逻辑后,我们不用着急就尝试实现。我们可以先来聊一聊,使用一下市面上常见的那些 C++ 线程池设施,了解它们的使用感受,接口设计的方式。 +在了解了线程池的基本概念与运行逻辑后,我们不用着急就尝试实现。我们可以先来聊一聊,使用一下市面上常见的那些 C++ 线程池设施,了解它们提供的功能,接口设计的方式。 ### `boost::asio::thread_pool` @@ -202,12 +202,14 @@ int main(int argc, char *argv[]){ } ``` -与 `Asio.thread_pool` 不同,`QThreadPool` 采用单例模式,通过静态成员函数 `QThreadPool::globalInstance()` 获取对象实例。默认情况下,`QThreadPool` 线程池的最大线程数为当前硬件支持的并发线程数,例如在我的硬件上为 `20`,这点也和 `Asio.thread_pool` 不同。 +与 `Asio.thread_pool` 不同,`QThreadPool` 采用单例模式,通过静态成员函数 `QThreadPool::globalInstance()` 获取对象实例(不过也可以自己创建)。默认情况下,`QThreadPool` 线程池的最大线程数为当前硬件支持的并发线程数,例如在我的硬件上为 `20`,这点也和 `Asio.thread_pool` 不同。 `QThreadPool` 依赖于 Qt 的事件循环,因此我们使用了 `QCoreApplication`。 而将任务添加到线程池中的做法非常古老原始,我们需要**自定义一个类型继承并重写虚函数 `run`**,创建任务对象,然后将任务对象传递给线程池的 `start` 方法。 +> 这种方法过于原始,如果读者学过 `java` 相信也不会陌生。我们实现的线程池不会是如此。 + 在 Qt6,引入了一个 [`start`](https://doc.qt.io/qt-6/qthreadpool.html#start-1) 的重载版本: ```cpp @@ -234,6 +236,65 @@ threadPool->start([=]{ }); ``` +--- + +`QThradPool` 还支持手动控制[**任务优先级**](https://doc.qt.io/qt-6/qthread.html#Priority-enum)。通过调用 `start` 成员函数,将任务传递给线程池后可以再指明执行策略。 + + [`enum QThread::Priority`](https://codebrowser.dev/qt6/qtbase/src/corelib/thread/qthread.h.html#QThread::Priority) 枚举类型表示操作系统**应如何调度新创建的线程**。 + +| 常量 | 值 | 描述 | +| :------------------------------ | :--: | -----------------------------------------| +| `QThread::IdlePriority` | 0 | 仅在没有其他线程运行时调度。 | +| `QThread::LowestPriority` | 1 | 调度频率低于 LowPriority。 | +| `QThread::LowPriority` | 2 | 调度频率低于 NormalPriority。 | +| `QThread::NormalPriority` | 3 | 操作系统的默认优先级。 | +| `QThread::HighPriority` | 4 | 调度频率高于 NormalPriority。 | +| `QThread::HighestPriority` | 5 | 调度频率高于 HighPriority。 | +| `QThread::TimeCriticalPriority` | 6 | 尽可能频繁地调度。 | +| `QThread::InheritPriority` | 7 | 使用与创建线程相同的优先级。 这是默认值。 | + +到此也就足够了,虽然还有不少接口没有介绍,不过也都没什么特别的了。 + ## 实现线程池 实现一个普通的能够满足日常开发需求的线程池实际上非常简单,也只需要一百多行代码。 + +> - “*普通的能够满足日常开发需*求的” +> +> 其实绝大部分开发者使用线程池,只是为了不重复多次创建线程罢了。所以只需要一个提供一个外部接口,可以传入任务到任务队列,然后安排线程去执行。无非是使用条件变量、互斥量、原子标志位,这些东西,就足够编写一个满足绝大部分业务需求的线程池。 + +我们先编写一个**最基础的**线程池,首先确定它的数据成员: + +```cpp +class ThreadPool { + std::mutex mutex; + std::condition_variable cv; + std::atomic stop; + std::atomic thread_num; + std::queue tasks; + std::vector pool; +}; +``` + +1. **`std::mutex mutex`** + + - 用于保护共享资源(如任务队列)在多线程环境中的访问,避免数据竞争。 + +2. **`std::condition_variable cv`** + + - 用于线程间的同步,允许线程等待特定条件(如新任务加入队列)并在条件满足时唤醒线程。 + +3. **`std::atomic stop`** + - 用于指示线程池是否停止接收新任务,并安全地通知所有工作线程退出。 + +4. **`std::atomic thread_num`** + + - 表示线程池中的线程数量。 + +5. **`std::queue tasks`** + + - 任务队列,存储等待执行的任务,任务按提交顺序执行。 + +6. **`std::vector pool`** + + - 线程容器,存储管理线程对象,每个线程从任务队列中获取任务并执行。 From bfdb4a2bbd9b839ed8a3512c6195351063e2ebad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Tue, 30 Jul 2024 14:38:19 +0800 Subject: [PATCH 31/62] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E7=BA=BF=E7=A8=8B=E6=B1=A0=E7=9A=84=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=20#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\272\277\347\250\213\346\261\240.md" | 110 +++++++++++++++--- 1 file changed, 94 insertions(+), 16 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index 752d5192..f9b6003b 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -267,34 +267,112 @@ threadPool->start([=]{ ```cpp class ThreadPool { - std::mutex mutex; - std::condition_variable cv; - std::atomic stop; - std::atomic thread_num; - std::queue tasks; - std::vector pool; + std::mutex mutex_; + std::condition_variable cv_; + std::atomic stop_; + std::atomic num_threads_; + std::queue tasks_; + std::vector pool_; }; ``` -1. **`std::mutex mutex`** - +1. **`std::mutex mutex_`** - 用于保护共享资源(如任务队列)在多线程环境中的访问,避免数据竞争。 -2. **`std::condition_variable cv`** - +2. **`std::condition_variable cv_`** - 用于线程间的同步,允许线程等待特定条件(如新任务加入队列)并在条件满足时唤醒线程。 -3. **`std::atomic stop`** +3. **`std::atomic stop_`** - 用于指示线程池是否停止接收新任务,并安全地通知所有工作线程退出。 -4. **`std::atomic thread_num`** - +4. **`std::atomic num_threads_`** - 表示线程池中的线程数量。 -5. **`std::queue tasks`** - +5. **`std::queue tasks_`** - 任务队列,存储等待执行的任务,任务按提交顺序执行。 -6. **`std::vector pool`** +6. **`std::vector pool_`** - 线程容器,存储管理线程对象,每个线程从任务队列中获取任务并执行。 + +那么再直接提供构造函数以及添加任务到线程池的接口,然后内部再进行一点小小的操作,也就完成了: + +```cpp +inline std::size_t default_thread_pool_size()noexcept { + std::size_t num_threads = std::thread::hardware_concurrency() * 2; + num_threads = num_threads == 0 ? 2 : num_threads; + return num_threads; +} + +class ThreadPool { +public: + using Task = std::packaged_task; + + ThreadPool(const ThreadPool&) = delete; + ThreadPool& operator=(const ThreadPool&) = delete; + + ThreadPool(std::size_t num_thread = default_thread_pool_size()) + : stop_{ false }, num_threads_{ num_thread } { + start(); + } + ~ThreadPool(){ + stop(); + } + + template + std::future, std::decay_t...>> submit(F&& f, Args&&...args){ + using RetType = std::invoke_result_t, std::decay_t...>; + if (stop_.load()){ + throw std::runtime_error("ThreadPool is stopped"); + } + + auto task = std::make_shared>( + std::bind(std::forward(f), std::forward(args)...)); + std::future ret = task->get_future(); + + { + std::lock_guard lc{ mutex_ }; + tasks_.emplace([task] {(*task)(); }); + } + cv_.notify_one(); + return ret; + } + + void stop(){ + stop_.store(true); + cv_.notify_all(); + for (auto& thread : pool_){ + if (thread.joinable()) { + thread.join(); + } + } + } + + void start(){ + for (std::size_t i = 0; i < num_threads_; ++i){ + pool_.emplace_back([this] { + while (!stop_) { + Task task; + { + std::unique_lock lc{ mutex_ }; + cv_.wait(lc, [this] {return stop_ || !tasks_.empty(); }); + if (tasks_.empty()) + return; + task = std::move(tasks_.front()); + tasks_.pop(); + } + task(); + } + }); + } + } + +private: + std::mutex mutex_; + std::condition_variable cv_; + std::atomic stop_ ; + std::atomic num_threads_; + std::queue tasks_; + std::vector pool_; +}; +``` From bd6868f4502d5ea7e24153f7463f1fe56db8f381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Wed, 31 Jul 2024 00:39:14 +0800 Subject: [PATCH 32/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=BA=BF=E7=A8=8B=E6=B1=A0=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E7=9A=84=E5=86=85=E5=AE=B9=E4=B8=8E=E8=A7=A3=E9=87=8A=20#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\272\277\347\250\213\346\261\240.md" | 134 +++++++++++++++--- 1 file changed, 113 insertions(+), 21 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index f9b6003b..2a12ac58 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -119,7 +119,7 @@ int main() { - 线程池中的线程会从任务队列中取出任务并执行,任务执行完毕后,线程继续取下一个任务或者休眠。 -- 调用 join 方法等待所有任务执行完毕并关闭线程池(`thread_pool` 析构同样会调用它,非必要)。 +- 调用 join 方法等待所有任务执行完毕并关闭线程池。 如果我们不自己指明线程池的线程数量,那么 Asio 会根据函数 [`default_thread_pool_size`](https://github.com/boostorg/asio/blob/44238d033e1503c694782925d647811380a067c2/include/boost/asio/impl/thread_pool.ipp#L53-L58) 计算并返回一个**线程池的默认线程数量**。它根据系统的硬件并发能力来决定使用的线程数,通常是硬件并发能力的两倍。 @@ -151,12 +151,26 @@ thread_pool::~thread_pool() } ``` -- `stop` :修改内部的标志位存在使得线程池能够识别何时需要停止接收新的任务,然后唤醒所有线程。 +- `stop` :修改内部的标志位存在使得线程池能够识别何时需要停止接收新的任务,以及关闭还没开始执行的任务,然后唤醒所有线程。 - `join()` :等待所有线程完成它们的工作,确保所有线程都已终止。 - `shutdown()` :进行最终的清理,释放资源,确保线程池的完全清理和资源的正确释放 > 此处可阅读部分源码,帮助理解与记忆 +析构函数先调用了 `stop()` ,然后再进行 `join()` 。那如果我们没有提前显式调用 `join()` 成员函数,**可能导致一些任务没有执行,析构函数并不会等待所有任务执行完毕**: + +```cpp +boost::asio::thread_pool pool{ 4 }; + +for (int i = 0; i < 10; ++i) { + boost::asio::post(pool, [i]() { print_task(i); }); +} +``` + +> [运行](https://godbolt.org/z/haPqKb1h7)测试。 + +因为析构函数并不是堵塞执行完所有任务,而是先**停止**,再 `join()` 以及 `shutdown()`。 + `Boost.Asio` 提供的线程池使用十分简单,接口高度封装,几乎无需关心底层具体实现,易于使用。 我们的操作几乎只需创建线程池对象、将任务加入线程池、在需要时调用 `join()`。 @@ -257,7 +271,7 @@ threadPool->start([=]{ ## 实现线程池 -实现一个普通的能够满足日常开发需求的线程池实际上非常简单,也只需要一百多行代码。 +实现一个普通的能够满足日常开发需求的线程池实际上非常简单,只需要不到一百行代码。 > - “*普通的能够满足日常开发需*求的” > @@ -315,14 +329,30 @@ public: : stop_{ false }, num_threads_{ num_thread } { start(); } - ~ThreadPool(){ + + ~ThreadPool() { stop(); + join(); + } + + void stop() { + stop_.store(true); + cv_.notify_all(); + } + + void join() { + for (auto& thread : pool_) { + if (thread.joinable()) { + thread.join(); + } + } + pool_.clear(); } template - std::future, std::decay_t...>> submit(F&& f, Args&&...args){ + std::future, std::decay_t...>> submit(F&& f, Args&&...args) { using RetType = std::invoke_result_t, std::decay_t...>; - if (stop_.load()){ + if (stop_.load()) { throw std::runtime_error("ThreadPool is stopped"); } @@ -338,41 +368,103 @@ public: return ret; } - void stop(){ - stop_.store(true); - cv_.notify_all(); - for (auto& thread : pool_){ - if (thread.joinable()) { - thread.join(); - } - } - } - - void start(){ - for (std::size_t i = 0; i < num_threads_; ++i){ + void start() { + for (std::size_t i = 0; i < num_threads_; ++i) { pool_.emplace_back([this] { while (!stop_) { Task task; { std::unique_lock lc{ mutex_ }; - cv_.wait(lc, [this] {return stop_ || !tasks_.empty(); }); if (tasks_.empty()) return; + cv_.wait(lc, [this] {return stop_ || !tasks_.empty(); }); task = std::move(tasks_.front()); tasks_.pop(); } task(); } - }); + }); } } private: std::mutex mutex_; std::condition_variable cv_; - std::atomic stop_ ; + std::atomic stop_; std::atomic num_threads_; std::queue tasks_; std::vector pool_; }; ``` + +**标头依赖**: + +```cpp +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +``` + +**测试 demo**: + +```cpp +void print_task(int n) { + std::osyncstream{ std::cout } << "Task " << n << " is running." << std::endl; +} +void print_task2(int n) { + std::osyncstream{ std::cout } << "🐢🐢🐢 " << n << " 🐉🐉🐉" << std::endl; +} + +int main() { + ThreadPool pool{ 4 }; // 创建一个有 4 个线程的线程池 + + for (int i = 0; i < 10; ++i) { + pool.submit(print_task, i); + } + pool.join(); // 确保执行完所有任务 + + std::puts("---------------------"); + + pool.start(); // 重新启动线程池 + + for (int i = 0; i < 10; ++i) { + pool.submit(print_task2, i); + } + pool.join(); // 确保执行完所有任务 +} // 析构自动 stop() join() +``` + +**可能的[运行结果](https://godbolt.org/z/rM6vz1s9v)**: + +```shell +Task 1 is running. +Task 2 is running. +Task 0 is running. +Task 3 is running. +Task 4 is running. +Task 5 is running. +Task 6 is running. +Task 7 is running. +Task 8 is running. +Task 9 is running. +--------------------- +🐢🐢🐢 0 🐉🐉🐉 +🐢🐢🐢 2 🐉🐉🐉 +🐢🐢🐢 1 🐉🐉🐉 +🐢🐢🐢 5 🐉🐉🐉 +🐢🐢🐢 7 🐉🐉🐉 +🐢🐢🐢 3 🐉🐉🐉 +🐢🐢🐢 4 🐉🐉🐉 +🐢🐢🐢 6 🐉🐉🐉 +🐢🐢🐢 8 🐉🐉🐉 +🐢🐢🐢 9 🐉🐉🐉 +``` + +如果不自己显式调用 `join()` ,而是等待线程池析构调用,那么效果如同 `asio::thread_pool`,会先进行 `stop`,导致一些任务不执行。 From 601d70b8fda08379518113d2169501de0891946c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Wed, 31 Jul 2024 18:28:42 +0800 Subject: [PATCH 33/62] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0=E7=9A=84=E5=86=85=E5=AE=B9=E6=8F=8F=E8=BF=B0=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=90=E4=BE=9B=E7=9A=84=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=EF=BC=8C=E8=B0=83=E6=95=B4=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?=E3=80=82=E4=BF=AE=E6=94=B9=E6=B5=8B=E8=AF=95=E7=9A=84=20demo?= =?UTF-8?q?=EF=BC=8C=E4=B8=BA=E7=BA=BF=E7=A8=8B=E6=B1=A0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E6=8F=8F=E8=BF=B0=E8=A7=A3=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\272\277\347\250\213\346\261\240.md" | 104 +++++++++++------- 1 file changed, 65 insertions(+), 39 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index 2a12ac58..dcae2317 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -104,14 +104,14 @@ int main() { boost::asio::thread_pool pool{4}; // 创建一个包含 4 个线程的线程池 for (int i = 0; i < 10; ++i) { - boost::asio::post(pool, [i]() { print_task(i); }); + boost::asio::post(pool, [i] { print_task(i); }); } pool.join(); // 等待所有任务执行完成 } ``` -> [运行](https://godbolt.org/z/h5G5hTT4a)测试。 +> [运行](https://godbolt.org/z/Pa3z1oYej)测试。 - 创建线程池时,指定线程数量,线程池会创建对应数量的线程。 @@ -297,7 +297,7 @@ class ThreadPool { - 用于线程间的同步,允许线程等待特定条件(如新任务加入队列)并在条件满足时唤醒线程。 3. **`std::atomic stop_`** - - 用于指示线程池是否停止接收新任务,并安全地通知所有工作线程退出。 + - 指示线程池是否停止。 4. **`std::atomic num_threads_`** - 表示线程池中的线程数量。 @@ -309,7 +309,22 @@ class ThreadPool { - 线程容器,存储管理线程对象,每个线程从任务队列中获取任务并执行。 -那么再直接提供构造函数以及添加任务到线程池的接口,然后内部再进行一点小小的操作,也就完成了: +**标头依赖**: + +```cpp +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +``` + +提供构造析构函数,以及一些外部接口:`submit()`、`start()`、`stop()`、`join()`,也就完成了: ```cpp inline std::size_t default_thread_pool_size()noexcept { @@ -330,7 +345,7 @@ public: start(); } - ~ThreadPool() { + ~ThreadPool(){ stop(); join(); } @@ -340,7 +355,7 @@ public: cv_.notify_all(); } - void join() { + void join(){ for (auto& thread : pool_) { if (thread.joinable()) { thread.join(); @@ -368,8 +383,8 @@ public: return ret; } - void start() { - for (std::size_t i = 0; i < num_threads_; ++i) { + void start(){ + for (std::size_t i = 0; i < num_threads_; ++i){ pool_.emplace_back([this] { while (!stop_) { Task task; @@ -383,7 +398,7 @@ public: } task(); } - }); + }); } } @@ -397,74 +412,85 @@ private: }; ``` -**标头依赖**: - -```cpp -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -``` - **测试 demo**: ```cpp -void print_task(int n) { +int print_task(int n) { std::osyncstream{ std::cout } << "Task " << n << " is running." << std::endl; + return n; } -void print_task2(int n) { +int print_task2(int n) { std::osyncstream{ std::cout } << "🐢🐢🐢 " << n << " 🐉🐉🐉" << std::endl; + return n; } int main() { ThreadPool pool{ 4 }; // 创建一个有 4 个线程的线程池 + std::vector> futures; // future 集合,获取返回值 for (int i = 0; i < 10; ++i) { - pool.submit(print_task, i); + futures.emplace_back(pool.submit(print_task, i)); } - pool.join(); // 确保执行完所有任务 + pool.join(); std::puts("---------------------"); - pool.start(); // 重新启动线程池 + pool.start(); for (int i = 0; i < 10; ++i) { - pool.submit(print_task2, i); + futures.emplace_back(pool.submit(print_task2, i)); } - pool.join(); // 确保执行完所有任务 + pool.join(); + + int sum = 0; + for(auto& future : futures){ + sum += future.get(); + } + std::cout << "sum: " << sum << '\n'; } // 析构自动 stop() join() ``` -**可能的[运行结果](https://godbolt.org/z/rM6vz1s9v)**: +**可能的[运行结果](https://godbolt.org/z/YT4ahh1Wz)**: ```shell -Task 1 is running. -Task 2 is running. Task 0 is running. -Task 3 is running. Task 4 is running. Task 5 is running. Task 6 is running. Task 7 is running. Task 8 is running. Task 9 is running. +Task 2 is running. +Task 3 is running. +Task 1 is running. --------------------- 🐢🐢🐢 0 🐉🐉🐉 -🐢🐢🐢 2 🐉🐉🐉 🐢🐢🐢 1 🐉🐉🐉 +🐢🐢🐢 2 🐉🐉🐉 🐢🐢🐢 5 🐉🐉🐉 -🐢🐢🐢 7 🐉🐉🐉 -🐢🐢🐢 3 🐉🐉🐉 🐢🐢🐢 4 🐉🐉🐉 +🐢🐢🐢 3 🐉🐉🐉 🐢🐢🐢 6 🐉🐉🐉 +🐢🐢🐢 7 🐉🐉🐉 🐢🐢🐢 8 🐉🐉🐉 🐢🐢🐢 9 🐉🐉🐉 +sum: 90 ``` -如果不自己显式调用 `join()` ,而是等待线程池析构调用,那么效果如同 `asio::thread_pool`,会先进行 `stop`,导致一些任务不执行。 +> 如果不自己显式调用 `join()` ,而是等待线程池对象调用析构函数,那么效果如同 `asio::thread_pool`,会先进行 `stop`,导致一些任务不执行。 + + **构造函数和析构函数:** + +- **构造函数**:初始化线程池并**启动线程**。 + +- **析构函数**:停止线程池并等待所有线程结束。 + +**外部接口:** + +- **`stop()`**:停止线程池,通知所有线程退出(不会等待所有任务执行完毕)。 + +- **`join()`**:等待所有线程完成任务。 + +- **`submit()`**:将任务提交到任务队列,并返回一个`std::future`对象用于获取任务结果。 + +- **`start()`**:启动线程池,创建并启动指定数量的线程。 From 848b3a898b9a1baa3264beb43c7bcbd6b6af0227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Wed, 31 Jul 2024 21:57:54 +0800 Subject: [PATCH 34/62] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=B1=A0=E7=9A=84=E6=89=80=E6=9C=89=E5=86=85?= =?UTF-8?q?=E5=AE=B9=20#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- homework/README.md | 13 ++++++++++++ ...04\347\272\277\347\250\213\346\261\240.md" | 21 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 homework/README.md diff --git a/homework/README.md b/homework/README.md new file mode 100644 index 00000000..8726a92e --- /dev/null +++ b/homework/README.md @@ -0,0 +1,13 @@ +# 此处存放作业 + +- **文件名**:`id` + 日期数字。 + + `id` :随意。 + + 日期数字:`8` 位数字,例如现在是 2024 年 7 月 31 日,那么日期数字则为:`20240731` + +- **后缀名**:根据作业情况,随意。如果是普通代码,自然是 `.cpp` 后缀。 + +--- + +1. 线程池作业存放在 [thread_pool](./thread_pool) 文件夹中。 diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index dcae2317..0b25fe4d 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -1,3 +1,5 @@ +[TOC] + # 线程池 ## 前言 @@ -494,3 +496,22 @@ sum: 90 - **`submit()`**:将任务提交到任务队列,并返回一个`std::future`对象用于获取任务结果。 - **`start()`**:启动线程池,创建并启动指定数量的线程。 + +--- + +当然,你可能还希望我们的线程池具备更多功能或改进,比如控制任务优先级、设置最大线程数量、返回当前活跃线程数等。此外,异常处理也是一个值得考虑的方面。 + +有些功能实现起来非常简单,而有些则需要更多的思考和设计。不过,这些优化超出了本次讲解的范围。如果有兴趣,可以尝试自行优化我们提供的线程池实现。我们给出的线程池实现简单完善且直观,用来学习再好不过。 + +## 总结 + +在本章中我们详细的介绍了: + +- 线程池的基本概念。 + +- 市面上常见的线程池的设计与使用, `boost::asio::thread_pool`、`QThreadPool`。 +- 实现一个简易的线程池。 + +总体而言,内容并不构成太大的难度。 + +**课后作业:**自己实现一个线程池,可以参考我们给出的线程池实现增加功能,提交到 `homework` 文件夹中。 From 5300319b226cd484c42d1e4cd41e105a2e405014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Wed, 31 Jul 2024 22:01:39 +0800 Subject: [PATCH 35/62] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=20TOC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../04\347\272\277\347\250\213\346\261\240.md" | 2 -- 1 file changed, 2 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index 0b25fe4d..d2759539 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -1,5 +1,3 @@ -[TOC] - # 线程池 ## 前言 From 927d5c25b0679391929d5e0a3f8df16a1882ce16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Wed, 31 Jul 2024 22:02:47 +0800 Subject: [PATCH 36/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20markdown=20=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../04\347\272\277\347\250\213\346\261\240.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index d2759539..9a66f839 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -512,4 +512,4 @@ sum: 90 总体而言,内容并不构成太大的难度。 -**课后作业:**自己实现一个线程池,可以参考我们给出的线程池实现增加功能,提交到 `homework` 文件夹中。 +**课后作业**:自己实现一个线程池,可以参考我们给出的线程池实现增加功能,提交到 `homework` 文件夹中。 From 6eb34a07c1557bc368eb4e8f012cbc9b9498f394 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Wed, 31 Jul 2024 22:04:05 +0800 Subject: [PATCH 37/62] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=8D=A0=E4=BD=8D?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- homework/thread_pool/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 homework/thread_pool/.gitkeep diff --git a/homework/thread_pool/.gitkeep b/homework/thread_pool/.gitkeep new file mode 100644 index 00000000..e69de29b From 3078c28547002d3084f11f17abb8b824c5682143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Thu, 1 Aug 2024 18:19:21 +0800 Subject: [PATCH 38/62] =?UTF-8?q?1.=20=E4=BF=AE=E6=94=B9=E7=94=A8=E8=AF=8D?= =?UTF-8?q?=E2=80=9C=E5=A0=B5=E5=A1=9E=E2=80=9D->"=E9=98=BB=E5=A1=9E"?= =?UTF-8?q?=E3=80=82=202.=20=E7=A8=8D=E5=BE=AE=E4=BF=AE=E6=94=B9=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E6=B1=A0=E4=B8=80=E7=AB=A0=E4=B8=AD=E7=9A=84=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=8F=8F=E8=BF=B0=E3=80=82#12=203.=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=8D=90=E8=B5=A0=E9=A1=B5=E9=9D=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- ...344\275\277\347\224\250\347\272\277\347\250\213.md" | 6 +++--- ...345\220\214\346\255\245\346\223\215\344\275\234.md" | 8 ++++---- .../04\347\272\277\347\250\213\346\261\240.md" | 10 +++++----- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 76ce16b4..7e926e45 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@

-![猫猫虫](/image/猫猫虫旋转.jpg) +![猫猫虫](./image/猫猫虫旋转.jpg) 如果你觉得本仓库对你有所帮助,可以通过支付宝赞助白老师,激励白老师有更多的精力和信心维护本仓库。 @@ -37,4 +37,4 @@ > [!TIP] > 每一位开发者赞助 `30`,白老师一天的食品安全就有了着落。 -![赞助](/image/赞助.jpg) +cpp diff --git "a/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" "b/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" index 3abff876..898b388f 100644 --- "a/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" +++ "b/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" @@ -36,7 +36,7 @@ int main(){ `std::thread t{ hello };` 创建了一个线程对象 `t`,将 `hello` 作为它的[可调用(Callable)](https://zh.cppreference.com/w/cpp/named_req/Callable)对象,在新线程中执行。线程对象关联了一个线程资源,我们无需手动控制,在线程对象构造成功,就自动在新线程开始执行函数 `hello`。 -`t.join();` 等待线程对象 `t` 关联的线程执行完毕,否则将一直堵塞。这里的调用是必须的,否则 `std::thread` 的析构函数将调用 [`std::terminate()`](https://zh.cppreference.com/w/cpp/error/terminate) 无法正确析构。 +`t.join();` 等待线程对象 `t` 关联的线程执行完毕,否则将一直阻塞。这里的调用是必须的,否则 `std::thread` 的析构函数将调用 [`std::terminate()`](https://zh.cppreference.com/w/cpp/error/terminate) 无法正确析构。 这是因为我们创建线程对象 `t` 的时候就关联了一个活跃的线程,调用 `join()` 就是确保线程对象关联的线程已经执行完毕,然后会修改对象的状态,让 [`std::thread::joinable()`](https://zh.cppreference.com/w/cpp/thread/thread/joinable) 返回 `false`,表示线程对象目前没有关联活跃线程。`std::thread` 的析构函数,正是通过 `joinable()` 判断线程对象目前是否有关联活跃线程,如果为 `true`,那么就当做有关联活跃线程,会调用 `std::terminate()`。 @@ -291,7 +291,7 @@ my_thread.join(); 认为这样可以确保被分离的线程在这里阻塞执行完? -我们前面聊的很清楚了,detach() 是线程分离,**线程对象放弃了线程资源的所有权**,此时我们的 my_thread 它现在根本没有关联任何线程。调用 join() 是:“阻塞当前线程直至 *this 所标识的线程结束其执行”,我们的**线程对象都没有线程,堵塞什么?执行什么呢?** +我们前面聊的很清楚了,detach() 是线程分离,**线程对象放弃了线程资源的所有权**,此时我们的 my_thread 它现在根本没有关联任何线程。调用 join() 是:“阻塞当前线程直至 *this 所标识的线程结束其执行”,我们的**线程对象都没有线程,阻塞什么?执行什么呢?** 简单点说,必须是 std::thread 的 joinable() 为 true 即线程对象有活跃线程,才能调用 join() 和 detach()。 @@ -691,7 +691,7 @@ int main() { } ``` -这段代码通过**移动构造**转移了线程对象 `t` 的线程资源所有权到 `t2`,这里虽然有两个 `std::thread` 对象,但是从始至终只有一个线程资源,让持有线程资源的 `t2` 对象最后调用 `join()` 堵塞让其线程执行完毕。`t` 与 `t2` 都能正常析构。 +这段代码通过**移动构造**转移了线程对象 `t` 的线程资源所有权到 `t2`,这里虽然有两个 `std::thread` 对象,但是从始至终只有一个线程资源,让持有线程资源的 `t2` 对象最后调用 `join()` 阻塞让其线程执行完毕。`t` 与 `t2` 都能正常析构。 我们还可以使用移动赋值来转移线程资源的所有权: diff --git "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" index 08f2bd1c..240529c1 100644 --- "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" +++ "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" @@ -446,14 +446,14 @@ int main(){ 其实到此基本就差不多了,我们再介绍两个常见问题即可: -1. 如果从 `std::async` 获得的 [std::future](https://zh.cppreference.com/w/cpp/thread/future) 没有被移动或绑定到引用,那么在完整表达式结尾, [std::future](https://zh.cppreference.com/w/cpp/thread/future) 的**析构函数将阻塞到异步计算完成**。因为临时对象的生存期就在这一行,调用析构函数阻塞执行。 +1. 如果从 `std::async` 获得的 [`std::future`](https://zh.cppreference.com/w/cpp/thread/future) 没有被移动或绑定到引用,那么在完整表达式结尾, `std::future` 的**[析构函数](https://zh.cppreference.com/w/cpp/thread/future/%7Efuture)将阻塞,直到到异步任务完成**。因为临时对象的生存期就在这一行,而对象生存期结束就会调用调用析构函数。 ```cpp std::async(std::launch::async, []{ f(); }); // 临时量的析构函数等待 f() std::async(std::launch::async, []{ g(); }); // f() 完成前不开始 ``` - 如你所见,这并不能创建异步任务,会堵塞,然后逐个执行。 + 如你所见,这并不能创建异步任务,它会阻塞,然后逐个执行。 2. 被移动的 `std::future` 没有所有权,失去共享状态,不能调用 `get`、`wait` 成员函数。 @@ -489,7 +489,7 @@ std::packaged_task task([](int a, int b){ }); std::futurefuture = task.get_future(); task(10, 2); // 此处执行任务 -std::cout << future.get() << '\n'; // 不堵塞,此处获取返回值 +std::cout << future.get() << '\n'; // 不阻塞,此处获取返回值 ``` > [运行](https://godbolt.org/z/799Khvadc)测试。 @@ -505,7 +505,7 @@ std::thread t{ std::move(task),10,2 }; // 任务在线程中执行 // todo.. 幻想还有许多耗时的代码 t.join(); -std::cout << future.get() << '\n'; // 并不堵塞,获取任务返回值罢了 +std::cout << future.get() << '\n'; // 并不阻塞,获取任务返回值罢了 ``` > [运行](https://godbolt.org/z/85r9db49z)测试。 diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index 9a66f839..4fe0805a 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -72,7 +72,7 @@ graph TD --- -了解以上这些基础概念是第一步也是最后一步,随着水平的提升,对这些概念认知与理解也会逐渐提升。 +了解以上这些基础概念是第一步也是最后一步,随着水平的提升,对这些概念的理解也会逐渐提升。 ## 市面上常见的线程池 @@ -169,7 +169,7 @@ for (int i = 0; i < 10; ++i) { > [运行](https://godbolt.org/z/haPqKb1h7)测试。 -因为析构函数并不是堵塞执行完所有任务,而是先**停止**,再 `join()` 以及 `shutdown()`。 +因为析构函数并不是阻塞直到执行完所有任务,而是先**停止**,再 `join()` 以及 `shutdown()`。 `Boost.Asio` 提供的线程池使用十分简单,接口高度封装,几乎无需关心底层具体实现,易于使用。 @@ -450,7 +450,7 @@ int main() { } // 析构自动 stop() join() ``` -**可能的[运行结果](https://godbolt.org/z/YT4ahh1Wz)**: +**可能的[运行结果](https://godbolt.org/z/3rbExqbb7)**: ```shell Task 0 is running. @@ -495,11 +495,11 @@ sum: 90 - **`start()`**:启动线程池,创建并启动指定数量的线程。 ---- +我们并没有提供一个功能强大的所谓的“***调度器***”,我们只是利用条件变量和互斥量,让操作系统自行调度而已,它并不具备设置任务优先级之类的调度功能。 当然,你可能还希望我们的线程池具备更多功能或改进,比如控制任务优先级、设置最大线程数量、返回当前活跃线程数等。此外,异常处理也是一个值得考虑的方面。 -有些功能实现起来非常简单,而有些则需要更多的思考和设计。不过,这些优化超出了本次讲解的范围。如果有兴趣,可以尝试自行优化我们提供的线程池实现。我们给出的线程池实现简单完善且直观,用来学习再好不过。 +有些功能实现起来非常简单,而有些则需要更多的思考和设计。不过,这些功能超出了本次讲解的范围。如果有兴趣,可以尝试自行优化我们提供的线程池实现,添加更多的功能。我们给出的线程池实现简单完善且直观,用来学习再好不过。 ## 总结 From f2d31f4dcb3886d0a4e7ca312ab120c93d2d5bb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Fri, 2 Aug 2024 16:50:11 +0800 Subject: [PATCH 39/62] =?UTF-8?q?1.=20=E4=BF=AE=E6=94=B9=E8=B5=9E=E5=8A=A9?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=202.=20=E4=B8=BA=E7=AC=AC=E4=BA=94=E7=AB=A0?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=86=85=E5=AE=B9=E5=8A=A0=E7=B2=97=203.=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BA=BF=E7=A8=8B=E6=B1=A0=E5=86=85=E5=AE=B9?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=9B=B4=E5=A4=9A=E7=9A=84=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E4=B8=8E=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- ...37\345\255\220\346\223\215\344\275\234.md" | 2 +- ...04\347\272\277\347\250\213\346\261\240.md" | 34 ++++++++++++++++--- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 7e926e45..02ddaf23 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ 不管是否购买课程,任何组织和个人遵守 [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh-hans) 协议均可随意使用学习。 -[捐赠](/image/捐赠)、[issues](https://github.com/Mq-b/ModernCpp-ConcurrentProgramming-Tutorial/issues)、[pr](https://github.com/Mq-b/ModernCpp-ConcurrentProgramming-Tutorial/pulls) 均会在致谢列表中**铭记您的贡献**。 +[捐赠](https://github.com/Mq-b/ModernCpp-ConcurrentProgramming-Tutorial/tree/main/image/%E6%8D%90%E8%B5%A0)、[issues](https://github.com/Mq-b/ModernCpp-ConcurrentProgramming-Tutorial/issues)、[pr](https://github.com/Mq-b/ModernCpp-ConcurrentProgramming-Tutorial/pulls) 均会在致谢列表中**铭记您的贡献**。
diff --git "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" index b3b4cdb5..2bef22c2 100644 --- "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" +++ "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" @@ -666,7 +666,7 @@ void wake_up(){ 你们可能还有疑问:“**单线程能不能指令重排**?” -CPU 的指令重排必须遵循一定的规则,以确保程序的可观察副作用不受影响。对于单线程程序,CPU 会保证外部行为的一致性。对于多线程程序,需要开发者使用同步原语来显式地控制内存操作的顺序和可见性,确保多线程环境下的正确性。而标准库中提供的原子对象的原子操作,还可以设置内存次序。 +CPU 的指令重排必须遵循一定的规则,以确保程序的**可观察副作用**不受影响。对于单线程程序,CPU 会保证外部行为的一致性。对于多线程程序,需要开发者使用同步原语来显式地控制内存操作的顺序和可见性,确保多线程环境下的正确性。而标准库中提供的原子对象的原子操作,还可以设置内存次序。 那有没有可能: diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index 4fe0805a..d8acd98b 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -425,22 +425,22 @@ int print_task2(int n) { } int main() { - ThreadPool pool{ 4 }; // 创建一个有 4 个线程的线程池 + ThreadPool pool{ 4 }; // 创建一个有 4 个线程的线程池 构造函数自动启动线程池 std::vector> futures; // future 集合,获取返回值 for (int i = 0; i < 10; ++i) { futures.emplace_back(pool.submit(print_task, i)); } - pool.join(); + pool.join(); // 阻塞,让任务全部执行完毕 std::puts("---------------------"); - pool.start(); + pool.start(); // 重新启动线程池 for (int i = 0; i < 10; ++i) { futures.emplace_back(pool.submit(print_task2, i)); } - pool.join(); + pool.join(); // 阻塞,让任务全部执行完毕 int sum = 0; for(auto& future : futures){ @@ -477,7 +477,31 @@ Task 1 is running. sum: 90 ``` -> 如果不自己显式调用 `join()` ,而是等待线程池对象调用析构函数,那么效果如同 `asio::thread_pool`,会先进行 `stop`,导致一些任务不执行。 +> 如果不自己显式调用 `join()` ,而是等待线程池对象调用析构函数,那么效果如同 `asio::thread_pool`,会先进行 `stop`,导致一些任务无法执行。 + +它支持**任意可调用类型**,当然也包括非静态成员函数。我们使用了 [`std::decay_t`](https://zh.cppreference.com/w/cpp/types/decay),所以参数的传递其实是**按值复制**,而不是引用传递,这一点和大部分库的设计一致。示例如下: + +```cpp +struct X{ + void f(const int& n)const{ + std::cout << &n << '\n'; + } +}; + +X x; +int n = 6; +std::cout << &n << '\n'; +pool.start(); +pool.submit(&X::f, &x, n); // 默认复制,地址不同 +pool.submit(&X::f, &x, std::ref(n)); +pool.join(); +``` + +> [运行](https://godbolt.org/z/vTc7M8Kov)测试。 + +我们的线程池的 `submit` 成员函数在传递参数的行为上,与先前介绍的 `std::thread` 和 `std::async` 等设施基本一致。 + +我们稍微介绍线程池的接口: **构造函数和析构函数:** From 0b7e481701877b4d0e65469883d732412141a03c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sat, 3 Aug 2024 18:56:40 +0800 Subject: [PATCH 40/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=B1=A0=E7=9A=84=E5=86=85=E5=AE=B9=20#12=20?= =?UTF-8?q?1.=20fix=20=E7=BA=BF=E7=A8=8B=E6=B1=A0=E7=9A=84=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E4=B8=AD=E5=AD=98=E5=9C=A8=E9=94=99=E8=AF=AF=20#24=20?= =?UTF-8?q?2.=20=E4=BF=AE=E6=94=B9=E7=A4=BA=E4=BE=8B=E7=9A=84=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E8=BE=93=E5=87=BA=EF=BC=8C=E5=A2=9E=E5=8A=A0=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=20id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\272\277\347\250\213\346\261\240.md" | 112 ++++++++---------- 1 file changed, 48 insertions(+), 64 deletions(-) diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" index d8acd98b..89aea9b2 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/04\347\272\277\347\250\213\346\261\240.md" @@ -96,12 +96,16 @@ graph TD #include #include +std::mutex m; + void print_task(int n) { - std::cout << "Task " << n << " is running." << std::endl; + std::lock_guard lc{ m }; + std::cout << "Task " << n << " is running on thr: " << + std::this_thread::get_id() << '\n'; } int main() { - boost::asio::thread_pool pool{4}; // 创建一个包含 4 个线程的线程池 + boost::asio::thread_pool pool{ 4 }; // 创建一个包含 4 个线程的线程池 for (int i = 0; i < 10; ++i) { boost::asio::post(pool, [i] { print_task(i); }); @@ -111,7 +115,7 @@ int main() { } ``` -> [运行](https://godbolt.org/z/Pa3z1oYej)测试。 +> [运行](https://godbolt.org/z/41445Kab5)测试。 - 创建线程池时,指定线程数量,线程池会创建对应数量的线程。 @@ -163,11 +167,11 @@ thread_pool::~thread_pool() boost::asio::thread_pool pool{ 4 }; for (int i = 0; i < 10; ++i) { - boost::asio::post(pool, [i]() { print_task(i); }); + boost::asio::post(pool, [i] { print_task(i); }); } ``` -> [运行](https://godbolt.org/z/haPqKb1h7)测试。 +> [运行](https://godbolt.org/z/MPoxrY9Yo)测试。 因为析构函数并不是阻塞直到执行完所有任务,而是先**停止**,再 `join()` 以及 `shutdown()`。 @@ -345,17 +349,13 @@ public: start(); } - ~ThreadPool(){ + ~ThreadPool() { stop(); - join(); } void stop() { stop_.store(true); cv_.notify_all(); - } - - void join(){ for (auto& thread : pool_) { if (thread.joinable()) { thread.join(); @@ -383,16 +383,16 @@ public: return ret; } - void start(){ - for (std::size_t i = 0; i < num_threads_; ++i){ + void start() { + for (std::size_t i = 0; i < num_threads_; ++i) { pool_.emplace_back([this] { while (!stop_) { Task task; { std::unique_lock lc{ mutex_ }; + cv_.wait(lc, [this] {return stop_ || !tasks_.empty(); }); if (tasks_.empty()) return; - cv_.wait(lc, [this] {return stop_ || !tasks_.empty(); }); task = std::move(tasks_.front()); tasks_.pop(); } @@ -415,89 +415,77 @@ private: **测试 demo**: ```cpp -int print_task(int n) { - std::osyncstream{ std::cout } << "Task " << n << " is running." << std::endl; - return n; -} -int print_task2(int n) { - std::osyncstream{ std::cout } << "🐢🐢🐢 " << n << " 🐉🐉🐉" << std::endl; - return n; -} - int main() { - ThreadPool pool{ 4 }; // 创建一个有 4 个线程的线程池 构造函数自动启动线程池 + ThreadPool pool{ 4 }; // 创建一个有 4 个线程的线程池 std::vector> futures; // future 集合,获取返回值 for (int i = 0; i < 10; ++i) { futures.emplace_back(pool.submit(print_task, i)); } - pool.join(); // 阻塞,让任务全部执行完毕 - - std::puts("---------------------"); - - pool.start(); // 重新启动线程池 for (int i = 0; i < 10; ++i) { futures.emplace_back(pool.submit(print_task2, i)); } - pool.join(); // 阻塞,让任务全部执行完毕 int sum = 0; - for(auto& future : futures){ - sum += future.get(); + for (auto& future : futures) { + sum += future.get(); // get() 成员函数 阻塞到任务执行完毕,获取返回值 } std::cout << "sum: " << sum << '\n'; -} // 析构自动 stop() join() +} // 析构自动 stop() ``` -**可能的[运行结果](https://godbolt.org/z/3rbExqbb7)**: +**可能的[运行结果](https://godbolt.org/z/n7Tana59x)**: ```shell -Task 0 is running. -Task 4 is running. -Task 5 is running. -Task 6 is running. -Task 7 is running. -Task 8 is running. -Task 9 is running. -Task 2 is running. -Task 3 is running. -Task 1 is running. ---------------------- -🐢🐢🐢 0 🐉🐉🐉 +Task 0 is running on thr: 6900 +Task 1 is running on thr: 36304 +Task 5 is running on thr: 36304 +Task 3 is running on thr: 6900 +Task 7 is running on thr: 6900 +Task 2 is running on thr: 29376 +Task 6 is running on thr: 36304 +Task 4 is running on thr: 31416 🐢🐢🐢 1 🐉🐉🐉 +Task 9 is running on thr: 29376 +🐢🐢🐢 0 🐉🐉🐉 +Task 8 is running on thr: 6900 🐢🐢🐢 2 🐉🐉🐉 -🐢🐢🐢 5 🐉🐉🐉 +🐢🐢🐢 6 🐉🐉🐉 🐢🐢🐢 4 🐉🐉🐉 +🐢🐢🐢 5 🐉🐉🐉 🐢🐢🐢 3 🐉🐉🐉 -🐢🐢🐢 6 🐉🐉🐉 🐢🐢🐢 7 🐉🐉🐉 🐢🐢🐢 8 🐉🐉🐉 🐢🐢🐢 9 🐉🐉🐉 sum: 90 ``` -> 如果不自己显式调用 `join()` ,而是等待线程池对象调用析构函数,那么效果如同 `asio::thread_pool`,会先进行 `stop`,导致一些任务无法执行。 +> 如果等待线程池对象调用析构函数,那么效果如同 `asio::thread_pool`,会先进行 `stop`,这可能导致一些任务无法执行。不过我们在最后**循环遍历了 `futures`**,调用 `get()` 成员函数,不存在这个问题。 它支持**任意可调用类型**,当然也包括非静态成员函数。我们使用了 [`std::decay_t`](https://zh.cppreference.com/w/cpp/types/decay),所以参数的传递其实是**按值复制**,而不是引用传递,这一点和大部分库的设计一致。示例如下: ```cpp -struct X{ - void f(const int& n)const{ - std::cout << &n << '\n'; +struct X { + void f(const int& n) const { + std::osyncstream{ std::cout } << &n << '\n'; } }; -X x; -int n = 6; -std::cout << &n << '\n'; -pool.start(); -pool.submit(&X::f, &x, n); // 默认复制,地址不同 -pool.submit(&X::f, &x, std::ref(n)); -pool.join(); +int main() { + ThreadPool pool{ 4 }; // 创建一个有 4 个线程的线程池 + + X x; + int n = 6; + std::cout << &n << '\n'; + auto t = pool.submit(&X::f, &x, n); // 默认复制,地址不同 + auto t2 = pool.submit(&X::f, &x, std::ref(n)); + t.wait(); + t2.wait(); +} // 析构自动 stop() ``` -> [运行](https://godbolt.org/z/vTc7M8Kov)测试。 +> [运行](https://godbolt.org/z/vY458T44e)测试。 我们的线程池的 `submit` 成员函数在传递参数的行为上,与先前介绍的 `std::thread` 和 `std::async` 等设施基本一致。 @@ -512,11 +500,7 @@ pool.join(); **外部接口:** - **`stop()`**:停止线程池,通知所有线程退出(不会等待所有任务执行完毕)。 - -- **`join()`**:等待所有线程完成任务。 - -- **`submit()`**:将任务提交到任务队列,并返回一个`std::future`对象用于获取任务结果。 - +- **`submit()`**:将任务提交到任务队列,并返回一个`std::future`对象用于获取任务结果以及确保任务执行完毕。 - **`start()`**:启动线程池,创建并启动指定数量的线程。 我们并没有提供一个功能强大的所谓的“***调度器***”,我们只是利用条件变量和互斥量,让操作系统自行调度而已,它并不具备设置任务优先级之类的调度功能。 From 8743775ea8dfeaa51628e6437bd5909a36c3ba38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sun, 4 Aug 2024 02:30:15 +0800 Subject: [PATCH 41/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E6=A6=82=E5=BF=B5=E4=B8=AD=E7=9A=84=20mermaid=20=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\237\272\346\234\254\346\246\202\345\277\265.md" | 10 ++++++---- ...345\220\214\346\255\245\346\223\215\344\275\234.md" | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git "a/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" index a59d6e6c..d2797696 100644 --- "a/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/md/01\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -47,11 +47,13 @@ graph TD; subgraph "单核机器的任务切换" SingleCore[单核机器] SingleCore --> OS[操作系统调度] - OS --> TaskSwitching[任务切换] - TaskSwitching --> Task1[任务1执行片段] - TaskSwitching --> Task2[任务2执行片段] - TaskSwitching --> Task3[任务3执行片段] + OS --> Task1[任务1执行片段] + Task1 --> OS2[操作系统调度] + OS2 --> Task2[任务2执行片段] + Task2 --> OS3[操作系统调度] + OS3 --> Task3[任务3执行片段] end + ``` ## 并发与并行 diff --git "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" index 240529c1..4060a01e 100644 --- "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" +++ "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" @@ -500,7 +500,7 @@ std::cout << future.get() << '\n'; // 不阻塞,此处获取返回值 std::packaged_task task([](int a, int b){ return std::pow(a, b); }); -std::futurefuture = task.get_future(); +std::future future = task.get_future(); std::thread t{ std::move(task),10,2 }; // 任务在线程中执行 // todo.. 幻想还有许多耗时的代码 t.join(); From 74bd1783b83bd96cd80591b179284d52f534c84d Mon Sep 17 00:00:00 2001 From: mq-b <3326284481@qq.com> Date: Thu, 8 Aug 2024 17:22:48 +0800 Subject: [PATCH 42/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E7=9A=84=E5=86=85=E5=AE=B9=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=B8=80=E8=8A=82=E2=80=9C=E5=8F=AF=E8=A7=81=E2=80=9D?= =?UTF-8?q?=E8=BF=99=E4=B8=AA=E8=AF=8D=E8=AF=AD=E7=9A=84=E6=8F=8F=E8=BF=B0?= =?UTF-8?q?=20#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...37\345\255\220\346\223\215\344\275\234.md" | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" index 2bef22c2..da5171ed 100644 --- "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" +++ "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" @@ -580,7 +580,7 @@ void reader() { 不过事实上 `std::atomic` 的功能相当有限,单看它提供的修改接口(`=`、`store`、`load`、`exchang`)就能明白。如果要操作其保护的共享指针指向的资源还是得 `load()` 获取底层共享指针的副本。此时再进行操作时就得考虑 `std::shared_ptr` 本身在多线程的支持了。 -[^3]: 不用感到奇怪,之所以多个线程通过 shared_ptr 的副本可以调用一切成员函数,甚至包括非 const 的成员函数 `operator=`、`reset`,是因为 ``shared_ptr` 的**控制块是线程安全的**。 +[^3]: 不用感到奇怪,之所以多个线程通过 shared_ptr 的副本可以调用一切成员函数,甚至包括非 const 的成员函数 `operator=`、`reset`,是因为 `shared_ptr` 的**控制块是线程安全的**。 --- @@ -682,3 +682,40 @@ print("end"); // 2 不禁止就是有可能,但是我们无需在乎,**就算真的 CPU 将 end 重排到 start 前面了,也得在可观测行为发生前回溯了**。所以我一直在强调,这些东西,**我们无需在意**。 好了,到此,基本认识也就足够了,以上的示例更多的是泛指,知道其表达的意思就好,这些还是简单直接且符合直觉的。 + +### 可见 + +可见 是多线程并发编程中的一个重要概念,它描述了一个线程中的数据修改对其他线程的可见程度。具体来说,如果线程 A 对变量 x 进行了修改,那么**其他线程 B 是否能够看到线程 A 对 x 的修改**,就涉及到可见的问题。 + +在讨论多线程的内存模型和执行顺序时,虽然经常会提到 CPU 重排、编译器优化、缓存等底层细节,但真正核心的概念是可见,而不是这些底层实现细节。 + +**C++ 标准中的可见**: + +- 如果线程 A 对变量 x 进行了修改,而线程 B 能够读取到线程 A 对 x 的修改,那么我们说线程 B 能看到线程 A 对 x 的修改。也就是说,线程 A 的修改对线程 B 是***可见***的。 + +C++ 标准通过内存序(memory order)来定义如何确保这种*可见*,而不必直接关心底层的 CPU 和编译器的具体行为。内存序提供了操作之间的顺序关系,确保即使存在 CPU 重排、编译器优化或缓存问题,线程也能正确地看到其他线程对共享数据的修改。 + +例如,通过使用合适的内存序(如 memory_order_release 和 memory_order_acquire),可以确保线程 A 的写操作在其他线程 B 中是可见的,从而避免数据竞争问题。 + +总结: + +- *可见* 关注的是线程之间的数据一致性,而不是底层的实现细节。 + +- 使用 C++ 的内存序机制可以确保数据修改的可见,而不必过多关注具体的 CPU 和编译器行为。 +这种描述方式可以帮助更清楚地理解和描述多线程并发编程中如何通过 C++ 标准的内存模型来确保线程之间的数据一致性。 + +--- + +我知道各位肯定有疑问,我们大多数时候写代码都从来没使用过内存序,一般都是互斥量、条件变量等高级设施,这没有可见性的问题吗? + +没有,这些设施自动确保数据的可见性。例如: `std::mutex` 的 `unlock()` 保证: + +- 此操作*同步于*任何后继的取得同一互斥体所有权的锁定操作。 + +也就是 [`unlock()`](https://zh.cppreference.com/w/cpp/thread/mutex/unlock) *同步于* `lock()`。 + +“*同步于*”:操作 A 的完成会确保操作 B 在其之后的执行中,能够看到操作 A 所做的所有修改。 + +也就是说: + +- `std::mutex` 的 `unlock()` 操作*同步于*任何随后的 `lock()` 操作。这意味着,线程在调用 `unlock()` 时,对共享数据的修改会对之后调用 `lock()` 的线程*可见*。 From 1a440ce864eec903905fb79584117514a2ae4cf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sun, 18 Aug 2024 19:43:57 +0800 Subject: [PATCH 43/62] =?UTF-8?q?1.=20=E5=8B=98=E8=AF=AF13700H=E8=83=BD?= =?UTF-8?q?=E6=95=88=E6=A0=B8=E5=8F=82=E6=95=B0=202.=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=20`std::memory=5Forder`=20=E7=9A=84=E5=86=85=E5=AE=B9=203.=20?= =?UTF-8?q?=E7=A1=AE=E5=AE=9A=E5=86=85=E5=AD=98=E6=A8=A1=E5=9E=8B=E5=90=8E?= =?UTF-8?q?=E7=BB=AD=E7=9A=84=E6=9B=B4=E6=96=B0=204.=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=86=85=E5=AD=98=E6=A8=A1=E5=9E=8B=E7=9A=84=E5=86=85=E5=AE=B9?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E5=90=8C=E6=8C=87=E4=BB=A4=E9=9B=86=E6=9E=B6?= =?UTF-8?q?=E6=9E=84=E7=9A=84=E5=9F=BA=E7=A1=80=E5=B8=B8=E8=AF=86=E6=99=AE?= =?UTF-8?q?=E5=8F=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\347\224\250\347\272\277\347\250\213.md" | 2 +- ...37\345\255\220\346\223\215\344\275\234.md" | 95 ++++++++++++++++++- 2 files changed, 92 insertions(+), 5 deletions(-) diff --git "a/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" "b/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" index 898b388f..07c54015 100644 --- "a/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" +++ "b/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" @@ -70,7 +70,7 @@ int main(){ 当然了,都 2024 年了,我们还得考虑一个问题:“ *英特尔从 12 代酷睿开始,为其处理器引入了全新的“**大小核**”混合设计架构*”。 -比如我的 CPU `i7 13700H` 它是 14 核心,20 线程,有 6 个能效核,6 个性能核。不过我们说了,物理核心这个*通常*不看重,`hardware_concurrency()` 输出的值会为 20。 +比如我的 CPU `i7 13700H` 它是 14 核心,20 线程,有 8 个能效核,6 个性能核。不过我们说了,物理核心这个*通常*不看重,`hardware_concurrency()` 输出的值会为 20。 - **在进行多线程编程时,我们可以参考此值来确定创建的线程数量,以更好地利用当前硬件,从而提升程序性能。** diff --git "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" index da5171ed..7b5c71a1 100644 --- "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" +++ "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" @@ -685,9 +685,9 @@ print("end"); // 2 ### 可见 -可见 是多线程并发编程中的一个重要概念,它描述了一个线程中的数据修改对其他线程的可见程度。具体来说,如果线程 A 对变量 x 进行了修改,那么**其他线程 B 是否能够看到线程 A 对 x 的修改**,就涉及到可见的问题。 +**可见** 是 C++ 多线程并发编程中的一个重要概念,它描述了一个线程中的数据修改对其他线程的可见程度。具体来说,如果线程 A 对变量 x 进行了修改,那么**其他线程 B 是否能够看到线程 A 对 x 的修改**,就涉及到可见的问题。 -在讨论多线程的内存模型和执行顺序时,虽然经常会提到 CPU 重排、编译器优化、缓存等底层细节,但真正核心的概念是可见,而不是这些底层实现细节。 +在讨论多线程的内存模型和执行顺序时,虽然经常会提到 CPU 重排、编译器优化、缓存等底层细节,但真正核心的概念是*可见*,而不是这些底层实现细节。 **C++ 标准中的可见**: @@ -702,11 +702,12 @@ C++ 标准通过内存序(memory order)来定义如何确保这种*可见* - *可见* 关注的是线程之间的数据一致性,而不是底层的实现细节。 - 使用 C++ 的内存序机制可以确保数据修改的可见,而不必过多关注具体的 CPU 和编译器行为。 -这种描述方式可以帮助更清楚地理解和描述多线程并发编程中如何通过 C++ 标准的内存模型来确保线程之间的数据一致性。 + +这种描述方式可以帮助更清楚地理解和描述多线程并发编程中如何通过 C++ 标准的内存模型来确保线程之间的数据一致性,而无需太多关注底层细节。 --- -我知道各位肯定有疑问,我们大多数时候写代码都从来没使用过内存序,一般都是互斥量、条件变量等高级设施,这没有可见性的问题吗? +我知道各位肯定有疑问,我们大多数时候写多线程代码都从来没使用过内存序,一般都是互斥量、条件变量等高级同步设施,这没有可见性的问题吗? 没有,这些设施自动确保数据的可见性。例如: `std::mutex` 的 `unlock()` 保证: @@ -719,3 +720,89 @@ C++ 标准通过内存序(memory order)来定义如何确保这种*可见* 也就是说: - `std::mutex` 的 `unlock()` 操作*同步于*任何随后的 `lock()` 操作。这意味着,线程在调用 `unlock()` 时,对共享数据的修改会对之后调用 `lock()` 的线程*可见*。 + +### `std::memory_order` + +`std::memory_order` 是一个枚举类型,用来指定原子操作的内存顺序,影响这些操作的行为。 + +```cpp +typedef enum memory_order { + memory_order_relaxed, + memory_order_consume, + memory_order_acquire, + memory_order_release, + memory_order_acq_rel, + memory_order_seq_cst +} memory_order; + +// C++20 起则为: + +enum class memory_order : /* 未指明 */ { + relaxed, consume, acquire, release, acq_rel, seq_cst +}; +inline constexpr memory_order memory_order_relaxed = memory_order::relaxed; +inline constexpr memory_order memory_order_consume = memory_order::consume; +inline constexpr memory_order memory_order_acquire = memory_order::acquire; +inline constexpr memory_order memory_order_release = memory_order::release; +inline constexpr memory_order memory_order_acq_rel = memory_order::acq_rel; +inline constexpr memory_order memory_order_seq_cst = memory_order::seq_cst; +``` + +这 6 个常量,每一个常量都表示不同的内存次序。 + +大体来说我们可以将它们分为三类。 + +1. `memory_order_relaxed` 宽松定序:不是定序约束,**仅对此操作要求原子性**。 +2. `memory_order_seq_cst` 序列一致定序,这是库中所有原子操作的**默认行为**,也是**最严格的内存次序**,是**绝对安全**的。 + +剩下的就是第三类。 + +### 其它概念 + + + +### `x86` 和 `ARM` 的内存模型:强一致性与弱一致性 + + + +**内存模型是软件与实现之间的一种约定契约**。它定义了在多线程或并发环境中,如何对内存操作的顺序和一致性进行规范,以确保程序的正确性和可靠性。 + +C++ 标准为我们定义了 C++ 标准内存模型,使我们能够无需关心底层硬件环境就编写出跨平台的应用程序。不过,了解底层硬件架构的内存模型对扩展知识面和深入理解编程细节也非常有帮助。 + +最经典与常见的两种 CPU 指令集架构就是:`x86` 与 `ARM`。 + +- `x86` 架构:是一种复杂指令集计算([CISC](https://zh.wikipedia.org/wiki/%E8%A4%87%E9%9B%9C%E6%8C%87%E4%BB%A4%E9%9B%86%E9%9B%BB%E8%85%A6))架构,因其强大的性能被广泛应用于桌面电脑、笔记本电脑和服务器中。`x86` 架构采用的是 TSO(Total Store Order)[**内存一致性模型**](https://jamesbornholt.com/blog/memory-models/),是一种**强一致性模型**,**简化了多线程编程中的内存同步问题**(后文中会提到)。 + +- `ARM` 架构:是一种精简指令集计算([RISC](https://zh.wikipedia.org/wiki/%E7%B2%BE%E7%AE%80%E6%8C%87%E4%BB%A4%E9%9B%86%E8%AE%A1%E7%AE%97%E6%9C%BA))架构,因其高能效和低功耗特点广泛应用于移动设备、嵌入式系统和物联网设备中。`ARM` 架构采用的是**弱序内存模型**([weakly-ordered memory](https://developer.arm.com/documentation/102336/0100/Memory-ordering)),允许**更灵活**的内存优化,但这需要程序员使用内存屏障等机制来确保正确性。 + +这两种架构在设计理念和应用领域上存在显著差异,这也是它们在不同应用场景中表现出色的原因。 + +如果你从事嵌入式系统或者学术研究等,可能也听说过 `RISC-V` 架构,它目前在国内的应用也逐渐增多。 + +RISC-V 是一种开源的精简指令集计算(RISC)架构,旨在提供一种高效、模块化且开放的指令集。与 x86 和 ARM 架构不同,RISC-V 的设计目标是简化指令集,同时保持高度的灵活性和扩展性。它在内存模型方面也有自己独特的特性。 + +RISC-V 采用的也是**弱序内存模型**(weakly-ordered memory model),这与 x86 的强一致性模型(TSO)和 ARM 的弱一致性模型有所不同。你可能会有疑问: + +- `ARM` 和 `RISC-V` 都是弱序内存模型,为什么不同? + +各位一定要区分,这种强弱其实也只是一种分类而已,不同的指令集架构大多都还是有所不同的,并不会完全一样。例如: `x86` 的 TSO(Total Store Order)是强一致性模型的一种,但并不是所有强一致性模型都是 TSO + +### 宽松定序 + +### 释放-获取定序 + +### 释放-消费定序 + +### 序列一致定序 + +### 与 `volatile` 的关系 + + \ No newline at end of file From f631df4341754fc62f85269da32cd4ff885fc37b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sun, 8 Sep 2024 10:53:48 +0800 Subject: [PATCH 44/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=8C=E4=BF=AE=E6=94=B9=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E7=AC=94=E8=AF=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + .../01-HelloWorld.cpp | 5 ++ .../CMakeLists.txt | 15 +++++ .../CMakeSettings.json | 63 +++++++++++++++++++ ...37\345\255\220\346\223\215\344\275\234.md" | 2 +- md/README.md | 2 + 6 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/01-HelloWorld.cpp create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeSettings.json diff --git a/.gitignore b/.gitignore index ab308736..18f381cb 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,8 @@ node_modules/ .vs/ x64/ out/ +*.ilk +*.pdb CMakePresets.json CMakeUserPresets.json diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/01-HelloWorld.cpp b/code/ModernCpp-ConcurrentProgramming-Tutorial/01-HelloWorld.cpp new file mode 100644 index 00000000..b609f207 --- /dev/null +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/01-HelloWorld.cpp @@ -0,0 +1,5 @@ +#include + +int main(){ + std::cout << "Hello World" << std::endl; +} \ No newline at end of file diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt new file mode 100644 index 00000000..1bd28475 --- /dev/null +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required (VERSION 3.8) + +project ("ModernCpp-ConcurrentProgramming-Tutorial") + +set(CMAKE_CXX_STANDARD 17) + +SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) + +if(MSVC) + add_compile_options("/utf-8" "/permissive-") +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + add_compile_options("-finput-charset=UTF-8" "-fexec-charset=UTF-8") +endif() + +add_executable(ModernCpp-ConcurrentProgramming-Tutorial "01-HelloWorld.cpp") diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeSettings.json b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeSettings.json new file mode 100644 index 00000000..e254f77b --- /dev/null +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeSettings.json @@ -0,0 +1,63 @@ +{ + "configurations": [ + { + "name": "x64-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "" + }, + { + "name": "x64-Release", + "generator": "Ninja", + "configurationType": "RelWithDebInfo", + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x64_x64" ], + "variables": [] + }, + { + "name": "x86-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x86" ], + "variables": [] + }, + { + "name": "x86-Release", + "generator": "Ninja", + "configurationType": "RelWithDebInfo", + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x86" ], + "variables": [] + }, + { + "name": "x64-Clang-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "clang_cl_x64_x64" ], + "variables": [] + } + ] +} \ No newline at end of file diff --git "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" index 7b5c71a1..9909bb6d 100644 --- "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" +++ "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" @@ -791,7 +791,7 @@ RISC-V 采用的也是**弱序内存模型**(weakly-ordered memory model), - `ARM` 和 `RISC-V` 都是弱序内存模型,为什么不同? -各位一定要区分,这种强弱其实也只是一种分类而已,不同的指令集架构大多都还是有所不同的,并不会完全一样。例如: `x86` 的 TSO(Total Store Order)是强一致性模型的一种,但并不是所有强一致性模型都是 TSO +各位一定要区分,这种强弱其实也只是一种分类而已,不同的指令集架构大多都还是有所不同的,并不会完全一样。例如: `x86` 的 TSO(Total Store Order)是强一致性模型的一种,但并不是所有强一致性模型都是 TSO。 ### 宽松定序 diff --git a/md/README.md b/md/README.md index c195ac73..0c942e8f 100644 --- a/md/README.md +++ b/md/README.md @@ -21,6 +21,8 @@   我们的代码风格较为简洁明了,命名全部使用下划线连接,而不是驼峰命名法。花括号通常只占一行,简短的代码可以不额外占行。一般初始化时使用 `{}`,而非 `()` 或者 `=` 。这样简单直观,避免歧义和许多问题。`#include` 引入头文件时需要在尖括号或引号前后加空格。 ```cpp +#include + struct move_only{ move_only() { std::puts("默认构造"); } move_only(move_only&&)noexcept { std::puts("移动构造"); } From 4f434731466edcd618c5f6da07e4cd8a9ed08443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Fri, 13 Sep 2024 20:02:13 +0800 Subject: [PATCH 45/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=8D=E9=87=8D?= =?UTF-8?q?=E8=A6=81=E7=9A=84=E6=96=87=E4=BB=B6=E3=80=82=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=20`std::thread`=20=E6=BA=90=E7=A0=81=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E6=8E=AA=E8=BE=9E=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../01-HelloWorld.cpp | 10 +++- .../02-hardware_concurrency.cpp | 59 +++++++++++++++++++ .../03-thread_management.cpp | 32 ++++++++++ .../04-RAII.cpp | 48 +++++++++++++++ ...0\351\200\222\345\217\202\346\225\260.cpp" | 20 +++++++ ...5\345\220\215\347\251\272\351\227\264.cpp" | 28 +++++++++ ...3\346\211\200\346\234\211\346\235\203.cpp" | 18 ++++++ ...0\347\240\201\350\247\243\346\236\220.cpp" | 16 +++++ ...20\347\240\201\350\247\243\346\236\220.md" | 2 +- 9 files changed, 231 insertions(+), 2 deletions(-) create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/02-hardware_concurrency.cpp create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/03-thread_management.cpp create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/04-RAII.cpp create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/05-\344\274\240\351\200\222\345\217\202\346\225\260.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/06-this_thread\345\221\275\345\220\215\347\251\272\351\227\264.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/07-thread\345\257\271\350\261\241\350\275\254\347\247\273\346\211\200\346\234\211\346\235\203.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/08-thread\346\236\204\351\200\240\346\272\220\347\240\201\350\247\243\346\236\220.cpp" diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/01-HelloWorld.cpp b/code/ModernCpp-ConcurrentProgramming-Tutorial/01-HelloWorld.cpp index b609f207..3fbaabd8 100644 --- a/code/ModernCpp-ConcurrentProgramming-Tutorial/01-HelloWorld.cpp +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/01-HelloWorld.cpp @@ -1,5 +1,13 @@ #include +#include +#include -int main(){ +void hello(){ std::cout << "Hello World" << std::endl; + // std::this_thread::sleep_for(std::chrono::seconds(5)); +} + +int main(){ + std::thread t; // 默认构造?构造不关联线程的 thread 对象 + std::cout < +#include +#include +#include +#include +#include + +template +auto sum(ForwardIt first, ForwardIt last) { + using value_type = std::iter_value_t; + std::size_t num_threads = std::thread::hardware_concurrency(); + std::ptrdiff_t distance = std::distance(first, last); + + if (distance > 1024000) { + // 计算每个线程处理的元素数量 + std::size_t chunk_size = distance / num_threads; + std::size_t remainder = distance % num_threads; + + // 存储每个线程的结果 + std::vector results{ num_threads }; + + // 存储关联线程的线程对象 + std::vector threads; + + // 创建并启动线程 + auto start = first; + for (std::size_t i = 0; i < num_threads; ++i) { + auto end = std::next(start, chunk_size + (i < remainder ? 1 : 0)); + threads.emplace_back([start, end, &results, i] { + results[i] = std::accumulate(start, end, value_type{}); + }); + start = end; // 开始迭代器不断向前 + } + + // 等待所有线程执行完毕 + for (auto& thread : threads) + thread.join(); + + // 汇总线程的计算结果 + value_type total_sum = std::accumulate(results.begin(), results.end(), value_type{}); + return total_sum; + } + + value_type total_sum = std::accumulate(first, last, value_type{}); + return total_sum; +} + +int main() { + std::vector vecs{ "1","2","3","4" }; + auto result = sum(vecs.begin(), vecs.end()); + std::cout << result << '\n'; + + vecs.clear(); + for (std::size_t i = 0; i <= 1024001u; ++i) { + vecs.push_back(std::to_string(i)); + } + result = sum(vecs.begin(), vecs.end()); + std::cout << result << '\n'; +} \ No newline at end of file diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/03-thread_management.cpp b/code/ModernCpp-ConcurrentProgramming-Tutorial/03-thread_management.cpp new file mode 100644 index 00000000..0a9f1371 --- /dev/null +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/03-thread_management.cpp @@ -0,0 +1,32 @@ +#include +#include + +struct func { + int& m_i; + func(int& i) :m_i{ i } {} + void operator()(int n)const { + for (int i = 0; i <= n; ++i) { + m_i += i; // 可能悬空引用 + } + } +}; + +void f2() { throw std::runtime_error("test f2()"); } + +void f() { + int n = 0; + std::thread t{ func{n},10 }; + try { + // todo.. 一些当前线程可能抛出异常的代码 + f2(); + t.join(); + } + catch (...) { + t.join(); // 1 + // 如果此处不抛出 会掩盖错误 我们根本没有处理 没有解决 + } +} + +int main() { + f(); +} \ No newline at end of file diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/04-RAII.cpp b/code/ModernCpp-ConcurrentProgramming-Tutorial/04-RAII.cpp new file mode 100644 index 00000000..e3e793af --- /dev/null +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/04-RAII.cpp @@ -0,0 +1,48 @@ +#include +#include +#include + +struct func { + int& m_i; + func(int& i) :m_i{ i } {} + void operator()(int n)const { + for (int i = 0; i <= n; ++i) { + m_i += i; // 可能悬空引用 + } + } +}; + +void f2(){ + // todo.. + throw std::runtime_error("f2 error"); +} + +class thread_guard{ +public: + explicit thread_guard(std::thread& t) :thread_{ t } + {} + ~thread_guard(){ + std::puts("析构"); + if(thread_.joinable()){ // 如果当前有活跃线程 则进行 join + thread_.join(); + } + } + thread_guard& operator=(const thread_guard&) = delete; + thread_guard(const thread_guard&) = delete; + + std::thread& thread_; +}; + +void f() { + int n = 0; + std::thread t{ func{n},10 }; + thread_guard g(t); + f2(); // 可能抛出异常 +} + +int main(){ + // 栈回溯 + try{ + f(); + }catch (...){} +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/05-\344\274\240\351\200\222\345\217\202\346\225\260.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/05-\344\274\240\351\200\222\345\217\202\346\225\260.cpp" new file mode 100644 index 00000000..1ae06177 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/05-\344\274\240\351\200\222\345\217\202\346\225\260.cpp" @@ -0,0 +1,20 @@ +#include +#include +#include + +void f(const std::string&); + +void test() { + char buffer[1024]{}; + //todo.. code + std::thread t{ f, std::string(buffer) }; // std::string(buffer) 构造对象,由 std::string 对象自行管理 + t.detach(); +} + +int main(){ + // A 的引用只能引用 A 类型,或者以任何形式 转换到 A + double a = 1; + const int& p = a; // a 隐式转换到了 int 类型,这个转换是纯右值表达式 + // 因为 const T& 可以接右值表达式,所以才能通过编译 + const std::string& s = "123"; // "123" 构造了 std::string 对象 +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/06-this_thread\345\221\275\345\220\215\347\251\272\351\227\264.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/06-this_thread\345\221\275\345\220\215\347\251\272\351\227\264.cpp" new file mode 100644 index 00000000..b99567e7 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/06-this_thread\345\221\275\345\220\215\347\251\272\351\227\264.cpp" @@ -0,0 +1,28 @@ +#include +#include +#include +using namespace std::chrono_literals; + +int main() { + // 获取当前时间点 + auto now = std::chrono::system_clock::now(); + + // 设置要等待的时间点为当前时间点之后的5秒 + auto wakeup_time = now + 5s; + + // 输出当前时间 + auto now_time = std::chrono::system_clock::to_time_t(now); + std::cout << "Current time:\t\t" << std::put_time(std::localtime(&now_time), "%H:%M:%S") << std::endl; + + // 输出等待的时间点 + auto wakeup_time_time = std::chrono::system_clock::to_time_t(wakeup_time); + std::cout << "Waiting until:\t\t" << std::put_time(std::localtime(&wakeup_time_time), "%H:%M:%S") << std::endl; + + // 等待到指定的时间点 + std::this_thread::sleep_until(wakeup_time); + + // 输出等待结束后的时间 + now = std::chrono::system_clock::now(); + now_time = std::chrono::system_clock::to_time_t(now); + std::cout << "Time after waiting:\t" << std::put_time(std::localtime(&now_time), "%H:%M:%S") << std::endl; +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/07-thread\345\257\271\350\261\241\350\275\254\347\247\273\346\211\200\346\234\211\346\235\203.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/07-thread\345\257\271\350\261\241\350\275\254\347\247\273\346\211\200\346\234\211\346\235\203.cpp" new file mode 100644 index 00000000..3d7d267a --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/07-thread\345\257\271\350\261\241\350\275\254\347\247\273\346\211\200\346\234\211\346\235\203.cpp" @@ -0,0 +1,18 @@ +#include +#include + +// https://github.com/Mq-b/Loser-HomeWork/discussions/206 + +// 反直觉 +// 形参、实参 +// 函数调用传参,实际上是初始化了(构造)形参的对象 + +void f(std::thread t) { + t.join(); +} + +int main() { + std::thread t{ [] {} }; + f(std::move(t)); + f(std::thread{ [] {} }); +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/08-thread\346\236\204\351\200\240\346\272\220\347\240\201\350\247\243\346\236\220.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/08-thread\346\236\204\351\200\240\346\272\220\347\240\201\350\247\243\346\236\220.cpp" new file mode 100644 index 00000000..691290ef --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/08-thread\346\236\204\351\200\240\346\272\220\347\240\201\350\247\243\346\236\220.cpp" @@ -0,0 +1,16 @@ +#include +#include +#include + +struct X { + X(X&& x)noexcept {} + template , X>, int> = 0> + X(Fn&& f, Args&&...args) {} + X(const X&) = delete; +}; + +int main(){ + std::thread + X x{ [] {} }; + X x2{ x }; // 选择到了有参构造函数,不导致编译错误 +} \ No newline at end of file diff --git "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/01thread\347\232\204\346\236\204\351\200\240\344\270\216\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/01thread\347\232\204\346\236\204\351\200\240\344\270\216\346\272\220\347\240\201\350\247\243\346\236\220.md" index 7a56a2fa..cf67dabb 100644 --- "a/md/\350\257\246\347\273\206\345\210\206\346\236\220/01thread\347\232\204\346\236\204\351\200\240\344\270\216\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/md/\350\257\246\347\273\206\345\210\206\346\236\220/01thread\347\232\204\346\236\204\351\200\240\344\270\216\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -131,7 +131,7 @@ void _Start(_Fn&& _Fx, _Args&&... _Ax) { 4. `constexpr auto _Invoker_proc = _Get_invoke<_Tuple>(make_index_sequence<1 + sizeof...(_Args)>{})` - - 调用 [`_Get_invoke`](https://github.com/microsoft/STL/blob/8e2d724cc1072b4052b14d8c5f81a830b8f1d8cb/stl/inc/thread#L65-L68) 函数,传入 `_Tuple` 类型和一个参数序列的索引序列(为了遍历形参包)。这个函数用于获取一个函数指针,指向了一个静态成员函数 [`_Invoke`](https://github.com/microsoft/STL/blob/8e2d724cc1072b4052b14d8c5f81a830b8f1d8cb/stl/inc/thread#L55-L63),用来实际执行线程。这两个函数都非常的简单,我们来看看: + - 调用 [`_Get_invoke`](https://github.com/microsoft/STL/blob/8e2d724cc1072b4052b14d8c5f81a830b8f1d8cb/stl/inc/thread#L65-L68) 函数,传入 `_Tuple` 类型和一个参数序列的索引序列(为了遍历形参包)。这个函数用于获取一个函数指针,指向了一个静态成员函数 [`_Invoke`](https://github.com/microsoft/STL/blob/8e2d724cc1072b4052b14d8c5f81a830b8f1d8cb/stl/inc/thread#L55-L63),它是线程实际执行的函数。这两个函数都非常的简单,我们来看看: ```cpp template From 79952e402d3bf495e1bbb6984de36b67086d8369 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Tue, 17 Sep 2024 20:58:29 +0800 Subject: [PATCH 46/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=95=99=E6=A1=88=201.?= =?UTF-8?q?=20=E4=BF=AE=E6=94=B9=E7=AC=AC=E4=BA=8C=E3=80=81=E7=AC=AC?= =?UTF-8?q?=E4=B8=89=E7=AB=A0=E7=9A=84=E9=83=A8=E5=88=86=E5=BE=AE=E5=B0=8F?= =?UTF-8?q?=E6=8E=AA=E8=BE=9E=E4=BB=A5=E5=8F=8A=E4=BB=A3=E7=A0=81=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E3=80=82=202.=20=E6=9B=B4=E6=96=B0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=AD=E7=9A=84=E4=BB=A3=E7=A0=81=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B=EF=BC=8C=E7=94=A8=E4=BD=9C=E8=A7=86=E9=A2=91=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\256\236\347\216\260joining_thread.cpp" | 69 +++++++++++++++++++ .../10-C++20jthread.cpp | 20 ++++++ ...0\346\215\256\347\253\236\344\272\211.cpp" | 19 +++++ ...0\344\272\222\346\226\245\351\207\217.cpp" | 44 ++++++++++++ .../13-try_lock.cpp | 33 +++++++++ ...1\344\272\253\346\225\260\346\215\256.cpp" | 40 +++++++++++ ...0\344\270\216\350\247\243\345\206\263.cpp" | 28 ++++++++ .../16-unique_lock.cpp | 32 +++++++++ ...2\344\272\222\346\226\245\351\207\217.cpp" | 19 +++++ ...3\345\214\226\350\277\207\347\250\213.cpp" | 51 ++++++++++++++ ...0\346\215\256\347\273\223\346\236\204.cpp" | 47 +++++++++++++ .../20recursive_mutex.cpp | 21 ++++++ .../CMakeLists.txt | 6 +- .../test/test_mutex.cpp | 3 + ...77\347\224\250\347\272\277\347\250\213.md" | 4 +- ...61\344\272\253\346\225\260\346\215\256.md" | 13 ++-- 16 files changed, 436 insertions(+), 13 deletions(-) create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/09-\345\256\236\347\216\260joining_thread.cpp" create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/10-C++20jthread.cpp create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/11-\346\225\260\346\215\256\347\253\236\344\272\211.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/12-\344\275\277\347\224\250\344\272\222\346\226\245\351\207\217.cpp" create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/13-try_lock.cpp create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/14-\344\277\235\346\212\244\345\205\261\344\272\253\346\225\260\346\215\256.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/15-\346\255\273\351\224\201\357\274\232\351\227\256\351\242\230\344\270\216\350\247\243\345\206\263.cpp" create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/16-unique_lock.cpp create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/17-\345\234\250\344\270\215\345\220\214\344\275\234\347\224\250\345\237\237\344\274\240\351\200\222\344\272\222\346\226\245\351\207\217.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/18-\344\277\235\346\212\244\345\205\261\344\272\253\346\225\260\346\215\256\347\232\204\345\210\235\345\247\213\345\214\226\350\277\207\347\250\213.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/19\344\277\235\346\212\244\344\270\215\345\270\270\346\233\264\346\226\260\347\232\204\346\225\260\346\215\256\347\273\223\346\236\204.cpp" create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/20recursive_mutex.cpp create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/test/test_mutex.cpp diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/09-\345\256\236\347\216\260joining_thread.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/09-\345\256\236\347\216\260joining_thread.cpp" new file mode 100644 index 00000000..ec488654 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/09-\345\256\236\347\216\260joining_thread.cpp" @@ -0,0 +1,69 @@ +#include +#include +#include +#include +#include + +class joining_thread { + std::thread t; +public: + joining_thread()noexcept = default; + + template + explicit joining_thread(Callable&& func, Args&&...args) : + t{ std::forward(func), std::forward(args)... } {} + + explicit joining_thread(std::thread t_)noexcept : t{ std::move(t_) } {} + + joining_thread(joining_thread&& other)noexcept : t{ std::move(other.t) } {} + + joining_thread& operator=(std::thread&& other)noexcept { + if (joinable()) { // 如果当前有活跃线程(判断当前对象是否持有资源),那就先执行完(先释放) + join(); // 就相当于释放资源一样的意思 + } + t = std::move(other); + return *this; + } + ~joining_thread() { + if (joinable()) { + join(); + } + } + void swap(joining_thread& other)noexcept { + t.swap(other.t); + } + std::thread::id get_id()const noexcept { + return t.get_id(); + } + bool joinable()const noexcept { + return t.joinable(); + } + void join() { + t.join(); + } + void detach() { + t.detach(); + } + std::thread& data()noexcept { + return t; + } + const std::thread& data()const noexcept { + return t; + } +}; + +int main(){ + auto func = []{ + std::cout << std::this_thread::get_id() << '\n'; + }; + + std::vector vec; + + for (int i = 0; i < 10; ++i){ + vec.emplace_back(func); + } + + for(auto& thread : vec){ + thread.join(); + } +} \ No newline at end of file diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/10-C++20jthread.cpp b/code/ModernCpp-ConcurrentProgramming-Tutorial/10-C++20jthread.cpp new file mode 100644 index 00000000..308b281f --- /dev/null +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/10-C++20jthread.cpp @@ -0,0 +1,20 @@ +#include +#include + +using namespace std::literals::chrono_literals; + +void f(std::stop_token stop_token, int value) { + while (!stop_token.stop_requested()) { // 检查是否已经收到停止请求 + std::cout << value++ << ' ' << std::flush; + std::this_thread::sleep_for(200ms); + } + std::cout << std::endl; +} + +int main() { + std::jthread thread{ f, 1 }; // 打印 1..15 大约 3 秒 + std::this_thread::sleep_for(3s); + thread.request_stop(); // 发送信息,线程终止 + std::cout << "乐\n"; + // jthread 的析构函数调用 request_stop() 和 join()。 +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/11-\346\225\260\346\215\256\347\253\236\344\272\211.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/11-\346\225\260\346\215\256\347\253\236\344\272\211.cpp" new file mode 100644 index 00000000..5607d6c6 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/11-\346\225\260\346\215\256\347\253\236\344\272\211.cpp" @@ -0,0 +1,19 @@ +#include +#include +#include + +std::vector v; + +int n = 1; + +int main() { + int cnt = 0; + auto f = [&] { cnt++; }; + std::thread t1{ f }, t2{ f }, t3{ f }; // ub 未定义行为 + t1.join(); + t2.join(); + t3.join(); + std::cout << cnt << '\n'; +} +// 数据竞争它是未定义行为,但是 C++ 的编译器,它会假设你的程序(假设程序是对的,代码是对的)没有任何的未定义行为再去进行优化 +// 输出 n,优化,直接缓存这个值 \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/12-\344\275\277\347\224\250\344\272\222\346\226\245\351\207\217.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/12-\344\275\277\347\224\250\344\272\222\346\226\245\351\207\217.cpp" new file mode 100644 index 00000000..534d2410 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/12-\344\275\277\347\224\250\344\272\222\346\226\245\351\207\217.cpp" @@ -0,0 +1,44 @@ +#include +#include +#include +#include +#include +#include +#include + +std::mutex m; + +// 写 +void add_to_list(int n, std::list& list) { + std::vector numbers(n + 1); + std::iota(numbers.begin(), numbers.end(), 0); + int sum = std::accumulate(numbers.begin(), numbers.end(), 0); + + { + std::scoped_lock lc{ m }; + list.push_back(sum); + } +} + +// 读 +void print_list(const std::list& list) { + std::scoped_lock lc{ m }; + for (const auto& i : list) { + std::cout << i << ' '; + } + std::cout << '\n'; +} + +int main(){ + std::list list; + std::thread t1{ add_to_list,10,std::ref(list) }; + std::thread t2{ add_to_list,10,std::ref(list) }; + std::thread t3{ print_list,std::cref(list) }; + std::thread t4{ print_list,std::cref(list) }; + t1.join(); + t2.join(); + t3.join(); + t4.join(); + std::cout << "---------------------\n"; + print_list(list); +} \ No newline at end of file diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/13-try_lock.cpp b/code/ModernCpp-ConcurrentProgramming-Tutorial/13-try_lock.cpp new file mode 100644 index 00000000..fcbbf365 --- /dev/null +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/13-try_lock.cpp @@ -0,0 +1,33 @@ +#include +#include +#include +#include +#include +using namespace std::string_literals; + +std::mutex mtx; + +void thread_function(int id) { + // 尝试加锁 + if (mtx.try_lock()) { + std::string s = "线程:"s + std::to_string(id) + " 获得锁"s + "\n"; + std::string s2 = "线程:"s + std::to_string(id) + " 释放锁"s + "\n"; + std::cout << s; + // 临界区代码 + std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟临界区操作 + mtx.unlock(); // 解锁 + std::cout << s2; + } + else { + std::string s = "线程:"s + std::to_string(id) + " 获取锁失败 处理步骤"s + "\n"; + std::cout << s; + } +} + +int main(){ + std::thread t1(thread_function, 1); + std::thread t2(thread_function, 2); + + t1.join(); + t2.join(); +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/14-\344\277\235\346\212\244\345\205\261\344\272\253\346\225\260\346\215\256.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/14-\344\277\235\346\212\244\345\205\261\344\272\253\346\225\260\346\215\256.cpp" new file mode 100644 index 00000000..d93d694d --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/14-\344\277\235\346\212\244\345\205\261\344\272\253\346\225\260\346\215\256.cpp" @@ -0,0 +1,40 @@ +#include +#include +#include + +class Data { + int a{}; + std::string b{}; +public: + void do_something() { + // 修改数据成员等... + } +}; + +class Data_wrapper { + Data data; + std::mutex m; +public: + template + void process_data(Func func) { + std::lock_guard lc{ m }; + func(data); // 受保护数据传递给函数 + } +}; + +Data* p = nullptr; + +void malicious_function(Data& protected_data) { + p = &protected_data; // 受保护的数据被传递到外部 +} + +Data_wrapper d; + +void foo() { + d.process_data(malicious_function); // 传递了一个恶意的函数 + p->do_something(); // 在无保护的情况下访问保护数据 +} + +int main(){ + +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/15-\346\255\273\351\224\201\357\274\232\351\227\256\351\242\230\344\270\216\350\247\243\345\206\263.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/15-\346\255\273\351\224\201\357\274\232\351\227\256\351\242\230\344\270\216\350\247\243\345\206\263.cpp" new file mode 100644 index 00000000..dd22b6e2 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/15-\346\255\273\351\224\201\357\274\232\351\227\256\351\242\230\344\270\216\350\247\243\345\206\263.cpp" @@ -0,0 +1,28 @@ +#include +#include +#include +#include +using namespace std::chrono_literals; + +struct X { + X(const std::string& str) :object{ str } {} + + friend void swap(X& lhs, X& rhs); +private: + std::string object; + std::mutex m; +}; + +void swap(X& lhs, X& rhs) { + if (&lhs == &rhs) return; + std::scoped_lock guard{ lhs.m,rhs.m }; + swap(lhs.object, rhs.object); +} + +int main(){ + X a{ "🤣" }, b{ "😅" }; + std::thread t{ [&] {swap(a, b); } }; // 1 + std::thread t2{ [&] {swap(b, a); } }; // 2 + t.join(); + t2.join(); +} \ No newline at end of file diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/16-unique_lock.cpp b/code/ModernCpp-ConcurrentProgramming-Tutorial/16-unique_lock.cpp new file mode 100644 index 00000000..74e32db7 --- /dev/null +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/16-unique_lock.cpp @@ -0,0 +1,32 @@ +#include +#include +#include +#include +using namespace std::chrono_literals; + +struct X { + X(const std::string& str) :object{ str } {} + + friend void swap(X& lhs, X& rhs); +private: + std::string object; + std::mutex m; +}; + +void swap(X& lhs, X& rhs) { + if (&lhs == &rhs) return; + std::lock(rhs.m, lhs.m); + + std::unique_lock lock1{ lhs.m, std::adopt_lock }; + std::unique_lock lock2{ rhs.m, std::adopt_lock }; + // std::lock(lock1, lock2); + swap(lhs.object, rhs.object); +} + +int main() { + X a{ "🤣" }, b{ "😅" }; + std::thread t{ [&] {swap(a, b); } }; // 1 + std::thread t2{ [&] {swap(b, a); } }; // 2 + t.join(); + t2.join(); +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/17-\345\234\250\344\270\215\345\220\214\344\275\234\347\224\250\345\237\237\344\274\240\351\200\222\344\272\222\346\226\245\351\207\217.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/17-\345\234\250\344\270\215\345\220\214\344\275\234\347\224\250\345\237\237\344\274\240\351\200\222\344\272\222\346\226\245\351\207\217.cpp" new file mode 100644 index 00000000..dbe08886 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/17-\345\234\250\344\270\215\345\220\214\344\275\234\347\224\250\345\237\237\344\274\240\351\200\222\344\272\222\346\226\245\351\207\217.cpp" @@ -0,0 +1,19 @@ +#include +#include +#include +#include +#include + +std::unique_lock get_lock() { + extern std::mutex some_mutex; + std::unique_lock lk{ some_mutex }; + return lk; // 选择到 unique_lock 的移动构造,转移所有权 +} +void process_data() { + std::unique_lock lk{ get_lock() }; // 转移到了主函数的 lk 中 + // 执行一些任务... +}// 最后才会 unlock 解锁 + +int main(){ + process_data(); +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/18-\344\277\235\346\212\244\345\205\261\344\272\253\346\225\260\346\215\256\347\232\204\345\210\235\345\247\213\345\214\226\350\277\207\347\250\213.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/18-\344\277\235\346\212\244\345\205\261\344\272\253\346\225\260\346\215\256\347\232\204\345\210\235\345\247\213\345\214\226\350\277\207\347\250\213.cpp" new file mode 100644 index 00000000..8b19028c --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/18-\344\277\235\346\212\244\345\205\261\344\272\253\346\225\260\346\215\256\347\232\204\345\210\235\345\247\213\345\214\226\350\277\207\347\250\213.cpp" @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include + +struct some{ + void do_something(){} +}; + +std::shared_ptr ptr; +std::once_flag resource_flag; + +void init_resource() { + ptr.reset(new some); +} + +void foo() { + std::call_once(resource_flag, []{ptr.reset(new some); }); // 线程安全的一次初始化 + ptr->do_something(); +} + +void test(){ + std::call_once(resource_flag, [] {std::cout << "f init\n"; }); +} + +std::once_flag flag; +int n = 0; + +void f() { + std::call_once(flag, [] { + ++n; + std::cout << "第 " << n << " 次调用\n"; + throw std::runtime_error("异常"); + }); +} + +class my_class{}; + +inline my_class& get_my_class_instance() { + static my_class instance; // 线程安全的初始化过程 初始化严格发生一次 + return instance; +} + +int main() { + get_my_class_instance(); + get_my_class_instance(); + get_my_class_instance(); + get_my_class_instance(); + get_my_class_instance(); +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/19\344\277\235\346\212\244\344\270\215\345\270\270\346\233\264\346\226\260\347\232\204\346\225\260\346\215\256\347\273\223\346\236\204.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/19\344\277\235\346\212\244\344\270\215\345\270\270\346\233\264\346\226\260\347\232\204\346\225\260\346\215\256\347\273\223\346\236\204.cpp" new file mode 100644 index 00000000..135048b8 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/19\344\277\235\346\212\244\344\270\215\345\270\270\346\233\264\346\226\260\347\232\204\346\225\260\346\215\256\347\273\223\346\236\204.cpp" @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include +#include + +class Settings { +private: + std::map data_; + mutable std::shared_timed_mutex mutex_; // “M&M 规则”:mutable 与 mutex 一起出现 + +public: + void set(const std::string& key, const std::string& value) { + std::lock_guard lock{ mutex_ }; + data_[key] = value; + } + + std::string get(const std::string& key) const { + std::shared_lock lock(mutex_); + auto it = data_.find(key); + return (it != data_.end()) ? it->second : ""; // 如果没有找到键返回空字符串 + } +}; + +Settings set; + +void read(){ + (void)set.get("1"); +} + +void write(){ + set.set("1", "a"); +} + +int main(){ + std::thread t{ read }; + std::thread t2{ read }; + std::thread t3{ read }; + std::thread t4{ read }; + std::thread t5{ write }; + t.join(); + t2.join(); + t3.join(); + t4.join(); + t5.join(); +} \ No newline at end of file diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/20recursive_mutex.cpp b/code/ModernCpp-ConcurrentProgramming-Tutorial/20recursive_mutex.cpp new file mode 100644 index 00000000..aa01fd21 --- /dev/null +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/20recursive_mutex.cpp @@ -0,0 +1,21 @@ +#include +#include +#include + +std::recursive_mutex mtx; + +void recursive_function(int count) { + std::lock_guard lc{ mtx }; + std::cout << "Locked by thread: " << std::this_thread::get_id() << ", count: " << count << std::endl; + if (count > 0) { + recursive_function(count - 1); + } +} + +int main() { + std::thread t1(recursive_function, 3); + std::thread t2(recursive_function, 2); + + t1.join(); + t2.join(); +} \ No newline at end of file diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt index 1bd28475..94b0963f 100644 --- a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required (VERSION 3.8) +cmake_minimum_required (VERSION 3.8) project ("ModernCpp-ConcurrentProgramming-Tutorial") @@ -7,9 +7,9 @@ set(CMAKE_CXX_STANDARD 17) SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) if(MSVC) - add_compile_options("/utf-8" "/permissive-") + add_compile_options("/utf-8" "/permissive-" "/Zc:nrvo" "/Od") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") add_compile_options("-finput-charset=UTF-8" "-fexec-charset=UTF-8") endif() -add_executable(ModernCpp-ConcurrentProgramming-Tutorial "01-HelloWorld.cpp") +add_executable(ModernCpp-ConcurrentProgramming-Tutorial "20recursive_mutex.cpp") diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/test/test_mutex.cpp b/code/ModernCpp-ConcurrentProgramming-Tutorial/test/test_mutex.cpp new file mode 100644 index 00000000..c8a0555d --- /dev/null +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/test/test_mutex.cpp @@ -0,0 +1,3 @@ +#include + +std::mutex some_mutex; diff --git "a/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" "b/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" index 07c54015..ef2d5342 100644 --- "a/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" +++ "b/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" @@ -974,7 +974,7 @@ _NODISCARD_CTOR_JTHREAD explicit jthread(_Fn&& _Fx, _Args&&... _Ax) { ### 总结 -**零开销原则**应当很好理解。我们本节的难点只在于使用到了一些 MSVC STL 的源码实现来配合理解,其主要在于“线程停止”。线程停止设施你会感觉是一种类似与外部与线程进行某种信号通信的设施,`std::stop_source` 和 `std::stop_token` 都与线程对象关联,然后来管理函数到底如何执行。 +**零开销原则**应当很好理解。我们本节的难点只在于使用到了一些 MSVC STL 的源码实现来配合理解,其主要在于“线程停止”。线程停止设施你会感觉是一种类似于外部与线程进行某种信号通信的设施,`std::stop_source` 和 `std::stop_token` 都与线程对象关联,然后来管理函数到底如何执行。 我们并没有举很多的例子,我们觉得这一个小例子所牵扯到的内容也就足够了,关键在于理解其设计与概念。 @@ -986,6 +986,6 @@ _NODISCARD_CTOR_JTHREAD explicit jthread(_Fn&& _Fx, _Args&&... _Ax) { 本章节的内容围绕着:“使用线程”,也就是"**使用 `std::thread`**"展开, `std::thread` 是我们学习 C++ 并发支持库的重中之重,在最后谈起了 C++20 引入的 `std::jthread` ,它的使用与概念也非常的简单。本章的内容在市面上并不算少见,但是却是少有的**准确与完善**。即使你早已学习乃至使用 C++ 标准库进行多线程编程,我相信本章也一定可以让你收获良多。 -并且如果是第一次学习本章的内容,能会有一些难以理解的地方。建议你多思考、多记忆,并在以后反复查看和实践。 +并且如果是第一次学习本章的内容,可能会有一些难以理解的地方。建议你多思考、多记忆,并在以后反复查看和实践。 我尽量以简单通俗的方式进行讲解。学完本章后,你可能还无法在实际环境利用多线程提升程序效率,至少还需要学习到使用互斥量来保护共享数据,才能实际应用多线程编程。 diff --git "a/md/03\345\205\261\344\272\253\346\225\260\346\215\256.md" "b/md/03\345\205\261\344\272\253\346\225\260\346\215\256.md" index f1633a48..2bd09ee0 100644 --- "a/md/03\345\205\261\344\272\253\346\225\260\346\215\256.md" +++ "b/md/03\345\205\261\344\272\253\346\225\260\346\215\256.md" @@ -75,7 +75,7 @@ std::thread t1{f}, t2{f}, t3{f}; // 未定义行为 ## 使用互斥量 -互斥量(Mutex),又称为互斥锁(或者直接被称作“锁”),是一种用来保护**临界区**[^1]的特殊对象,其相当于实现了一个公共的“**标志位**”。它可以处于锁定(locked)状态,也可以处于解锁(unlocked)状态: +互斥量(Mutex),又常被称为互斥锁、互斥体(或者直接被称作“锁”),是一种用来保护**临界区**[^1]的特殊对象,其相当于实现了一个公共的“**标志位**”。它可以处于锁定(locked)状态,也可以处于解锁(unlocked)状态: 1. 如果互斥量是锁定的,通常说某个特定的线程正持有这个锁。 @@ -336,7 +336,7 @@ public: Data* p = nullptr; void malicious_function(Data& protected_data){ - p = &protected_data; // 受保护的数据被传递 + p = &protected_data; // 受保护的数据被传递到外部 } Data_wrapper d; @@ -482,7 +482,6 @@ void swap(X& lhs, X& rhs) { std::unique_lock lock2{ rhs.m, std::defer_lock }; std::lock(lock1, lock2); swap(lhs.object, rhs.object); - ++n; } ``` @@ -621,11 +620,10 @@ void f() { 一种可能的使用是允许函数去锁住一个互斥量,并将互斥量的所有权转移到调用者上,所以调用者可以在这个锁保护的范围内执行代码。 ```cpp -std::unique_lockget_lock(){ +std::unique_lock get_lock(){ extern std::mutex some_mutex; std::unique_lock lk{ some_mutex }; return lk; - } void process_data(){ std::unique_lock lk{ get_lock() }; @@ -678,8 +676,7 @@ void process_data(){ 2. C++ 标准委员会也认为处理此问题很重要,**所以标准库提供了 [`std::call_once`](https://zh.cppreference.com/w/cpp/thread/call_once) 和 [`std::once_flag`](https://zh.cppreference.com/w/cpp/thread/once_flag)** 来处理这种情况。比起锁住互斥量并显式检查指针,每个线程只需要使用 `std::call_once` 就可以。**使用 `std::call_once` 比显式使用互斥量消耗的资源更少,特别是当初始化完成之后**。 ```cpp - std::shared_ptrptr; - std::mutex m; + std::shared_ptr ptr; std::once_flag resource_flag; void init_resource(){ @@ -811,7 +808,7 @@ int main() { - [**`lock`**](https://zh.cppreference.com/w/cpp/thread/recursive_mutex/lock):线程可以在递归互斥体上重复调用 `lock`。在线程调用 `unlock` 匹配次数后,所有权才会得到**释放**。 -- [**`unlock`**](https://zh.cppreference.com/w/cpp/thread/recursive_mutex/unlock):若所有权层数为 1(此线程对 [lock()](https://zh.cppreference.com/w/cpp/thread/recursive_mutex/lock) 的调用恰好比 `unlock()` 多一次 )则**解锁互斥体**,否则将所有权层数减少 1。 +- [**`unlock`**](https://zh.cppreference.com/w/cpp/thread/recursive_mutex/unlock):若所有权层数为 1(此线程对 [lock()](https://zh.cppreference.com/w/cpp/thread/recursive_mutex/lock) 的调用恰好比 `unlock()` 多一次 )则**解锁互斥量**,否则将所有权层数减少 1。 我们重点的强调了一下这两个成员函数的这个概念,其实也很简单,总而言之就是 `unlock` 必须和 `lock` 的调用次数一样,才会真正解锁互斥量。 From d4af5eda397a63f2bf3cccfb6142f339c940a0bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Fri, 20 Sep 2024 19:53:32 +0800 Subject: [PATCH 47/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BB=A5=E5=8F=8ACMake=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E5=BC=95=E5=85=A5=E4=B8=89=E6=96=B9=E5=BA=93=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E3=80=82=20=E6=95=99=E6=A1=88=E8=BF=98=E6=9C=AA?= =?UTF-8?q?=E5=AE=8C=E6=88=90=EF=BC=8C=E5=85=88=E7=BC=96=E5=86=99=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=A4=BA=E4=BE=8B=EF=BC=8C=E5=90=8E=E5=8F=B0=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E9=9F=B3=E4=B9=90=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + ...0\347\232\204\345\220\227\357\274\237.cpp" | 26 +++++ ...3\345\255\230\345\202\250\346\234\237.cpp" | 15 +++ ...4\344\270\216\344\275\277\347\224\250.cpp" | 27 +++++ ...6\346\210\226\346\235\241\344\273\266.cpp" | 32 ++++++ ...0\347\232\204\351\230\237\345\210\227.cpp" | 67 ++++++++++++ .../CMakeLists.txt | 14 ++- .../test.cpp | 25 +++++ .../test/AduioPlayer.h | 103 ++++++++++++++++++ ...14\346\255\245\346\223\215\344\275\234.md" | 6 +- 10 files changed, 312 insertions(+), 4 deletions(-) create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/21new\345\222\214delete\346\230\257\347\272\277\347\250\213\345\256\211\345\205\250\347\232\204\345\220\227\357\274\237.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/22\347\272\277\347\250\213\345\255\230\345\202\250\346\234\237.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/23\345\261\200\351\203\250\343\200\201\345\205\250\345\261\200\343\200\201\347\272\277\347\250\213\343\200\201CPU\345\217\230\351\207\217\347\232\204\345\257\271\346\257\224\344\270\216\344\275\277\347\224\250.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/24\347\255\211\345\276\205\344\272\213\344\273\266\346\210\226\346\235\241\344\273\266.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/25\347\272\277\347\250\213\345\256\211\345\205\250\347\232\204\351\230\237\345\210\227.cpp" create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/test.cpp create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/test/AduioPlayer.h diff --git a/.gitignore b/.gitignore index 18f381cb..ac6a9ca8 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,7 @@ node_modules/ .vs/ x64/ out/ +bin/ *.ilk *.pdb diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/21new\345\222\214delete\346\230\257\347\272\277\347\250\213\345\256\211\345\205\250\347\232\204\345\220\227\357\274\237.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/21new\345\222\214delete\346\230\257\347\272\277\347\250\213\345\256\211\345\205\250\347\232\204\345\220\227\357\274\237.cpp" new file mode 100644 index 00000000..102a0295 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/21new\345\222\214delete\346\230\257\347\272\277\347\250\213\345\256\211\345\205\250\347\232\204\345\220\227\357\274\237.cpp" @@ -0,0 +1,26 @@ +#include +#include +#include + +struct X { + X(int v) { // 主要防止有人认为构造函数、析构函数啊,是线程安全的 + std::cout << v << " 🤣\n"; + } +}; + +void f() { + X* p = new X{ 1 }; // 存在数据竞争 + delete p; +} + +int main() +{ + for (int i = 0; i < 10; ++i) { + std::thread t{ f }; + std::thread t2{ f }; + t.join(); + t2.join(); + } + + // C++ 保证的是内存的申请和释放 这种全局状态 是线程安全的 +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/22\347\272\277\347\250\213\345\255\230\345\202\250\346\234\237.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/22\347\272\277\347\250\213\345\255\230\345\202\250\346\234\237.cpp" new file mode 100644 index 00000000..61a6fc4e --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/22\347\272\277\347\250\213\345\255\230\345\202\250\346\234\237.cpp" @@ -0,0 +1,15 @@ +#include +#include + +int global_counter = 0; +__declspec(thread) int thread_local_counter = 0; + +void print_counters() { + std::cout << "global:" << global_counter++ << '\n'; + std::cout << "thread_local:" << thread_local_counter++ << '\n'; +} + +int main() { + std::thread{ print_counters }.join(); + std::thread{ print_counters }.join(); +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/23\345\261\200\351\203\250\343\200\201\345\205\250\345\261\200\343\200\201\347\272\277\347\250\213\343\200\201CPU\345\217\230\351\207\217\347\232\204\345\257\271\346\257\224\344\270\216\344\275\277\347\224\250.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/23\345\261\200\351\203\250\343\200\201\345\205\250\345\261\200\343\200\201\347\272\277\347\250\213\343\200\201CPU\345\217\230\351\207\217\347\232\204\345\257\271\346\257\224\344\270\216\344\275\277\347\224\250.cpp" new file mode 100644 index 00000000..ce460983 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/23\345\261\200\351\203\250\343\200\201\345\205\250\345\261\200\343\200\201\347\272\277\347\250\213\343\200\201CPU\345\217\230\351\207\217\347\232\204\345\257\271\346\257\224\344\270\216\344\275\277\347\224\250.cpp" @@ -0,0 +1,27 @@ +#include +#include + +thread_local int n = (std::puts("thread_local init"), 0); + +void f(){ + (void)n; // 防止 gcc 与 clang 优化 + std::puts("f"); +} + +void f2(){ + thread_local static int n = (std::puts("f2 init"), 0); +} + +int main(){ + (void)n; // 防止 gcc 与 clang 优化 + std::cout << "main\n"; + std::thread{ f }.join(); + f2(); + f2(); + f2(); +} + +// gcc 与 clang 存在优化,会出现与 msvc 不同的结果,它们直接将线程变量优化掉了 +// 这应该视作 bug。 +// 视频中想到 std::async 是下一章的内容跳过了(想到的是 msvc 的一个问题),忘记了 gcc 与 clang 此处也存在问题。 +// https://godbolt.org/z/qa6YfMqP7 \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/24\347\255\211\345\276\205\344\272\213\344\273\266\346\210\226\346\235\241\344\273\266.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/24\347\255\211\345\276\205\344\272\213\344\273\266\346\210\226\346\235\241\344\273\266.cpp" new file mode 100644 index 00000000..7c8718bd --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/24\347\255\211\345\276\205\344\272\213\344\273\266\346\210\226\346\235\241\344\273\266.cpp" @@ -0,0 +1,32 @@ +#include +#include +#include +#include +#include +using namespace std::chrono_literals; + +std::mutex mtx; // 互斥量 +std::condition_variable_any cv; // 条件变量 +bool arrived = false; + +void wait_for_arrival() { + std::unique_lock lck(mtx); // 上锁 + cv.wait(lck, [] { return arrived; }); // 等待 arrived 变为 true 会解锁的 再次上锁 + std::cout << "到达目的地,可以下车了!" << std::endl; +} + +void simulate_arrival() { + std::this_thread::sleep_for(std::chrono::seconds(5)); // 模拟地铁到站,假设5秒后到达目的地 + { + std::lock_guard lck(mtx); + arrived = true; // 设置条件变量为 true,表示到达目的地 + } + cv.notify_one(); // 通知等待的线程 +} + +int main(){ + std::thread t{ wait_for_arrival }; + std::thread t2{ simulate_arrival }; + t.join(); + t2.join(); +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/25\347\272\277\347\250\213\345\256\211\345\205\250\347\232\204\351\230\237\345\210\227.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/25\347\272\277\347\250\213\345\256\211\345\205\250\347\232\204\351\230\237\345\210\227.cpp" new file mode 100644 index 00000000..df90476c --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/25\347\272\277\347\250\213\345\256\211\345\205\250\347\232\204\351\230\237\345\210\227.cpp" @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include +#include +using namespace std::chrono_literals; + +template +class threadsafe_queue { + mutable std::mutex m; // M&M 原则 互斥量,用于保护队列操作的独占访问 + std::condition_variable data_cond; // 条件变量,用于在队列为空时等待 + std::queue data_queue; // 实际存储数据的队列 +public: + threadsafe_queue() {} + + void push(T new_value) { + { + std::lock_guard lk{ m }; + std::cout << "push:" << new_value << std::endl; + data_queue.push(new_value); + } + data_cond.notify_one(); + } + // 从队列中弹出元素(阻塞直到队列不为空) + void pop(T& value) { + std::unique_lock lk{ m }; + data_cond.wait(lk, [this] {return !data_queue.empty(); }); // 解除阻塞 重新获取锁 lock + value = data_queue.front(); + std::cout << "pop:" << value << std::endl; + data_queue.pop(); + } + // 从队列中弹出元素(阻塞直到队列不为空),并返回一个指向弹出元素的 shared_ptr + std::shared_ptr pop() { + std::unique_lock lk{ m }; + data_cond.wait(lk, [this] {return !data_queue.empty(); }); + std::shared_ptrres{ std::make_shared(data_queue.front()) }; + data_queue.pop(); + return res; + } + bool empty()const { + std::lock_guard lk(m); + return data_queue.empty(); + } +}; + +void producer(threadsafe_queue& q) { + for (int i = 0; i < 5; ++i) { + q.push(i); + } +} +void consumer(threadsafe_queue& q) { + for (int i = 0; i < 5; ++i) { + int value{}; + q.pop(value); + } +} + +int main() { + threadsafe_queue q; + + std::thread producer_thread(producer, std::ref(q)); + std::thread consumer_thread(consumer, std::ref(q)); + + producer_thread.join(); + consumer_thread.join(); +} \ No newline at end of file diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt index 94b0963f..66bd7b5f 100644 --- a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt @@ -7,9 +7,19 @@ set(CMAKE_CXX_STANDARD 17) SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) if(MSVC) - add_compile_options("/utf-8" "/permissive-" "/Zc:nrvo" "/Od") + add_compile_options("/utf-8" "/permissive-" "/Zc:nrvo") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") add_compile_options("-finput-charset=UTF-8" "-fexec-charset=UTF-8") endif() -add_executable(ModernCpp-ConcurrentProgramming-Tutorial "20recursive_mutex.cpp") +add_executable(${PROJECT_NAME} "25线程安全的队列.cpp") + + +# 设置 SFML 的 CMake 路径 +set(SFML_DIR "D:/lib/SFML-2.6.1-windows-vc17-64-bit/SFML-2.6.1/lib/cmake/SFML") + +# 查找 SFML 库并设置链接选项 +find_package(SFML 2.6.1 COMPONENTS system window graphics audio network REQUIRED) + +# 链接 SFML 库到项目 +target_link_libraries(${PROJECT_NAME} sfml-system sfml-window sfml-graphics sfml-audio sfml-network) diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/test.cpp b/code/ModernCpp-ConcurrentProgramming-Tutorial/test.cpp new file mode 100644 index 00000000..05d2784d --- /dev/null +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/test.cpp @@ -0,0 +1,25 @@ +#include "test/AduioPlayer.h" + +AudioPlayer audioPlayer; + +int main(){ + audioPlayer.addAudioPath(AudioPlayer::soundResources[4]); + audioPlayer.addAudioPath(AudioPlayer::soundResources[5]); + audioPlayer.addAudioPath(AudioPlayer::soundResources[6]); + audioPlayer.addAudioPath(AudioPlayer::soundResources[7]); + + std::thread t{ []{ + std::this_thread::sleep_for(1s); + audioPlayer.addAudioPath(AudioPlayer::soundResources[1]); + } }; + std::thread t2{ []{ + audioPlayer.addAudioPath(AudioPlayer::soundResources[0]); + } }; + + std::cout << "乐\n"; + + t.join(); + t2.join(); + + std::cout << "end\n"; +} \ No newline at end of file diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/test/AduioPlayer.h b/code/ModernCpp-ConcurrentProgramming-Tutorial/test/AduioPlayer.h new file mode 100644 index 00000000..44142d3a --- /dev/null +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/test/AduioPlayer.h @@ -0,0 +1,103 @@ +#ifndef AUDIOPLAYER_H +#define AUDIOPLAYER_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std::chrono_literals; + +class AudioPlayer { +public: + AudioPlayer() : stop{ false }, player_thread{ &AudioPlayer::playMusic, this } + {} + + ~AudioPlayer() { + // 等待队列中所有音乐播放完毕 + while (!audio_queue.empty()) { + std::this_thread::sleep_for(50ms); + } + stop = true; + cond.notify_all(); + if (player_thread.joinable()) { + player_thread.join(); + } + } + + void addAudioPath(const std::string& path) { + std::lock_guard lock{ mtx }; + audio_queue.push(path); + cond.notify_one(); // 通知线程新的音频 + } + +private: + void playMusic() { + while (!stop) { + std::string path; + { + std::unique_lock lock{ mtx }; + cond.wait(lock, [this] { return !audio_queue.empty() || stop; }); + + if (audio_queue.empty()) return; // 防止在对象为空时析构出错 + + path = audio_queue.front(); + audio_queue.pop(); + } + + if (!music.openFromFile(path)) { + std::cerr << "无法加载音频文件: " << path << std::endl; + continue; // 继续播放下一个音频 + } + + music.play(); + + // 等待音频播放完毕 + while (music.getStatus() == sf::SoundSource::Playing) { + sf::sleep(sf::seconds(0.1f)); // sleep 避免忙等占用CPU + } + } + } + + std::atomic stop; + std::thread player_thread; + std::mutex mtx; + std::condition_variable cond; + std::queue audio_queue; + sf::Music music; + +public: + static constexpr std::array soundResources{ + "./sound/01初始化失败.ogg", + "./sound/02初始化成功.ogg", + "./sound/03试剂不足,请添加.ogg", + "./sound/04试剂已失效,请更新.ogg", + "./sound/05清洗液不足,请添加.ogg", + "./sound/06废液桶即将装满,请及时清空.ogg", + "./sound/07废料箱即将装满,请及时清空.ogg", + "./sound/08激发液A液不足,请添加.ogg", + "./sound/09激发液B液不足,请添加.ogg", + "./sound/10反应杯不足,请添加.ogg", + "./sound/11检测全部完成.ogg" + }; + enum SoundIndex { + InitializationFailed, + InitializationSuccessful, + ReagentInsufficient, + ReagentExpired, + CleaningAgentInsufficient, + WasteBinAlmostFull, + WasteContainerAlmostFull, + LiquidAInsufficient, + LiquidBInsufficient, + ReactionCupInsufficient, + DetectionCompleted, + SoundCount // 总音频数量,用于计数 + }; +}; + +#endif // AUDIOPLAYER_H diff --git "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" index 4060a01e..8b844b52 100644 --- "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" +++ "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" @@ -1,6 +1,6 @@ # 同步操作 -"同步操作"是指在计算机科学和信息技术中的一种操作方式,其中不同的任务或操作按顺序执行,一个操作完成后才能开始下一个操作。在多线程编程中,各个任务通常需要通过同步操作进行相互**协调和等待**,以确保数据的**一致性**和**正确性**。 +"同步操作"是指在计算机科学和信息技术中的一种操作方式,其中不同的任务或操作按顺序执行,一个操作完成后才能开始下一个操作。在多线程编程中,各个任务通常需要通过**同步设施**进行相互**协调和等待**,以确保数据的**一致性**和**正确性**。 本章的主要内容有: @@ -146,7 +146,7 @@ void wait(unique_lock& _Lck, _Predicate _Pred) { ## 线程安全的队列 -在本节中,我们介绍了一个更为复杂的示例,以巩固我们对条件变量的学习。为了实现一个线程安全的队列,我们需要考虑以下两个关键点: +在本节中,我们介将绍一个更为复杂的示例,以巩固我们对条件变量的学习。为了实现一个线程安全的队列,我们需要考虑以下两个关键点: 1. 当执行 `push` 操作时,需要确保没有其他线程正在执行 `push` 或 `pop` 操作;同样,在执行 `pop` 操作时,也需要确保没有其他线程正在执行 `push` 或 `pop` 操作。 @@ -286,6 +286,8 @@ Consumer 线程弹出元素 4: 到此,也就可以了。 +## 使用条件变量实现后台音乐播放 + ## 使用 `future` 举个例子:我们在车站等车,你可能会做一些别的事情打发时间,比如学习[现代 C++ 模板教程](https://github.com/Mq-b/Modern-Cpp-templates-tutorial)、观看 [mq白](https://space.bilibili.com/1292761396) 的视频教程、玩手机等。不过,你始终在等待一件事情:***车到站***。 From 8954e3c9f1b9fb153f2ac016ba85bcb48e47012b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sat, 21 Sep 2024 11:36:06 +0800 Subject: [PATCH 48/62] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=80=E8=8A=82?= =?UTF-8?q?=EF=BC=9A=E4=BD=BF=E7=94=A8=E6=9D=A1=E4=BB=B6=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=90=8E=E5=8F=B0=E6=8F=90=E7=A4=BA=E9=9F=B3?= =?UTF-8?q?=E6=92=AD=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\351\237\263\346\222\255\346\224\276.cpp" | 106 +++++++++++++++ .../CMakeLists.txt | 6 +- .../test/AduioPlayer.h | 26 ++-- ...14\346\255\245\346\223\215\344\275\234.md" | 127 +++++++++++++++++- 4 files changed, 247 insertions(+), 18 deletions(-) create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/26\344\275\277\347\224\250\346\235\241\344\273\266\345\217\230\351\207\217\345\256\236\347\216\260\345\220\216\345\217\260\346\217\220\347\244\272\351\237\263\346\222\255\346\224\276.cpp" diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/26\344\275\277\347\224\250\346\235\241\344\273\266\345\217\230\351\207\217\345\256\236\347\216\260\345\220\216\345\217\260\346\217\220\347\244\272\351\237\263\346\222\255\346\224\276.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/26\344\275\277\347\224\250\346\235\241\344\273\266\345\217\230\351\207\217\345\256\236\347\216\260\345\220\216\345\217\260\346\217\220\347\244\272\351\237\263\346\222\255\346\224\276.cpp" new file mode 100644 index 00000000..88e4ca18 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/26\344\275\277\347\224\250\346\235\241\344\273\266\345\217\230\351\207\217\345\256\236\347\216\260\345\220\216\345\217\260\346\217\220\347\244\272\351\237\263\346\222\255\346\224\276.cpp" @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std::chrono_literals; + +class AudioPlayer{ +public: + AudioPlayer() : stop {false}, player_thread{ &AudioPlayer::playMusic, this } + {} + + ~AudioPlayer(){ + while (!audio_queue.empty()){ + std::this_thread::sleep_for(50ms); + } + stop = true; + cond.notify_all(); + if(player_thread.joinable()){ + player_thread.join(); + } + } + + void addAudioPath(const std::string& path){ + std::lock_guard lc{ m }; + audio_queue.push(path); + cond.notify_one(); + } + +private: + void playMusic(){ + while(!stop){ + std::string path; + { + std::unique_lock lock{ m }; + // 条件不满足,就解锁 unlock,让其它线程得以运行 如果被唤醒了,就会重新获取锁 lock + cond.wait(lock, [this] {return !audio_queue.empty() || stop; }); + + if (audio_queue.empty()) return; // 防止对象为空时出问题 + + path = audio_queue.front(); // 取出 + audio_queue.pop(); // 取出后就删除这个元素,表示此元素以及被使用 + } + + if(!music.openFromFile(path)){ + std::cerr << "无法加载音频文件: " << path << std::endl; + continue; + } + + music.play(); // 异步 非阻塞 + + while(music.getStatus() == sf::SoundSource::Playing){ + sf::sleep(sf::seconds(0.1f)); // sleep 避免忙等 占用 CPU + } + } + } + + std::atomic stop; // 控制线程的停止与退出 + std::thread player_thread; // 后台执行音频播放任务的专用线程 + std::mutex m; // 保护共享资源 + std::condition_variable cond; // 控制线程的等待和唤醒,当有新的任务的时候通知播放线程 + std::queue audio_queue; // 音频任务队列,存储待播放的音频文件的路径 + sf::Music music; // SFML 音频播放器对象,用来加载播放音频 + +public: + static constexpr std::array soundResources{ + "./sound/01初始化失败.ogg", + "./sound/02初始化成功.ogg", + "./sound/03试剂不足,请添加.ogg", + "./sound/04试剂已失效,请更新.ogg", + "./sound/05清洗液不足,请添加.ogg", + "./sound/06废液桶即将装满,请及时清空.ogg", + "./sound/07废料箱即将装满,请及时清空.ogg", + "./sound/08激发液A液不足,请添加.ogg", + "./sound/09激发液B液不足,请添加.ogg", + "./sound/10反应杯不足,请添加.ogg", + "./sound/11检测全部完成.ogg" + }; +}; + +AudioPlayer audioPlayer; + +int main() { + audioPlayer.addAudioPath(AudioPlayer::soundResources[4]); + audioPlayer.addAudioPath(AudioPlayer::soundResources[5]); + audioPlayer.addAudioPath(AudioPlayer::soundResources[6]); + audioPlayer.addAudioPath(AudioPlayer::soundResources[7]); + + std::thread t{ [] { + std::this_thread::sleep_for(1s); + audioPlayer.addAudioPath(AudioPlayer::soundResources[1]); + } }; + std::thread t2{ [] { + audioPlayer.addAudioPath(AudioPlayer::soundResources[0]); + } }; + + std::cout << "乐\n"; + + t.join(); + t2.join(); + + std::cout << "end\n"; +} \ No newline at end of file diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt index 66bd7b5f..d90bdce2 100644 --- a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt @@ -12,14 +12,14 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "C add_compile_options("-finput-charset=UTF-8" "-fexec-charset=UTF-8") endif() -add_executable(${PROJECT_NAME} "25线程安全的队列.cpp") +add_executable(${PROJECT_NAME} "26使用条件变量实现后台提示音播放.cpp") # 设置 SFML 的 CMake 路径 set(SFML_DIR "D:/lib/SFML-2.6.1-windows-vc17-64-bit/SFML-2.6.1/lib/cmake/SFML") -# 查找 SFML 库并设置链接选项 +# 查找 SFML 库 find_package(SFML 2.6.1 COMPONENTS system window graphics audio network REQUIRED) -# 链接 SFML 库到项目 +# 链接 SFML 库到项目 设置链接选项 target_link_libraries(${PROJECT_NAME} sfml-system sfml-window sfml-graphics sfml-audio sfml-network) diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/test/AduioPlayer.h b/code/ModernCpp-ConcurrentProgramming-Tutorial/test/AduioPlayer.h index 44142d3a..2b51ecd5 100644 --- a/code/ModernCpp-ConcurrentProgramming-Tutorial/test/AduioPlayer.h +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/test/AduioPlayer.h @@ -30,9 +30,9 @@ class AudioPlayer { } void addAudioPath(const std::string& path) { - std::lock_guard lock{ mtx }; - audio_queue.push(path); - cond.notify_one(); // 通知线程新的音频 + std::lock_guard lock{ mtx }; // 互斥量确保了同一时间不会有其它地方在操作共享资源(队列) + audio_queue.push(path); // 为队列添加元素 表示有新的提示音需要播放 + cond.notify_one(); // 通知线程新的音频 } private: @@ -45,8 +45,8 @@ class AudioPlayer { if (audio_queue.empty()) return; // 防止在对象为空时析构出错 - path = audio_queue.front(); - audio_queue.pop(); + path = audio_queue.front(); // 从队列中取出元素 + audio_queue.pop(); // 取出后就删除元素,表示此元素已被使用 } if (!music.openFromFile(path)) { @@ -58,18 +58,18 @@ class AudioPlayer { // 等待音频播放完毕 while (music.getStatus() == sf::SoundSource::Playing) { - sf::sleep(sf::seconds(0.1f)); // sleep 避免忙等占用CPU + sf::sleep(sf::seconds(0.1f)); // sleep 避免忙等占用 CPU } } } - std::atomic stop; - std::thread player_thread; - std::mutex mtx; - std::condition_variable cond; - std::queue audio_queue; - sf::Music music; - + std::atomic stop; // 控制线程的停止与退出, + std::thread player_thread; // 后台执行音频任务的专用线程 + std::mutex mtx; // 保护共享资源 + std::condition_variable cond; // 控制线程等待和唤醒,当有新任务时通知音频线程 + std::queue audio_queue; // 音频任务队列,存储待播放的音频文件路径 + sf::Music music; // SFML 音频播放器,用于加载和播放音频文件 + public: static constexpr std::array soundResources{ "./sound/01初始化失败.ogg", diff --git "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" index 8b844b52..b21bbb15 100644 --- "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" +++ "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" @@ -180,7 +180,7 @@ public: std::shared_ptr pop() { std::unique_lock lk{ m }; data_cond.wait(lk, [this] {return !data_queue.empty(); }); - std::shared_ptrres { std::make_shared(data_queue.front()) }; + std::shared_ptr res { std::make_shared(data_queue.front()) }; data_queue.pop(); return res; } @@ -286,7 +286,130 @@ Consumer 线程弹出元素 4: 到此,也就可以了。 -## 使用条件变量实现后台音乐播放 +## 使用条件变量实现后台提示音播放 + +一个常见的场景是:当你的软件完成了主要功能后,领导可能突然要求添加一些竞争对手产品的功能。比如领导看到了人家的设备跑起来总是有一些播报,说明当前的情况,执行的过程,或者报错了也会有提示音说明。于是就想让我们的程序也增加“**语音提示**”的功能。此时,你需要考虑如何在程序运行到不同状态时添加适当的语音播报,并且**确保这些提示音的播放不会影响其他功能的正常运行**。 + +为了不影响程序的流畅执行,提示音的播放显然不能占据业务线程的资源。我们需要额外启动一个线程来专门处理这个任务。 + +但是,大多数的提示音播放都是短暂且简单。如果每次播放提示音时都新建一个线程,且不说创建线程也需要大量时间,可能影响业务正常的执行任务的流程,就光是其频繁创建线程的开销也是不能接受的。 + +--- + +因此,更合理的方案是:**在程序启动时,就启动一个专门用于播放提示音的线程。当没有需要播放的提示时,该线程会一直处于等待状态;一旦有提示音需要播放,线程就被唤醒,完成播放任务**。 + +具体来说,我们可以通过条件变量来实现这一逻辑,核心是监控一个音频队列。我们可以封装一个类型,包含以下功能: + +- 一个成员函数在对象构造时就启动,使用条件变量监控队列是否为空,互斥量确保共享资源的同步。如果队列中有任务,就取出并播放提示音;如果队列为空,则线程保持阻塞状态,等待新的任务到来。 +- 提供一个外部函数,以供在需要播放提示音的时候调用它,向队列添加新的元素,该函数需要通过互斥量来保护数据一致性,并在成功添加任务后唤醒条件变量,通知播放线程执行任务。 + +> 这种设计通过合理利用**条件变量**和**互斥量**,不仅有效减少了 CPU 的无效开销,还能够确保主线程的顺畅运行。它不仅适用于提示音的播放,还能扩展用于其他类似的后台任务场景。 + +我们引入 [SFML](https://github.com/SFML/SFML) 三方库进行声音播放,然后再自己进行上层封装。 + +```CPP +class AudioPlayer { +public: + AudioPlayer() : stop{ false }, player_thread{ &AudioPlayer::playMusic, this } + {} + + ~AudioPlayer() { + // 等待队列中所有音乐播放完毕 + while (!audio_queue.empty()) { + std::this_thread::sleep_for(50ms); + } + stop = true; + cond.notify_all(); + if (player_thread.joinable()) { + player_thread.join(); + } + } + + void addAudioPath(const std::string& path) { + std::lock_guard lock{ mtx }; // 互斥量确保了同一时间不会有其它地方在操作共享资源(队列) + audio_queue.push(path); // 为队列添加元素 表示有新的提示音需要播放 + cond.notify_one(); // 通知线程新的音频 + } + +private: + void playMusic() { + while (!stop) { + std::string path; + { + std::unique_lock lock{ mtx }; + cond.wait(lock, [this] { return !audio_queue.empty() || stop; }); + + if (audio_queue.empty()) return; // 防止在对象为空时析构出错 + + path = audio_queue.front(); // 从队列中取出元素 + audio_queue.pop(); // 取出后就删除元素,表示此元素已被使用 + } + + if (!music.openFromFile(path)) { + std::cerr << "无法加载音频文件: " << path << std::endl; + continue; // 继续播放下一个音频 + } + + music.play(); + + // 等待音频播放完毕 + while (music.getStatus() == sf::SoundSource::Playing) { + sf::sleep(sf::seconds(0.1f)); // sleep 避免忙等占用 CPU + } + } + } + + std::atomic stop; // 控制线程的停止与退出, + std::thread player_thread; // 后台执行音频任务的专用线程 + std::mutex mtx; // 保护共享资源 + std::condition_variable cond; // 控制线程等待和唤醒,当有新任务时通知音频线程 + std::queue audio_queue; // 音频任务队列,存储待播放的音频文件路径 + sf::Music music; // SFML 音频播放器,用于加载和播放音频文件 +}; +``` + +该代码实现了一个简单的**后台音频播放类型**,通过**条件变量**和**互斥量**确保播放线程 `playMusic` 只在只在**有音频任务需要播放时工作**(当外部通过调用 `addAudioPath()` 向队列添加播放任务时)。在没有任务时,线程保持等待状态,避免占用 CPU 资源影响主程序的运行。 + +此外,关于提示音的播报,为了避免每次都手动添加路径,我们可以创建一个音频资源数组,便于使用: + +```cpp +static constexpr std::array soundResources{ + "./sound/01初始化失败.ogg", + "./sound/02初始化成功.ogg", + "./sound/03试剂不足,请添加.ogg", + "./sound/04试剂已失效,请更新.ogg", + "./sound/05清洗液不足,请添加.ogg", + "./sound/06废液桶即将装满,请及时清空.ogg", + "./sound/07废料箱即将装满,请及时清空.ogg", + "./sound/08激发液A液不足,请添加.ogg", + "./sound/09激发液B液不足,请添加.ogg", + "./sound/10反应杯不足,请添加.ogg", + "./sound/11检测全部完成.ogg" +}; +``` + +为了提高代码的可读性,我们还可以使用一个枚举类型来表示音频资源的索引: + +```cpp +enum SoundIndex { + InitializationFailed, + InitializationSuccessful, + ReagentInsufficient, + ReagentExpired, + CleaningAgentInsufficient, + WasteBinAlmostFull, + WasteContainerAlmostFull, + LiquidAInsufficient, + LiquidBInsufficient, + ReactionCupInsufficient, + DetectionCompleted, + SoundCount // 总音频数量,用于计数 +}; +``` + +需要注意的是 SFML不支持 `.mp3` 格式的音频文件,大家可以使用 ffmpeg 或者其它软件[网站](https://www.freeconvert.com/audio-converter)将音频转换为支持的格式。 + +如果是测试使用,不知道去哪生成这些语音播报,我们推荐 [`tts-vue`](https://github.com/LokerL/tts-vue)。 ## 使用 `future` From de1f91afe1f778006c4b5505382d8b6e6d3f483a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sun, 22 Sep 2024 19:11:42 +0800 Subject: [PATCH 49/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E4=BF=AE=E6=94=B9=E7=AC=AC=E5=9B=9B?= =?UTF-8?q?=E7=AB=A0=E6=8E=AA=E8=BE=9E=E3=80=81=E6=A0=BC=E5=BC=8F=E3=80=81?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E8=A1=A5=E5=85=85=E4=BB=A3=E7=A0=81=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\350\277\224\345\233\236\345\200\274.cpp" | 13 +++++ .../28future\344\270\216 packaged_task.cpp" | 46 ++++++++++++++++ .../29\344\275\277\347\224\250promise.cpp" | 55 +++++++++++++++++++ ...6\346\200\201\345\217\230\345\214\226.cpp" | 16 ++++++ ...\347\255\211\345\276\205shared_future.cpp" | 37 +++++++++++++ ...\345\276\205-\346\227\266\351\222\237.cpp" | 14 +++++ .../CMakeLists.txt | 2 +- ...14\346\255\245\346\223\215\344\275\234.md" | 50 +++++++++++++---- 8 files changed, 222 insertions(+), 11 deletions(-) create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/27\345\210\233\345\273\272\345\274\202\346\255\245\344\273\273\345\212\241\350\216\267\345\217\226\350\277\224\345\233\236\345\200\274.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/28future\344\270\216 packaged_task.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/29\344\275\277\347\224\250promise.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/30future\347\232\204\347\212\266\346\200\201\345\217\230\345\214\226.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/31\345\244\232\344\270\252\347\272\277\347\250\213\347\232\204\347\255\211\345\276\205shared_future.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/32\351\231\220\346\227\266\347\255\211\345\276\205-\346\227\266\351\222\237.cpp" diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/27\345\210\233\345\273\272\345\274\202\346\255\245\344\273\273\345\212\241\350\216\267\345\217\226\350\277\224\345\233\236\345\200\274.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/27\345\210\233\345\273\272\345\274\202\346\255\245\344\273\273\345\212\241\350\216\267\345\217\226\350\277\224\345\233\236\345\200\274.cpp" new file mode 100644 index 00000000..cb33de38 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/27\345\210\233\345\273\272\345\274\202\346\255\245\344\273\273\345\212\241\350\216\267\345\217\226\350\277\224\345\233\236\345\200\274.cpp" @@ -0,0 +1,13 @@ +#include +#include +#include // 引入 future 头文件 + +void f() { + std::cout << std::this_thread::get_id() << '\n'; +} + +int main() { + auto t = std::async([] {}); + std::future future{ std::move(t) }; + future.wait(); // Error! 抛出异常 +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/28future\344\270\216 packaged_task.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/28future\344\270\216 packaged_task.cpp" new file mode 100644 index 00000000..abfa730a --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/28future\344\270\216 packaged_task.cpp" @@ -0,0 +1,46 @@ +#include +#include +#include + +template +void async_task(std::packaged_task& task, Args&&...args) { + // todo.. + task(std::forward(args)...); +} + +int main() { + std::packaged_task task([](int a, int b) { + return a + b; + }); + + int value = 50; + + std::future future = task.get_future(); + + // 创建一个线程来执行异步任务 + std::thread t{ [&] { async_task(task, value, value); } }; + std::cout << future.get() << '\n'; + t.join(); +} + +//int main(){ +// std::cout << "main: " << std::this_thread::get_id() << '\n'; +// +// // 只能移动不能复制 +// std::packaged_task task{ [](int a, int b) { +// std::cout << "packaged_task: " << std::this_thread::get_id() << '\n'; +// return std::pow(a, b); +// } }; +// +// std::future future = task.get_future(); +// +// // task(10, 2); // 调用 此处执行任务 +// +// std::thread t{ std::move(task) ,10,2 }; +// +// std::cout << "------\n"; +// +// std::cout << future.get() << '\n'; // 会阻塞,直到任务执行完毕 +// +// t.join(); +//} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/29\344\275\277\347\224\250promise.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/29\344\275\277\347\224\250promise.cpp" new file mode 100644 index 00000000..c37e3070 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/29\344\275\277\347\224\250promise.cpp" @@ -0,0 +1,55 @@ +#include +#include +#include +#include +using namespace std::chrono_literals; + +void f(std::promise obj ,int num){ + // todo.. + obj.set_value(num * num); // 调用了 set_value + // todo.. + std::this_thread::sleep_for(5s); // 模拟一些计算 +} + +void throw_function(std::promise prom) { + prom.set_value(100); + try { + // todo.. + throw std::runtime_error("一个异常"); + } + catch (...) { + try { + // 共享状态的 promise 已存储值,调用 set_exception 产生异常 + prom.set_exception(std::current_exception()); + } + catch (std::exception& e) { + std::cerr << "来自 set_exception 的异常: " << e.what() << '\n'; + } + } +} + +int main() { + std::promise prom; + std::future fut = prom.get_future(); + + std::thread t(throw_function, std::move(prom)); + + std::cout << "等待线程执行,抛出异常并设置\n"; + std::cout << "值:" << fut.get() << '\n'; // 100 + + t.join(); +} + + +//int main(){ +// std::promise promise; +// +// auto future = promise.get_future(); // 关联了 +// +// std::thread t{ f,std::move(promise), 10 }; +// // f(std::move(promise), 10); +// +// std::cout << future.get() << '\n'; // 阻塞,直至结果可用 +// std::cout << "end\n"; +// t.join(); +//} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/30future\347\232\204\347\212\266\346\200\201\345\217\230\345\214\226.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/30future\347\232\204\347\212\266\346\200\201\345\217\230\345\214\226.cpp" new file mode 100644 index 00000000..b6cb59b6 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/30future\347\232\204\347\212\266\346\200\201\345\217\230\345\214\226.cpp" @@ -0,0 +1,16 @@ +#include +#include +#include + +int main(){ + std::futurefuture = std::async([] {}); + std::cout << std::boolalpha << future.valid() << '\n'; // true + future.get(); + std::cout << std::boolalpha << future.valid() << '\n'; // false + try { + future.get(); // 抛出 future_errc::no_state 异常 + } + catch (std::exception& e) { + std::cerr << e.what() << '\n'; + } +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/31\345\244\232\344\270\252\347\272\277\347\250\213\347\232\204\347\255\211\345\276\205shared_future.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/31\345\244\232\344\270\252\347\272\277\347\250\213\347\232\204\347\255\211\345\276\205shared_future.cpp" new file mode 100644 index 00000000..7ada4b4a --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/31\345\244\232\344\270\252\347\272\277\347\250\213\347\232\204\347\255\211\345\276\205shared_future.cpp" @@ -0,0 +1,37 @@ +#include +#include +#include + +std::string fetch_data() { + std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟耗时操作 + return "从网络获取的数据!"; +} + +int main() { + std::future future_data = std::async(std::launch::async, fetch_data); + + // // 转移共享状态,原来的 future 被清空 valid() == false + std::shared_future shared_future_data = future_data.share(); + + // 多个线程持有一个 shared_future 对象并操作 + + // 第一个线程等待结果并访问数据 + std::thread thread1([shared_future_data] { + std::cout << "线程1:等待数据中..." << std::endl; + shared_future_data.wait(); // 等待结果可用 + std::cout << "线程1:收到数据:" << shared_future_data.get() << std::endl; + }); + + // 第二个线程等待结果并访问数据 + std::thread thread2([shared_future_data] { + std::cout << "线程2:等待数据中..." << std::endl; + shared_future_data.wait(); + std::cout << "线程2:收到数据:" << shared_future_data.get() << std::endl; + }); + + thread1.join(); + thread2.join(); + + std::promise p; + std::shared_future sf{ p.get_future() }; // 隐式转移所有权 +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/32\351\231\220\346\227\266\347\255\211\345\276\205-\346\227\266\351\222\237.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/32\351\231\220\346\227\266\347\255\211\345\276\205-\346\227\266\351\222\237.cpp" new file mode 100644 index 00000000..d5a07cdc --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/32\351\231\220\346\227\266\347\255\211\345\276\205-\346\227\266\351\222\237.cpp" @@ -0,0 +1,14 @@ +#include +#include +#include +using namespace std::chrono_literals; + +int main(){ + auto now = std::chrono::system_clock::now(); + time_t now_time = std::chrono::system_clock::to_time_t(now); + std::cout << "Current time:\t" << std::put_time(std::localtime(&now_time), "%H:%M:%S\n"); + + auto now2 = std::chrono::steady_clock::now(); + now_time = std::chrono::system_clock::to_time_t(now); + std::cout << "Current time:\t" << std::put_time(std::localtime(&now_time), "%H:%M:%S\n"); +} \ No newline at end of file diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt index d90bdce2..4c077d57 100644 --- a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt @@ -12,7 +12,7 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "C add_compile_options("-finput-charset=UTF-8" "-fexec-charset=UTF-8") endif() -add_executable(${PROJECT_NAME} "26使用条件变量实现后台提示音播放.cpp") +add_executable(${PROJECT_NAME} "32限时等待-时钟.cpp") # 设置 SFML 的 CMake 路径 diff --git "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" index b21bbb15..9524474d 100644 --- "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" +++ "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" @@ -722,7 +722,7 @@ auto sum(ForwardIt first, ForwardIt last) { > [运行](https://godbolt.org/z/r19MYcv6e)测试。 -相比于之前,其实不同无非是定义了 `std::vector> tasks` 与 `std::vector> futures` ,然后在循环中制造任务插入容器,关联 tuple,再放到线程中执行。最后汇总的时候写一个循环,`futures[i].get()` 获取任务的返回值加起来即可。 +相比于之前,其实不同无非是定义了 `std::vector> tasks` 与 `std::vector> futures` ,然后在循环中制造任务插入容器,关联 future,再放到线程中执行。最后汇总的时候写一个循环,`futures[i].get()` 获取任务的返回值加起来即可。 到此,也就可以了。 @@ -799,7 +799,7 @@ int main() { 来自线程的异常: 一个异常 ``` -你可能对这段代码还有一些疑问:我们写的是 `promised` ,但是却没有使用 `set_value` 设置值,你可能会想着再写一行 `prom.set_value(0)`? +你可能对这段代码还有一些疑问:我们写的是 `promise` ,但是却没有使用 `set_value` 设置值,你可能会想着再写一行 `prom.set_value(0)`? 共享状态的 promise 已经存储值或者异常,再次调用 `set_value`(`set_exception`) 会抛出 [std::future_error](https://zh.cppreference.com/w/cpp/thread/future_error) 异常,将错误码设置为 [`promise_already_satisfied`](https://zh.cppreference.com/w/cpp/thread/future_errc)。这是因为 `std::promise` 对象只能是存储值或者异常其中一种,而**无法共存**。 @@ -893,13 +893,43 @@ _Ty& get() { 如果需要进行多次 `get` 调用,可以考虑使用下文提到的 `std::shared_future`。 -### 多个线程的等待 +### 多个线程的等待 `std::shared_future` -之前的例子中都在用 `std::future` ,不过 `std::future` 也有局限性。很多线程在等待的时候,只有一个线程能获取结果。当多个线程等待相同事件的结果时,就需要使用 `std::shared_future` 来替代 `std::future` 了。`std::future` 与 `std::shared_future` 的区别就如同 `std::unique_ptr`、`std::shared_ptr` 一样。 +之前的例子中我们一直使用 `std::future`,但 `std::future` 有一个局限:**future 是一次性的**,它的结果只能被一个线程获取。`get()` 成员函数只能调用一次,当结果被某个线程获取后,`std::future` 就无法再用于其他线程。 + +```cpp +int task(){ + // todo.. + return 10; +} + +void thread_functio(std::future& fut){ + // todo.. + int result = fut.get(); + std::cout << result << '\n'; + // todo.. +} + +int main(){ + auto future = std::async(task); // 启动耗时的异步任务 + + // 可能有多个线程都需要此任务的返回值,于是我们将与其关联的 future 对象的引入传入 + std::thread t{ thread_functio,std::ref(future) }; + std::thread t2{ thread_functio,std::ref(future) }; + t.join(); + t2.join(); +} +``` + +> 可能有多个线程都需要耗时的异步任务的返回值,于是我们将与其关联的 future 对象的引入传给线程对象,让它能在需要的时候获取。 +> +> 但是这存在个问题,future 是一次性的,只能被调用一次 `get()` 成员函数,所以以上代码存在问题。 + +此时就需要使用 `std::shared_future` 来替代 `std::future` 了。`std::future` 与 `std::shared_future` 的区别就如同 `std::unique_ptr`、`std::shared_ptr` 一样。 `std::future` 是只能移动的,其所有权可以在不同的对象中互相传递,但只有一个对象可以获得特定的同步结果。而 `std::shared_future` 是可复制的,多个对象可以指代同一个共享状态。 -在多个线程中对**同一个 **`std::shared_future` 对象进行操作时(如果没有进行同步保护)存在竞争条件。而从多个线程访问同一共享状态,若每个线程都是通过其自身的 `shared_future` 对象**副本**进行访问,则是安全的。 +在多个线程中对**同一个 **`std::shared_future` 对象进行操作时(如果没有进行同步保护)存在条件竞争。而从多个线程访问同一共享状态,若每个线程都是通过其自身的 `shared_future` 对象**副本**进行访问,则是安全的。 ```cpp std::string fetch_data() { @@ -932,7 +962,7 @@ int main() { } ``` -这段代码存在数据竞争,就如同我们先前所说:“***在多个线程中对**同一个 **`std::shared_future` 对象进行操作时(如果没有进行同步保护)存在竞争条件***”,它并没有提供线程安全的方式。而我们的 lambda 是按引用传递,也就是“**同一个**”进行操作了。可以改为: +这段代码存在数据竞争,就如同我们先前所说:“***在多个线程中对**同一个 **`std::shared_future` 对象进行操作时(如果没有进行同步保护)存在条件竞争***”,它并没有提供线程安全的方式。而我们的 lambda 是按引用传递,也就是“**同一个**”进行操作了。可以改为: ```cpp std::string fetch_data() { @@ -962,13 +992,13 @@ int main() { } ``` -这样访问的就都是 `std::shared_future` 的副本了,我们的 lambda 按复制捕获 std::shared_future 对象,每个线程都有一个 shared_future 的副本,这样不会有任何问题。这一点和 `std::shared_ptr` 类似[^2]。 +这样访问的就都是 `std::shared_future` 的副本了,我们的 lambda 按复制捕获 `std::shared_future` 对象,每个线程都有一个 shared_future 的副本,这样不会有任何问题。这一点和 `std::shared_ptr` 类似[^2]。 `std::promise` 也同,它的 `get_future()` 成员函数一样可以用来构造 `std::shared_future`,虽然它的返回类型是 `std::future`,不过不影响,这是因为 `std::shared_future` 有一个 `std::future&&` 参数的[构造函数](https://zh.cppreference.com/w/cpp/thread/shared_future/shared_future),转移 `std::future` 的所有权。 ```cpp -std::promisep; -std::shared_futuresf{ p.get_future() }; // 隐式转移所有权 +std::promise p; +std::shared_future sf{ p.get_future() }; // 隐式转移所有权 ``` 就不需要再强调了。 @@ -1010,7 +1040,7 @@ class duration; 如你所见,它默认的时钟节拍是 1,这是一个很重要的类,标准库通过它定义了很多的时间类型,比如 **`std::chrono::minutes`** 是分钟类型,那么它的 `Period` 就是 `std::ratio<60>` ,因为一分钟等于 60 秒。 ```cpp -std::chrono::minutes std::chrono::duration> +using minutes = duration>; ``` 稳定时钟(Steady Clock)是指提供稳定、持续递增的时间流逝信息的时钟。它的特点是不受系统时间调整或变化的影响,即使在系统休眠或时钟调整的情况下,它也能保持稳定。在 C++ 标准库中,[`std::chrono::steady_clock`](https://zh.cppreference.com/w/cpp/chrono/steady_clock) 就是一个稳定时钟。它通常用于测量时间间隔和性能计时等需要高精度和稳定性的场景。可以通过 `is_steady` 静态常量判断当前时钟是否是稳定时钟。 From 9fa4d5bdc6f065e2688d003d3f1797b451a90198 Mon Sep 17 00:00:00 2001 From: mq-b <3326284481@qq.com> Date: Mon, 23 Sep 2024 16:52:17 +0800 Subject: [PATCH 50/62] =?UTF-8?q?=E8=A1=A5=E5=85=85=20SFML=20=E5=BA=93?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E4=B8=8E=E4=BE=9D=E8=B5=96=E7=9A=84=E8=AF=B4?= =?UTF-8?q?=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\220\214\346\255\245\346\223\215\344\275\234.md" | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" index 9524474d..d026575c 100644 --- "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" +++ "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" @@ -411,6 +411,14 @@ enum SoundIndex { 如果是测试使用,不知道去哪生成这些语音播报,我们推荐 [`tts-vue`](https://github.com/LokerL/tts-vue)。 +> 我们的代码也可以在 Linux 中运行,并且整体仅需 C++11 标准,除了 `soundResources` 数组以外。 +> SFML 依赖于 [**FLAC**](https://xiph.org/flac/) 和 [**OpenAL**](https://www.openal.org/) 这两个库。在 Windows 上[下载](https://www.sfml-dev.org/download/sfml/2.5.1/)的 SFML 版本已包含这些依赖,但在 Linux 上需要用户自行下载并安装它们。如: +> ```shell +> sudo apt-get install libflac-dev +> sudo apt-get install libopenal-dev +> ``` + + ## 使用 `future` 举个例子:我们在车站等车,你可能会做一些别的事情打发时间,比如学习[现代 C++ 模板教程](https://github.com/Mq-b/Modern-Cpp-templates-tutorial)、观看 [mq白](https://space.bilibili.com/1292761396) 的视频教程、玩手机等。不过,你始终在等待一件事情:***车到站***。 From 89ee36de6f2b3f15c05183a408daaa141e7666e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Tue, 24 Sep 2024 19:09:30 +0800 Subject: [PATCH 51/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=95=99=E6=A1=88=E6=8E=AA=E8=BE=9E=EF=BC=8C=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../async_progress_bar/async_progress_bar.h" | 2 +- ...-\346\227\266\351\227\264\346\256\265.cpp" | 17 ++++++++++ ...-\346\227\266\351\227\264\347\202\271.cpp" | 31 +++++++++++++++++++ .../CMakeLists.txt | 2 +- ...61\344\272\253\346\225\260\346\215\256.md" | 2 +- ...14\346\255\245\346\223\215\344\275\234.md" | 24 +++++++++++++- 6 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/33\351\231\220\346\227\266\347\255\211\345\276\205-\346\227\266\351\227\264\346\256\265.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/34\351\231\220\346\227\266\347\255\211\345\276\205-\346\227\266\351\227\264\347\202\271.cpp" diff --git "a/code/04\345\220\214\346\255\245\346\223\215\344\275\234/async_progress_bar/async_progress_bar.h" "b/code/04\345\220\214\346\255\245\346\223\215\344\275\234/async_progress_bar/async_progress_bar.h" index f97b0ac9..c3f43d3f 100644 --- "a/code/04\345\220\214\346\255\245\346\223\215\344\275\234/async_progress_bar/async_progress_bar.h" +++ "b/code/04\345\220\214\346\255\245\346\223\215\344\275\234/async_progress_bar/async_progress_bar.h" @@ -67,5 +67,5 @@ class async_progress_bar : public QMainWindow{ QPushButton* button{}; QPushButton* button2{}; Ui::async_progress_barClass ui{}; - std::futurefuture; + std::future future; }; diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/33\351\231\220\346\227\266\347\255\211\345\276\205-\346\227\266\351\227\264\346\256\265.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/33\351\231\220\346\227\266\347\255\211\345\276\205-\346\227\266\351\227\264\346\256\265.cpp" new file mode 100644 index 00000000..550c88cc --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/33\351\231\220\346\227\266\347\255\211\345\276\205-\346\227\266\351\227\264\346\256\265.cpp" @@ -0,0 +1,17 @@ +#include +#include +#include +#include +using namespace std::chrono_literals; + +int main(){ + using namespace std::chrono; + auto future = std::async(std::launch::deferred, []{ + std::cout << "deferred\n"; + }); + + if (future.wait_for(35ms) == std::future_status::deferred) + std::cout << "future_status::deferred " << "正在延迟执行\n"; + + future.wait(); // 在 wait() 或 get() 调用时执行,不创建线程 +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/34\351\231\220\346\227\266\347\255\211\345\276\205-\346\227\266\351\227\264\347\202\271.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/34\351\231\220\346\227\266\347\255\211\345\276\205-\346\227\266\351\227\264\347\202\271.cpp" new file mode 100644 index 00000000..de346347 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/34\351\231\220\346\227\266\347\255\211\345\276\205-\346\227\266\351\227\264\347\202\271.cpp" @@ -0,0 +1,31 @@ +#include +#include +#include +#include +#include +#include +#pragma comment(lib,"winmm.lib") + +using namespace std::chrono_literals; + +std::condition_variable cv; +bool done{}; +std::mutex m; + +bool wait_loop() { + const auto timeout = std::chrono::steady_clock::now() + 500ms; + std::unique_lock lk{ m }; + if (!cv.wait_until(lk, timeout, [] {return done; })) { + std::cout << "超时 500ms\n"; + return false; + } + return true; +} + +int main() { + std::thread t{ wait_loop }; + std::this_thread::sleep_for(400ms); + done = true; + cv.notify_one(); + t.join(); +} diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt index 4c077d57..c46cea05 100644 --- a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt @@ -12,7 +12,7 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "C add_compile_options("-finput-charset=UTF-8" "-fexec-charset=UTF-8") endif() -add_executable(${PROJECT_NAME} "32限时等待-时钟.cpp") +add_executable(${PROJECT_NAME} "34限时等待-时间点.cpp") # 设置 SFML 的 CMake 路径 diff --git "a/md/03\345\205\261\344\272\253\346\225\260\346\215\256.md" "b/md/03\345\205\261\344\272\253\346\225\260\346\215\256.md" index 2bd09ee0..ebc29e14 100644 --- "a/md/03\345\205\261\344\272\253\346\225\260\346\215\256.md" +++ "b/md/03\345\205\261\344\272\253\346\225\260\346\215\256.md" @@ -647,7 +647,7 @@ void process_data(){ 保护共享数据并非必须使用互斥量,互斥量只是其中一种常见的方式而已,对于一些特殊的场景,也有专门的保护方式,比如**对于共享数据的初始化过程的保护**。我们通常就不会用互斥量,**这会造成很多的额外开销**。 -我们不想为各位介绍其它乱七八糟的各种保护初始化的方式,我们只介绍三种:**双检锁(错误)**、**使用 `std::call_once`**、**静态局部变量初始化在 C++11 是线程安全**。 +我们不想为各位介绍其它乱七八糟的各种保护初始化的方式,我们只介绍三种:**双检锁(错误)**、**使用 `std::call_once`**、**静态局部变量初始化从 C++11 开始是线程安全**。 1. **双检锁(错误)线程不安全** diff --git "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" index d026575c..ae6f1387 100644 --- "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" +++ "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" @@ -1182,7 +1182,7 @@ template< > class time_point; ``` -如你所见,它的第二个模板参数的时间单位,默认是根据第一个参数时钟得到的,所以假设有类型: +如你所见,它的第二个模板参数是**时间段**,就是时间的间隔,其实也就可以理解为表示时间点的**精度**,默认是根据第一个参数时钟得到的,所以假设有类型: ```cpp std::chrono::time_point @@ -1200,8 +1200,30 @@ std::chrono::time_point> // // 100 nanoseconds ``` +也就是说 `std::chrono::time_point` 的精度是 100 纳秒。 + 更多的问题参见[源码](https://github.com/microsoft/STL/blob/f54203f/stl/inc/__msvc_chrono.hpp#L644-L647)都很直观。 +> 注意,这里的精度并非是实际的时间精度。时间和硬件系统等关系极大,以 windows 为例: +> +> Windows 内核中的时间间隔计时器默认每隔 **15.6** 毫秒触发一次中断。因此,如果你使用基于系统时钟的计时方法,默认情况下精度约为 15.6 毫秒。不可能达到纳秒级别。 +> +> 由于这个系统时钟的限制,那些基于系统时钟的 API(例如 `Sleep()`、`WaitForSingleObject()` 等)的最小睡眠时间默认就是 15.6 毫秒左右。 +> +> 如: +> +> ```cpp +> std::this_thread::sleep_for(std::chrono::milliseconds(1)); +> ``` +> +> 不过我们也可以使用系统 API 调整系统时钟的精度,需要链接 windows 多媒体库 **`winmm.lib`** ,然后使用 API: +> +> ```cpp +> timeBeginPeriod(1); // 设置时钟精度为 1 毫秒 +> // todo.. +> timeEndPeriod(1); // 恢复默认精度 +> ``` + --- 同样的,时间点也支持加减以及比较操作。 From 8f46c3ff03bc0412090583c801bb0c45641bf504 Mon Sep 17 00:00:00 2001 From: mq-b <3326284481@qq.com> Date: Thu, 26 Sep 2024 14:06:25 +0800 Subject: [PATCH 52/62] =?UTF-8?q?fix=20#27=20=E6=B3=A8=E6=84=8F=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E7=B1=BB=E7=9A=84=E5=88=9D=E5=A7=8B=E5=8C=96=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" index ae6f1387..74f89d78 100644 --- "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" +++ "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" @@ -370,6 +370,11 @@ private: 该代码实现了一个简单的**后台音频播放类型**,通过**条件变量**和**互斥量**确保播放线程 `playMusic` 只在只在**有音频任务需要播放时工作**(当外部通过调用 `addAudioPath()` 向队列添加播放任务时)。在没有任务时,线程保持等待状态,避免占用 CPU 资源影响主程序的运行。 +> ### 注意 +> 其实这段代码还存在着一个初始化顺序导致的问题,见 [**#27**](https://github.com/Mq-b/ModernCpp-ConcurrentProgramming-Tutorial/issues/27) + +此外,关于提示音的播报,为了避免每次都手动添加路径,我们可以创建一个音频资源数组,便于使用: + 此外,关于提示音的播报,为了避免每次都手动添加路径,我们可以创建一个音频资源数组,便于使用: ```cpp From f9eed738d0b89331aecd587bc1397c996b683702 Mon Sep 17 00:00:00 2001 From: mq-b <3326284481@qq.com> Date: Fri, 27 Sep 2024 15:59:16 +0800 Subject: [PATCH 53/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AC=AC=E4=BA=94?= =?UTF-8?q?=E7=AB=A0=20`std::atomic`=20=E6=8E=AA=E8=BE=9E=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E8=A1=A5=E5=85=85=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\216\237\345\255\220\346\223\215\344\275\234.md" | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" index 9909bb6d..a6076eff 100644 --- "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" +++ "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" @@ -40,11 +40,13 @@ void f() { ### 原子类型 `std::atomic` -标准原子类型定义在头文件 [``](https://zh.cppreference.com/w/cpp/header/atomic) 中。这些类型的操作都是原子的,语言定义中只有这些类型的操作是原子的,虽然也可以用互斥量来模拟原子操作(见上文)。标准的原子的类型实现可能是:*它们几乎都有一个 `is_lock_free()` 成员函数,这个函数可以让用户查询某原子类型的操作是直接用的原子指令(返回 `true`),还是内部用了锁实现(返回 `false`)。* +标准原子类型定义在头文件 [``](https://zh.cppreference.com/w/cpp/header/atomic) 中。这些类型的操作都是原子的,语言定义中只有这些类型的操作是原子的,虽然也可以用互斥量来模拟原子操作(见上文)。 -> 每个 `std::atomic` 模板的实例化和全特化均定义一个原子类型。**如果一个线程写入原子对象,同时另一线程从它读取,那么行为有良好定义**(数据竞争的细节见[内存模型](https://zh.cppreference.com/w/cpp/language/memory_model))。 +标准原子类型的实现通常包括一个 `is_lock_free()` 成员函数,允许用户查询特定原子类型的操作是否是通过直接的原子指令实现(返回 true),还是通过锁来实现(返回 false)。 -原子操作可以代替互斥量,来进行同步操作,也能带来更高的性能。但是如果它的内部使用互斥量实现,那么不可能有性能的提升。 +> **如果一个线程写入原子对象,同时另一线程从它读取,那么行为有良好定义**(数据竞争的细节见[内存模型](https://zh.cppreference.com/w/cpp/language/memory_model))。 + +原子操作可以在一些时候代替互斥量,来进行同步操作,也能带来更高的性能。但是如果它的内部使用互斥量实现,那么不可能有性能的提升。 在 C++17 中,所有原子类型都有一个 `static constexpr` 的数据成员 [`is_always_lock_free`](https://zh.cppreference.com/w/cpp/atomic/atomic/is_always_lock_free) 。如果当前环境上的原子类型 X 是无锁类型,那么 `X::is_always_lock_free` 将返回 `true` 。例如: @@ -101,7 +103,7 @@ else { 因为 `is_always_lock_free` 是编译期常量,所以我们可以使用 C++17 引入的 `constexpr if` ,它可以在编译阶段进行决策,避免了运行时的判断开销,提高了性能。 -宏则更是简单了,最基本的预处理器判断,在预处理阶段就选择执行合适的代码。 +宏则更是简单了,最基本的预处理器判断,在预处理阶段就选择编译合适的代码。 在实际应用中,如果一个类型的原子操作总是无锁的,我们可以更放心地在性能关键的代码路径中使用它。例如,在高频交易系统、实时系统或者其它需要高并发性能的场景中,无锁的原子操作可以显著减少锁的开销和争用,提高系统的吞吐量和响应时间。 @@ -111,6 +113,8 @@ else { 2. **减少原子操作的频率**:通过批处理等技术,减少对原子操作的调用次数。 3. **使用更高效的同步机制**:在一些情况下,其它同步机制(如读写锁)可能比原子操作更高效。 +当然,其实很多时候根本没这种性能的担忧,我们很多时候使用原子对象只是为了简单方便,比如 `std::atomic` 表示状态、`std::atomic` 进行计数等。即使它们是用了锁,那也是封装好了的,起码用着方便,而不需要在代码中引入额外的互斥量来保护,更加简洁。这也是很正常的需求,各位不但要考虑程序的性能,同时也要考虑代码的简洁性、易用性。即使使用原子类型无法带来效率的提升,那也没有负提升。 + --- 除了直接使用 `std::atomic` 模板外,也可以使用原子类型的别名。这个数量非常之多,见 [MSVC STL](https://github.com/microsoft/STL/blob/daeb0a6/stl/inc/atomic#L2745-L2805)。 From acda8c69f0356cc65c4e139b5ac90b63ad2dfcf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sat, 28 Sep 2024 21:59:18 +0800 Subject: [PATCH 54/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BB=A5=E5=8F=8A=20CMake=20=E5=BC=95?= =?UTF-8?q?=E5=85=A5=20fmt=E3=80=81Qt=E3=80=81Boost=20=E7=9A=84=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=EF=BC=8C=E5=A2=9E=E5=8A=A0=E4=BD=BF=E7=94=A8=20OpenMp?= =?UTF-8?q?=20=E7=9A=84=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\344\277\241\345\217\267\351\207\217.cpp" | 40 ++++++ .../36C++20\351\227\251latch.cpp" | 21 ++++ ...7C++20\345\261\217\351\232\234barrier.cpp" | 39 ++++++ ...3\345\214\226\351\241\272\345\272\217.cpp" | 41 ++++++ ...255\220\347\261\273\345\236\213atomic.cpp" | 49 ++++++++ ...3\346\261\240\344\275\277\347\224\250.cpp" | 23 ++++ ...2\347\272\277\347\250\213\346\261\240.cpp" | 118 ++++++++++++++++++ .../CMakeLists.txt | 27 ++-- ...37\345\255\220\346\223\215\344\275\234.md" | 2 +- 9 files changed, 349 insertions(+), 11 deletions(-) create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/35C++20\344\277\241\345\217\267\351\207\217.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/36C++20\351\227\251latch.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/37C++20\345\261\217\351\232\234barrier.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/38\347\254\254\345\233\233\347\253\240\346\200\273\347\273\223-\345\213\230\350\257\257\345\210\235\345\247\213\345\214\226\351\241\272\345\272\217.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/39\345\216\237\345\255\220\347\261\273\345\236\213atomic.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/40\347\272\277\347\250\213\346\261\240\344\275\277\347\224\250.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/41\345\256\236\347\216\260\344\270\200\344\270\252\347\272\277\347\250\213\346\261\240.cpp" diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/35C++20\344\277\241\345\217\267\351\207\217.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/35C++20\344\277\241\345\217\267\351\207\217.cpp" new file mode 100644 index 00000000..36629670 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/35C++20\344\277\241\345\217\267\351\207\217.cpp" @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include +using namespace std::chrono_literals; + +// 定义一个信号量,最大并发数为 3 +std::counting_semaphore<3> semaphore{ 3 }; + +void handle_request(int request_id) { + // 请求到达,尝试获取信号量 + std::cout << "进入 handle_request 尝试获取信号量\n"; + + semaphore.acquire(); + + std::cout << "成功获取信号量\n"; + + // 此处延时三秒可以方便测试,会看到先输出 3 个“成功获取信号量”,因为只有三个线程能成功调用 acquire,剩余的会被阻塞 + std::this_thread::sleep_for(3s); + + // 模拟处理时间 + std::random_device rd; + std::mt19937 gen{ rd() }; + std::uniform_int_distribution<> dis(1, 5); + int processing_time = dis(gen); + std::this_thread::sleep_for(std::chrono::seconds(processing_time)); + + std::cout << std::format("请求 {} 已被处理\n", request_id); + + semaphore.release(); +} + +int main() { + // 模拟 10 个并发请求 + std::vector threads; + for (int i = 0; i < 10; ++i) { + threads.emplace_back(handle_request, i); + } +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/36C++20\351\227\251latch.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/36C++20\351\227\251latch.cpp" new file mode 100644 index 00000000..e7ef4efe --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/36C++20\351\227\251latch.cpp" @@ -0,0 +1,21 @@ +#include +#include +#include +#include +using namespace std::chrono_literals; + +std::latch latch{ 10 }; + +void f(int id) { + //todo.. 脑补任务 + std::cout << std::format("线程 {} 执行完任务,开始等待其它线程执行到此处\n", id); + latch.arrive_and_wait(); // 减少 并等待 count_down(1); wait(); 等待计数为 0 + std::cout << std::format("线程 {} 彻底退出函数\n", id); +} + +int main() { + std::vector threads; + for (int i = 0; i < 10; ++i) { + threads.emplace_back(f, i); + } +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/37C++20\345\261\217\351\232\234barrier.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/37C++20\345\261\217\351\232\234barrier.cpp" new file mode 100644 index 00000000..d8e3e1a7 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/37C++20\345\261\217\351\232\234barrier.cpp" @@ -0,0 +1,39 @@ +#include +#include +#include +#include + +void f(int start, int end, int thread_id) { + for (int i = start; i <= end; ++i) { + // 输出当前线程的数字 + std::cout << std::to_string(i) + " "; + + // 等待所有线程同步到达 barrier 也就是等待都输出完数字 +#pragma omp barrier + +// 每个线程输出完一句后,主线程输出轮次信息 +#pragma omp master + { + static int round_number = 1; + std::cout << "\t第" << round_number++ << "轮结束\n"; + std::this_thread::sleep_for(std::chrono::seconds(1)); + } + + // 再次同步 等待所有线程(包括主线程)到达此处、避免其它线程继续执行打断主线程的输出 +#pragma omp barrier + } +} + +int main() { + constexpr int num_threads = 10; + omp_set_num_threads(num_threads); + +#pragma omp parallel + { + const int thread_id = omp_get_thread_num(); + f(thread_id * 10 + 1, (thread_id + 1) * 10, thread_id); + } + +} + +// https://godbolt.org/z/fabqhbx3P \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/38\347\254\254\345\233\233\347\253\240\346\200\273\347\273\223-\345\213\230\350\257\257\345\210\235\345\247\213\345\214\226\351\241\272\345\272\217.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/38\347\254\254\345\233\233\347\253\240\346\200\273\347\273\223-\345\213\230\350\257\257\345\210\235\345\247\213\345\214\226\351\241\272\345\272\217.cpp" new file mode 100644 index 00000000..6c86778a --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/38\347\254\254\345\233\233\347\253\240\346\200\273\347\273\223-\345\213\230\350\257\257\345\210\235\345\247\213\345\214\226\351\241\272\345\272\217.cpp" @@ -0,0 +1,41 @@ +#include +#include +#include + +struct X { + X() { + // 假设 X 的初始化没那么快 + std::this_thread::sleep_for(std::chrono::seconds(1)); + std::puts("X"); + v.resize(10, 6); + } + std::vector v; +}; + +struct Test { + Test()/* : t{ &Test::f, this }*/ // 线程已经开始执行 + { + // 严格意义来说 这里不算初始化 至少不算 C++ 标准的定义 + } + void start() + { + t = std::thread{ &Test::f, this }; + } + ~Test() { + if (t.joinable()) + t.join(); + } + void f()const { // 如果在函数执行的线程 f 中使用 x 则会存在问题。使用了未初始化的数据成员 ub + std::cout << "f\n"; + std::cout << x.v[9] << '\n'; + } + + + std::thread t; // 声明顺序决定了初始化顺序,优先初始化 t + X x; +}; + +int main() { + Test t; + t.start(); +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/39\345\216\237\345\255\220\347\261\273\345\236\213atomic.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/39\345\216\237\345\255\220\347\261\273\345\236\213atomic.cpp" new file mode 100644 index 00000000..91afb9f5 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/39\345\216\237\345\255\220\347\261\273\345\236\213atomic.cpp" @@ -0,0 +1,49 @@ +#include +#include +#include +#include +using namespace std::chrono_literals; + +// 不要这样使用 不要在多线程并发中使用 volatile +// 它的行为是不保证的 +std::atomic n = 0; + +void read(){ + while(true){ + std::this_thread::sleep_for(500ms); + std::cout << n.load() << '\n'; + } +} + +void write(){ + while (true){ + ++n; + } +} + +// 数据竞争 数据竞争未定义行为 +// 优化会假设你的程序中没有未定义行为 + +// C 语言的平凡的结构体 +struct trivial_type { + int x; + float y; +}; + +int main(){ + // 创建一个 std::atomic 对象 + std::atomic atomic_my_type{ { 10, 20.5f } }; + + // 使用 store 和 load 操作来设置和获取值 + trivial_type new_value{ 30, 40.5f }; + atomic_my_type.store(new_value); + + std::cout << "x: " << atomic_my_type.load().x << ", y: " << atomic_my_type.load().y << std::endl; + + // 使用 exchange 操作 + trivial_type exchanged_value = atomic_my_type.exchange({ 50, 60.5f }); + std::cout << "交换前的 x: " << exchanged_value.x + << ", 交换前的 y: " << exchanged_value.y << std::endl; + std::cout << "交换后的 x: " << atomic_my_type.load().x + << ", 交换后的 y: " << atomic_my_type.load().y << std::endl; +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/40\347\272\277\347\250\213\346\261\240\344\275\277\347\224\250.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/40\347\272\277\347\250\213\346\261\240\344\275\277\347\224\250.cpp" new file mode 100644 index 00000000..d8898ba7 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/40\347\272\277\347\250\213\346\261\240\344\275\277\347\224\250.cpp" @@ -0,0 +1,23 @@ +#include +#include +#include +#include + +int main(int argc, char* argv[]) { + QCoreApplication app(argc, argv); + + QThreadPool* threadPool = QThreadPool::globalInstance(); + + // 线程池最大线程数 + qDebug() << threadPool->maxThreadCount(); + + for (int i = 0; i < 20; ++i) { + threadPool->start([i]{ + qDebug() << QString("thread id %1").arg(i); + }); + } + // 当前活跃线程数 10 + qDebug() << threadPool->activeThreadCount(); + + app.exec(); +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/41\345\256\236\347\216\260\344\270\200\344\270\252\347\272\277\347\250\213\346\261\240.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/41\345\256\236\347\216\260\344\270\200\344\270\252\347\272\277\347\250\213\346\261\240.cpp" new file mode 100644 index 00000000..091ca19f --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/41\345\256\236\347\216\260\344\270\200\344\270\252\347\272\277\347\250\213\346\261\240.cpp" @@ -0,0 +1,118 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std::chrono_literals; + +inline std::size_t default_thread_pool_size() noexcept{ + std::size_t num_threads = std::thread::hardware_concurrency(); + num_threads = num_threads == 0 ? 2 : num_threads; // 防止无法检测当前硬件,让我们线程池至少有 2 个线程 + return num_threads; +} + +class ThreadPool{ +public: + using Task = std::packaged_task; + + ThreadPool(const ThreadPool&) = delete; + ThreadPool& operator=(const ThreadPool&) = delete; + + ThreadPool(std::size_t num_thread = default_thread_pool_size()) : + stop_{ false }, num_thread_{ num_thread } + { + start(); + } + ~ThreadPool(){ + stop(); + } + + void stop(){ + stop_ = true; + cv_.notify_all(); + for (auto& thread : pool_){ + if (thread.joinable()) + thread.join(); + } + pool_.clear(); + } + + template + std::future, std::decay_t...>> submit(F&& f, Args&&...args){ + using RetType = std::invoke_result_t, std::decay_t...>; + if(stop_){ + throw std::runtime_error("ThreadPool is stopped"); + } + auto task = std::make_shared>(std::bind(std::forward(f), std::forward(args)...)); + + std::future ret = task->get_future(); + + { + std::lock_guard lc{ mutex_ }; + tasks_.emplace([task] {(*task)(); }); + } + cv_.notify_one(); + + return ret; + } + + void start(){ + for (std::size_t i = 0; i < num_thread_; ++i){ + pool_.emplace_back([this]{ + while (!stop_) { + Task task; + { + std::unique_lock lock{ mutex_ }; + cv_.wait(lock, [this] {return stop_ || !tasks_.empty(); }); + if (tasks_.empty()) return; + task = std::move(tasks_.front()); + tasks_.pop(); + } + task(); + } + }); + } + } + +private: + std::mutex mutex_; + std::condition_variable cv_; + std::atomic stop_; + std::atomic num_thread_; + std::queue tasks_; + std::vector pool_; +}; + +int print_task(int n) { + std::osyncstream{ std::cout } << "Task " << n << " is running on thr: " << + std::this_thread::get_id() << '\n'; + return n; +} +int print_task2(int n) { + std::osyncstream{ std::cout } << "🐢🐢🐢 " << n << " 🐉🐉🐉" << std::endl; + return n; +} + +struct X { + void f(const int& n) const { + std::osyncstream{ std::cout } << &n << '\n'; + } +}; + +int main() { + ThreadPool pool{ 4 }; // 创建一个有 4 个线程的线程池 + + X x; + int n = 6; + std::cout << &n << '\n'; + auto t = pool.submit(&X::f, &x, n); // 默认复制,地址不同 + auto t2 = pool.submit(&X::f, &x, std::ref(n)); + t.wait(); + t2.wait(); +} // 析构自动 stop()自动 stop() \ No newline at end of file diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt index c46cea05..594a37dd 100644 --- a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt @@ -2,24 +2,31 @@ cmake_minimum_required (VERSION 3.8) project ("ModernCpp-ConcurrentProgramming-Tutorial") -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 20) SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) if(MSVC) - add_compile_options("/utf-8" "/permissive-" "/Zc:nrvo") + add_compile_options("/utf-8" "/permissive-" "/Zc:nrvo" "/openmp") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - add_compile_options("-finput-charset=UTF-8" "-fexec-charset=UTF-8") + add_compile_options("-finput-charset=UTF-8" "-fexec-charset=UTF-8" "-fopenmp") endif() -add_executable(${PROJECT_NAME} "34限时等待-时间点.cpp") +add_executable(${PROJECT_NAME} "41实现一个线程池.cpp") - -# 设置 SFML 的 CMake 路径 set(SFML_DIR "D:/lib/SFML-2.6.1-windows-vc17-64-bit/SFML-2.6.1/lib/cmake/SFML") - -# 查找 SFML 库 find_package(SFML 2.6.1 COMPONENTS system window graphics audio network REQUIRED) +target_link_libraries(${PROJECT_NAME} PRIVATE sfml-system sfml-window sfml-graphics sfml-audio sfml-network) + +set(fmt_DIR "D:/lib/fmt_x64-windows/share/fmt") +find_package(fmt CONFIG REQUIRED) +target_link_libraries(${PROJECT_NAME} PRIVATE fmt::fmt-header-only) + +find_package(Qt6 REQUIRED Widgets) +target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Widgets) -# 链接 SFML 库到项目 设置链接选项 -target_link_libraries(${PROJECT_NAME} sfml-system sfml-window sfml-graphics sfml-audio sfml-network) +# 当前环境可以直接查找到 vcpkg 的 Boost_DIR 但是却无法查找到 include 路径,手动设置 +set(Boost_INCLUDE_DIR "D:/vcpkg-master/installed/x64-windows/include") +include_directories(${Boost_INCLUDE_DIR}) +find_package(Boost REQUIRED COMPONENTS system) +target_link_libraries(${PROJECT_NAME} PRIVATE Boost::system) diff --git "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" index a6076eff..0075bdcc 100644 --- "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" +++ "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" @@ -105,7 +105,7 @@ else { 宏则更是简单了,最基本的预处理器判断,在预处理阶段就选择编译合适的代码。 -在实际应用中,如果一个类型的原子操作总是无锁的,我们可以更放心地在性能关键的代码路径中使用它。例如,在高频交易系统、实时系统或者其它需要高并发性能的场景中,无锁的原子操作可以显著减少锁的开销和争用,提高系统的吞吐量和响应时间。 +在实际应用中,如果一个类型的原子操作总是无锁的,我们可以更放心地在性能关键的代码路径中使用它。例如,在高频交易系统、实时系统或者其它需要高并发性能的场景中,无锁的原子操作可以显著减少锁的开销和竞争,提高系统的吞吐量和响应时间。 另一方面,如果发现某些原子类型在目标平台上是有锁的,我们可以考虑以下优化策略: From 7877d0e2f7e9a2ef20f37c6195079208a40f4d85 Mon Sep 17 00:00:00 2001 From: mq-b <3326284481@qq.com> Date: Sun, 29 Sep 2024 16:49:31 +0800 Subject: [PATCH 55/62] =?UTF-8?q?=E8=A1=A5=E5=85=85=E7=AC=AC=E4=BA=94?= =?UTF-8?q?=E7=AB=A0=20`std::atomic=5Fflag`=20=E7=9A=84=E6=8F=8F=E8=BF=B0?= =?UTF-8?q?=EF=BC=8C=E8=87=AA=E6=97=8B=E9=94=81=E4=B8=8E=E4=BA=92=E6=96=A5?= =?UTF-8?q?=E9=94=81=E4=BC=98=E5=8A=A3=E5=AF=B9=E6=AF=94=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\216\345\216\237\345\255\220\346\223\215\344\275\234.md" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" index 0075bdcc..f3bc0615 100644 --- "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" +++ "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" @@ -275,6 +275,12 @@ bool r = f.test_and_set(); 有限的特性使得 `std::atomic_flag` 非常适合用作制作**自旋锁**。 +> 自旋锁可以理解为一种***忙等锁***,因为它在等待锁的过程中不会主动放弃 CPU,而是持续检查锁的状态。 +> +> 与此相对,`std::mutex` 互斥量是一种***睡眠锁***。当线程请求锁(`lock()`)而未能获取时,它会放弃 CPU 时间片,让其他线程得以执行,从而有效利用系统资源。 +> +> 从性能上看,自旋锁的响应更快,但是睡眠锁更加节省资源,高效。 + ```cpp class spinlock_mutex { std::atomic_flag flag{}; From 01aafdeb0ee94ce76d6ccc4f3000a08a10edf762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Mon, 30 Sep 2024 19:07:23 +0800 Subject: [PATCH 56/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\350\207\252\346\227\213\351\224\201.cpp" | 39 ++++++++++ .../43atomic_bool.cpp | 25 ++++++ ...7\351\222\210\347\211\271\345\214\226.cpp" | 32 ++++++++ ...220\347\211\271\345\214\226shared_ptr.cpp" | 78 +++++++++++++++++++ .../CMakeLists.txt | 2 +- ...37\345\255\220\346\223\215\344\275\234.md" | 2 +- 6 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/42atomic_flag\345\256\236\347\216\260\350\207\252\346\227\213\351\224\201.cpp" create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/43atomic_bool.cpp create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/44atomic\346\214\207\351\222\210\347\211\271\345\214\226.cpp" create mode 100644 "code/ModernCpp-ConcurrentProgramming-Tutorial/45\345\216\237\345\255\220\347\211\271\345\214\226shared_ptr.cpp" diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/42atomic_flag\345\256\236\347\216\260\350\207\252\346\227\213\351\224\201.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/42atomic_flag\345\256\236\347\216\260\350\207\252\346\227\213\351\224\201.cpp" new file mode 100644 index 00000000..b6d9cca1 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/42atomic_flag\345\256\236\347\216\260\350\207\252\346\227\213\351\224\201.cpp" @@ -0,0 +1,39 @@ +#include +#include +#include +#include + +class spinlock_mutex { + std::atomic_flag flag{}; +public: + spinlock_mutex()noexcept = default; + void lock()noexcept { + while (flag.test_and_set(std::memory_order_acquire)); + } + + void unlock()noexcept { + flag.clear(std::memory_order_release); + } +}; + +spinlock_mutex m; + +void f() { + std::lock_guard lc{ m }; + std::cout << "😅😅" << "❤️❤️\n"; +} + +int main(){ + std::thread t{ f }; + std::thread t1{ f }; + std::thread t2{ f }; + std::thread t3{ f }; + std::thread t4{ f }; + std::thread t5{ f }; + t.join(); + t1.join(); + t2.join(); + t3.join(); + t4.join(); + t5.join(); +} \ No newline at end of file diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/43atomic_bool.cpp b/code/ModernCpp-ConcurrentProgramming-Tutorial/43atomic_bool.cpp new file mode 100644 index 00000000..ae7f1c94 --- /dev/null +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/43atomic_bool.cpp @@ -0,0 +1,25 @@ +#include +#include +#include + +std::atomic flag{ false }; +bool expected = false; + +void try_set_flag() { + // 尝试将 flag 设置为 true,如果当前值为 false + if (flag.compare_exchange_strong(expected, true)) { + std::cout << "flag 为 false,flag 设为 true。\n"; + } + else { + std::cout << "flag 为 true, expected 设为 true。\n"; + } +} + +int main() { + std::thread t1{ try_set_flag }; + std::thread t2{ try_set_flag }; + t1.join(); + t2.join(); + std::cout << "flag: " << std::boolalpha << flag << '\n'; + std::cout << "expected: " << std::boolalpha << expected << '\n'; +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/44atomic\346\214\207\351\222\210\347\211\271\345\214\226.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/44atomic\346\214\207\351\222\210\347\211\271\345\214\226.cpp" new file mode 100644 index 00000000..644e566b --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/44atomic\346\214\207\351\222\210\347\211\271\345\214\226.cpp" @@ -0,0 +1,32 @@ +#include + +struct X{ + int v{}; + void f()const { + std::cout << v << '\n'; + } +}; + +int main(){ + int arr[10]{ 1,2 }; + + std::atomic p{ arr }; + + p.fetch_add(1); + std::cout << *(p.load()) << '\n'; + + p.fetch_sub(1); + std::cout << *(p.load()) << '\n'; + + p += 1; + std::cout << *(p.load()) << '\n'; + + p -= 1; + std::cout << *(p.load()) << '\n'; + + X xs[3]{ {10},{20},{30} }; + std::atomic p2{ xs }; + p2.load()->f(); + p2 += 2; + p2.load()->f(); +} \ No newline at end of file diff --git "a/code/ModernCpp-ConcurrentProgramming-Tutorial/45\345\216\237\345\255\220\347\211\271\345\214\226shared_ptr.cpp" "b/code/ModernCpp-ConcurrentProgramming-Tutorial/45\345\216\237\345\255\220\347\211\271\345\214\226shared_ptr.cpp" new file mode 100644 index 00000000..e050eda8 --- /dev/null +++ "b/code/ModernCpp-ConcurrentProgramming-Tutorial/45\345\216\237\345\255\220\347\211\271\345\214\226shared_ptr.cpp" @@ -0,0 +1,78 @@ +#include +#include +#include +#include +#include +using namespace std::chrono_literals; + +class Data { +public: + Data(int value = 0) : value_(value) {} + int get_value() const { return value_; } + void set_value(int new_value) { value_ = new_value; } +private: + int value_; +}; + +std::atomic> data = std::make_shared(); + +void writer() { + for (int i = 0; i < 10; ++i) { + std::shared_ptr new_data = std::make_shared(i); + data.store(new_data); + std::this_thread::sleep_for(100ms); + } +} + +void reader() { + for (int i = 0; i < 10; ++i) { + if (auto sp = data.load()) { + std::cout << "读取线程值: " << sp->get_value() << std::endl; + } + else { + std::cout << "没有读取到数据" << std::endl; + } + std::this_thread::sleep_for(100ms); + } +} + +std::atomic> ptr = std::make_shared(); + +void wait_for_wake_up() { + std::osyncstream{ std::cout } + << "线程 " + << std::this_thread::get_id() + << " 阻塞,等待更新唤醒\n"; + + // 等待 ptr 变为其它值 + ptr.wait(ptr.load()); + + std::osyncstream{ std::cout } + << "线程 " + << std::this_thread::get_id() + << " 已被唤醒\n"; +} + +void wake_up() { + std::this_thread::sleep_for(5s); + + // 更新值并唤醒 + ptr.store(std::make_shared(10)); + ptr.notify_one(); +} + +int main() { + //std::thread writer_thread{ writer }; + //std::thread reader_thread{ reader }; + + //writer_thread.join(); + //reader_thread.join(); + + //std::atomic> ptr = std::make_shared(10); + //std::atomic_ref ref{ *ptr.load() }; + //ref = 100; // 原子地赋 100 给被引用的对象 + //std::cout << *ptr.load() << '\n'; + std::thread t1{ wait_for_wake_up }; + wake_up(); + t1.join(); +} \ No newline at end of file diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt index 594a37dd..7f2eafa3 100644 --- a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt @@ -12,7 +12,7 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "C add_compile_options("-finput-charset=UTF-8" "-fexec-charset=UTF-8" "-fopenmp") endif() -add_executable(${PROJECT_NAME} "41实现一个线程池.cpp") +add_executable(${PROJECT_NAME} "45原子特化shared_ptr.cpp") set(SFML_DIR "D:/lib/SFML-2.6.1-windows-vc17-64-bit/SFML-2.6.1/lib/cmake/SFML") find_package(SFML 2.6.1 COMPONENTS system window graphics audio network REQUIRED) diff --git "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" index f3bc0615..94e41e85 100644 --- "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" +++ "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" @@ -311,7 +311,7 @@ void f(){ 稍微聊一下原理,我们的 `spinlock_mutex` 对象中存储的 `flag` 对象在默认构造时是清除 (`false`) 状态。在 `lock()` 函数中调用 `test_and_set` 函数,它是原子的,只有一个线程能成功调用并将 `flag` 的状态原子地更改为设置 (`true`),并返回它先前的值 (`false`)。此时,该线程成功获取了锁,退出循环。 -当 `flag` 对象的状态为设置 (`true`) 时,其线程调用 `test_and_set` 函数会返回 `true`,导致它们继续在循环中自旋,无法退出。直到先前持有锁的线程调用 `unlock()` 函数,将 `flag` 对象的状态原子地更改为清除 (`false`) 状态。此时,等待的线程中会有一个线程成功调用 `test_and_set` 返回 `false`,然后退出循环,成功获取锁。 +当 `flag` 对象的状态为设置 (`true`) 时,其它线程调用 `test_and_set` 函数会返回 `true`,导致它们继续在循环中自旋,无法退出。直到先前持有锁的线程调用 `unlock()` 函数,将 `flag` 对象的状态原子地更改为清除 (`false`) 状态。此时,等待的线程中会有一个线程成功调用 `test_and_set` 返回 `false`,然后退出循环,成功获取锁。 > 值得注意的是,我们只是稍微的讲一下使用 `std::atomic_flag` 实现自旋锁。不过并不推荐各位在实践中使用它,具体可参见 [**Linus Torvalds**](https://en.wikipedia.org/wiki/Linus_Torvalds) 的[文章](https://www.realworldtech.com/forum/?threadid=189711&curpostid=189723)。其中有一段话说得很直接: > From 47d20f2507e2ecaa4e54901e368e4f65afaceaae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8E=E6=B4=AA=E6=B4=8B?= <97099566+yhy0816@users.noreply.github.com> Date: Wed, 9 Oct 2024 20:30:04 +0800 Subject: [PATCH 57/62] =?UTF-8?q?Update=2005=E5=86=85=E5=AD=98=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E4=B8=8E=E5=8E=9F=E5=AD=90=E6=93=8D=E4=BD=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 拼写错误 Signed-off-by: 于洪洋 <97099566+yhy0816@users.noreply.github.com> --- ...70\216\345\216\237\345\255\220\346\223\215\344\275\234.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" index 94e41e85..1b576d77 100644 --- "a/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" +++ "b/md/05\345\206\205\345\255\230\346\250\241\345\236\213\344\270\216\345\216\237\345\255\220\346\223\215\344\275\234.md" @@ -228,7 +228,7 @@ struct trivial_type { > > 最后强调一下:任何 [std::atomic](https://zh.cppreference.com/w/cpp/atomic/atomic) 类型,**初始化不是原子操作**。 -### `st::atomic_flag` +### `std::atomic_flag` `std::atomic_flag` 是最简单的原子类型,这个类型的对象可以在两个状态间切换:**设置(true)**和**清除(false)**。它很简单,通常只是用作构建一些库设施,不会单独使用或直接面向普通开发者。 @@ -815,4 +815,4 @@ RISC-V 采用的也是**弱序内存模型**(weakly-ordered memory model), \ No newline at end of file +--> From 7a53541a5b86c172fd0215e7d4487ab23c9b6fbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sun, 13 Oct 2024 14:48:14 +0800 Subject: [PATCH 58/62] =?UTF-8?q?=E5=88=A0=E9=99=A4=20Gitbook=20=E6=97=A0?= =?UTF-8?q?=E6=84=8F=E4=B9=89=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=BE=E7=A8=8B=E9=93=BE=E6=8E=A5=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=83=A8=E5=88=86=E5=8D=8F=E7=A8=8B=E5=89=8D?= =?UTF-8?q?=E8=A8=80=E6=8F=8F=E8=BF=B0=EF=BC=88=E8=BF=98=E9=9C=80=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=8C=E6=97=A0=E5=A4=AA=E5=A4=9A=E4=BB=B7=E5=80=BC?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- SUMMARY.md | 14 -------------- "md/06\345\215\217\347\250\213.md" | 18 ++++++++++++++++-- 3 files changed, 17 insertions(+), 17 deletions(-) delete mode 100644 SUMMARY.md diff --git a/README.md b/README.md index 02ddaf23..415527f9 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ # 现代C++并发编程教程 -本仓库用来存放 B 站课程[《现代 C++ 并发编程教程》]()的教案、代码。 +本仓库用来存放 B 站课程[《现代 C++ 并发编程教程》](https://www.bilibili.com/cheese/play/ss34184)的教案、代码。 不管是否购买课程,任何组织和个人遵守 [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh-hans) 协议均可随意使用学习。 diff --git a/SUMMARY.md b/SUMMARY.md deleted file mode 100644 index cb06bc84..00000000 --- a/SUMMARY.md +++ /dev/null @@ -1,14 +0,0 @@ -# Summary - -* [首页](README.md) -* [阅读须知](md/README.md) -* [基本概念](md/01基本概念.md) -* [使用线程](md/02使用线程.md) -* [共享数据](md/03共享数据.md) -* [同步操作](md/04同步操作.md) -* [内存模型与原子操作](md/05内存模型与原子操作.md) -* [协程](md/06协程.md) -* [详细分析](md/详细分析/README.md) - * [`std::thread` 的构造-源码解析](md/详细分析/01thread的构造与源码解析.md) - * [`std::scoped_lock` 的源码实现与解析](md/详细分析/02scoped_lock源码解析.md) - * [`std::async` 与 `std::future` 源码解析](md/详细分析/03async与future源码解析.md) diff --git "a/md/06\345\215\217\347\250\213.md" "b/md/06\345\215\217\347\250\213.md" index e696832f..eeb2e994 100644 --- "a/md/06\345\215\217\347\250\213.md" +++ "b/md/06\345\215\217\347\250\213.md" @@ -1,9 +1,23 @@ # 协程 +## 前言 + 既然是“**现代**” C++ 并发编程教程,怎么能不聊协程呢? C++20 引入了协程语法,新增了三个用作协程的关键字:`co_await`、`co_yield`、`co_return`。但并未给出标准**协程库**,协程库在 C++23 被引入。 -希望您拥有 `gcc14`、`clang18`,最新的 MSVC。 +希望您拥有 `gcc14`、`clang19`,`Visual Studio 2022 17.11`。 + +我们假设您对 C++20 的协程一无所知、假设您对协程这个概念一无所知、假设您不了解其它语言的协程实现(如 Python、java)。 + +--- + +绝大多数人对协程基本可以说是一无所知,但是应该都听过这个名字,大概是因为这些编程语言都在新版本中引入它作为核心语言特性。 + +这带来了许多的热度,不过这并不完全算是好事,许多的营销号一样的讲述,基本全部都是错误的。 + +据我所知,在我在 B站发布正经 C++20 协程的教学视频之前,几乎所有打着 C++ 旗号说什么协程的,都是胡言乱语。不过也有一些不错的,如:[**等疾风**](https://space.bilibili.com/35186937)、[**happyyang的百草园**](https://space.bilibili.com/312883756),都出过至少算作正经的 C++20 协程的教学视频。 + +- **C++20 的协程是复杂的**。 -> C++ 20 协程的使用尚不成熟,等待后续更新讲解..... +不管是使用上还是概念上,引入了许多新颖的做法。 From a83aeecb0d45ccab3db2dfd13cb27c7556086d09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Wed, 16 Oct 2024 20:56:38 +0800 Subject: [PATCH 59/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20`{}`=20=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E5=8F=AF=E8=83=BD=E5=AF=BC=E8=87=B4=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=9A=84=E4=BB=A3=E7=A0=81=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E3=80=82fixes=20#36?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" | 4 ++-- "md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git "a/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" "b/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" index ef2d5342..798596db 100644 --- "a/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" +++ "b/md/02\344\275\277\347\224\250\347\272\277\347\250\213.md" @@ -91,7 +91,7 @@ auto sum(ForwardIt first, ForwardIt last){ std::size_t remainder = distance % num_threads; // 存储每个线程的结果 - std::vector results { num_threads }; + std::vector results(num_threads); // 存储关联线程的线程对象 std::vector threads; @@ -120,7 +120,7 @@ auto sum(ForwardIt first, ForwardIt last){ } ``` -> [运行](https://godbolt.org/z/MdrP98o13)测试。 +> [运行](https://godbolt.org/z/9qW55aY6j)测试。 我们写了这样一个求和函数 `sum`,接受两个迭代器计算它们范围中对象的和。 diff --git "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" index 74f89d78..b428dcbe 100644 --- "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" +++ "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" @@ -697,9 +697,9 @@ auto sum(ForwardIt first, ForwardIt last) { std::size_t remainder = distance % num_threads; // 存储每个线程要执行的任务 - std::vector>tasks; + std::vector> tasks; // 和每一个任务进行关联的 future 用于获取返回值 - std::vector>futures(num_threads); + std::vector> futures(num_threads); // 存储关联线程的线程对象 std::vector threads; @@ -733,7 +733,7 @@ auto sum(ForwardIt first, ForwardIt last) { } ``` -> [运行](https://godbolt.org/z/r19MYcv6e)测试。 +> [运行](https://godbolt.org/z/79fe1Gvcq)测试。 相比于之前,其实不同无非是定义了 `std::vector> tasks` 与 `std::vector> futures` ,然后在循环中制造任务插入容器,关联 future,再放到线程中执行。最后汇总的时候写一个循环,`futures[i].get()` 获取任务的返回值加起来即可。 From c44abef6021a1e4ac3746d69f3237fc0c910c508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Sat, 19 Oct 2024 13:49:19 +0800 Subject: [PATCH 60/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=AC=AC=E5=9B=9B?= =?UTF-8?q?=E7=AB=A0=EF=BC=9A=E5=88=A0=E9=99=A4=E9=87=8D=E5=A4=8D=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0=EF=BC=8C=E4=BF=AE=E6=94=B9=20`SFML`=20=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E9=85=8D=E7=BD=AE=E7=9A=84=E8=A1=A5=E5=85=85=E6=8E=AA?= =?UTF-8?q?=E8=BE=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" index b428dcbe..85e001f0 100644 --- "a/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" +++ "b/md/04\345\220\214\346\255\245\346\223\215\344\275\234.md" @@ -371,12 +371,11 @@ private: 该代码实现了一个简单的**后台音频播放类型**,通过**条件变量**和**互斥量**确保播放线程 `playMusic` 只在只在**有音频任务需要播放时工作**(当外部通过调用 `addAudioPath()` 向队列添加播放任务时)。在没有任务时,线程保持等待状态,避免占用 CPU 资源影响主程序的运行。 > ### 注意 +> > 其实这段代码还存在着一个初始化顺序导致的问题,见 [**#27**](https://github.com/Mq-b/ModernCpp-ConcurrentProgramming-Tutorial/issues/27) 此外,关于提示音的播报,为了避免每次都手动添加路径,我们可以创建一个音频资源数组,便于使用: -此外,关于提示音的播报,为了避免每次都手动添加路径,我们可以创建一个音频资源数组,便于使用: - ```cpp static constexpr std::array soundResources{ "./sound/01初始化失败.ogg", @@ -416,8 +415,8 @@ enum SoundIndex { 如果是测试使用,不知道去哪生成这些语音播报,我们推荐 [`tts-vue`](https://github.com/LokerL/tts-vue)。 -> 我们的代码也可以在 Linux 中运行,并且整体仅需 C++11 标准,除了 `soundResources` 数组以外。 -> SFML 依赖于 [**FLAC**](https://xiph.org/flac/) 和 [**OpenAL**](https://www.openal.org/) 这两个库。在 Windows 上[下载](https://www.sfml-dev.org/download/sfml/2.5.1/)的 SFML 版本已包含这些依赖,但在 Linux 上需要用户自行下载并安装它们。如: +> 我们的代码也可以在 Linux 中运行,并且整体仅需 C++11 标准(除了 `soundResources` 数组)。 +> SFML 依赖于 [**FLAC**](https://xiph.org/flac/) 和 [**OpenAL**](https://www.openal.org/) 这两个库。官网上[下载](https://www.sfml-dev.org/download/sfml/2.5.1/)的 windows 版本的 SFML 已包含这些依赖,但在 Linux 上需要用户自行下载并安装它们。如: > ```shell > sudo apt-get install libflac-dev > sudo apt-get install libopenal-dev From 0c78a47eb9944f521a18c655a7003d7f19cd6049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Mon, 28 Oct 2024 21:57:44 +0800 Subject: [PATCH 61/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20CMakeList=EF=BC=8C?= =?UTF-8?q?=E5=BC=95=E5=85=A5`cpp-terminal`=20=E4=B8=8E=20`spdlog`?= =?UTF-8?q?=E3=80=82=E7=BC=96=E5=86=99=20`spdlog`=20=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=20`Log.h`=20=EF=BC=8C=E8=BF=98=E9=9C=80?= =?UTF-8?q?=E6=94=B9=E8=BF=9B=E3=80=82=20=E5=90=8E=E7=BB=AD=E8=80=83?= =?UTF-8?q?=E8=99=91=E7=BC=96=E5=86=99=E8=AF=A6=E7=BB=86=E7=9A=84=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E6=96=87=E6=A1=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CMakeLists.txt | 18 +++++++++++- .../Log.h | 29 +++++++++++++++++++ .../test2.cpp | 13 +++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/Log.h create mode 100644 code/ModernCpp-ConcurrentProgramming-Tutorial/test2.cpp diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt index 7f2eafa3..a007c256 100644 --- a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt @@ -12,7 +12,7 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "C add_compile_options("-finput-charset=UTF-8" "-fexec-charset=UTF-8" "-fopenmp") endif() -add_executable(${PROJECT_NAME} "45原子特化shared_ptr.cpp") +add_executable(${PROJECT_NAME} "test2.cpp") set(SFML_DIR "D:/lib/SFML-2.6.1-windows-vc17-64-bit/SFML-2.6.1/lib/cmake/SFML") find_package(SFML 2.6.1 COMPONENTS system window graphics audio network REQUIRED) @@ -30,3 +30,19 @@ set(Boost_INCLUDE_DIR "D:/vcpkg-master/installed/x64-windows/include") include_directories(${Boost_INCLUDE_DIR}) find_package(Boost REQUIRED COMPONENTS system) target_link_libraries(${PROJECT_NAME} PRIVATE Boost::system) + +target_include_directories(${PROJECT_NAME} PRIVATE "D:/project/cpp-terminal/include") +if(CMAKE_BUILD_TYPE STREQUAL "Release") + target_link_libraries(${PROJECT_NAME} PRIVATE + "D:/project/cpp-terminal/lib/cpp-terminal-private.lib" + "D:/project/cpp-terminal/lib/cpp-terminal.lib" + ) +else() + target_link_libraries(${PROJECT_NAME} PRIVATE + "D:/project/cpp-terminal/lib/private/debug/cpp-terminal-private.lib" + "D:/project/cpp-terminal/lib/debug/cpp-terminal.lib" + ) +endif() + +find_package(spdlog REQUIRED) +target_link_libraries(${PROJECT_NAME} PRIVATE spdlog::spdlog_header_only) diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/Log.h b/code/ModernCpp-ConcurrentProgramming-Tutorial/Log.h new file mode 100644 index 00000000..78e152c3 --- /dev/null +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/Log.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include +#include + +inline void setupLogging() { + auto file_sink = std::make_shared("logs.txt"); + file_sink->set_level(spdlog::level::debug); + file_sink->set_pattern("[%Y-%m-%d %H:%M:%S] [%@] [%!] [thread %t] [%oms] [%l] %v"); + + auto console_sink = std::make_shared(); + console_sink->set_level(spdlog::level::debug); + console_sink->set_pattern("%^[%Y-%m-%d %H:%M:%S] [thread %t] [%oms] [%l] %v%$"); + + auto logger = std::make_shared("multi_sink", spdlog::sinks_init_list{ file_sink, console_sink }); + spdlog::register_logger(logger); + + spdlog::set_default_logger(logger); +} + +// spdlog 要想输出文件、路径、函数、行号,只能借助此宏,才会显示。 +// 其实使用 C++20 std::source_location 也能获取这些信息,后面再考虑单独封装吧,目前这样做导致没办法做格式字符串。 + +#define LOG_INFO(msg, ...) SPDLOG_LOGGER_INFO(spdlog::get("multi_sink"), msg) +#define LOG_WARN(msg, ...) SPDLOG_LOGGER_WARN(spdlog::get("multi_sink"), msg) +#define LOG_ERROR(msg, ...) SPDLOG_LOGGER_ERROR(spdlog::get("multi_sink"), msg) + +const auto init_log = (setupLogging(), 0); diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/test2.cpp b/code/ModernCpp-ConcurrentProgramming-Tutorial/test2.cpp new file mode 100644 index 00000000..b9266883 --- /dev/null +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/test2.cpp @@ -0,0 +1,13 @@ +#include "Log.h" +#include +#include +using namespace std::chrono_literals; + +int main() { + LOG_WARN("😅"); + std::jthread t{[]{ + std::this_thread::sleep_for(100ms); + LOG_ERROR("🤣"); + }}; + LOG_INFO("👉"); +} \ No newline at end of file From c8eca2ab5437a9dc2e3804999c159c390bc5b7ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mq=E7=99=BD?= <3326284481@qq.com> Date: Fri, 1 Nov 2024 19:16:39 +0800 Subject: [PATCH 62/62] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20CMake=20=E5=BA=93?= =?UTF-8?q?=E7=9A=84=E9=85=8D=E7=BD=AE=EF=BC=8C=E6=96=87=E6=A1=A3=E5=8F=82?= =?UTF-8?q?=E8=A7=81=EF=BC=9A=20https://github.com/Mq-b/Loser-HomeWork/blo?= =?UTF-8?q?b/main/src/%E5%8D%A2%E7%91%9F%E6%97%A5%E7%BB%8F/make%E3%80%81cm?= =?UTF-8?q?ake%E3%80%81apt%20%E5%8C%85%E7%AE%A1%E7%90%86%EF%BC%8C%E7%BC%96?= =?UTF-8?q?%E8%AF%91%E9%85%8D%E7%BD%AE%E7%AD%89%E9%97%AE%E9%A2%98.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt index a007c256..94d9567a 100644 --- a/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt +++ b/code/ModernCpp-ConcurrentProgramming-Tutorial/CMakeLists.txt @@ -14,11 +14,11 @@ endif() add_executable(${PROJECT_NAME} "test2.cpp") -set(SFML_DIR "D:/lib/SFML-2.6.1-windows-vc17-64-bit/SFML-2.6.1/lib/cmake/SFML") +set(CMAKE_PREFIX_PATH "D:/lib" CACHE STRING "自定义查找包的安装路径" FORCE) + find_package(SFML 2.6.1 COMPONENTS system window graphics audio network REQUIRED) target_link_libraries(${PROJECT_NAME} PRIVATE sfml-system sfml-window sfml-graphics sfml-audio sfml-network) -set(fmt_DIR "D:/lib/fmt_x64-windows/share/fmt") find_package(fmt CONFIG REQUIRED) target_link_libraries(${PROJECT_NAME} PRIVATE fmt::fmt-header-only)